본문 바로가기
Python

pydub - wav를 추출하여 묵음 제거 후 시간을 잘라서 저장해보자.

by 모닝위즈 2022. 5. 13.
반응형

pydub는 ffmpeg에 의존한다.

apt install -y ffmpeg

pydub도 설치를 한다.

pydub는 pip로 설치를 하는 방법과 git clone을 통해 설치하는 방법, zip파일을 다운받아서 설치하는 방법이 있는데.

pip install pydub

or

git clone https://github.com/jiaaro/pydub.git

 

pip install pydub를 활용하려니 pycharm에 python3.7의 경우 해당 모듈을 찾을 수 없다고하여, 

git을 통하여 설치하고 프로젝트안에 넣어버렸다.

 

전반적인 설치방법이나 기본 가이드는 아래의 URL에서 확인이 가능하다.

 

GitHub - jiaaro/pydub: Manipulate audio with a simple and easy high level interface

 

GitHub - jiaaro/pydub: Manipulate audio with a simple and easy high level interface

Manipulate audio with a simple and easy high level interface - GitHub - jiaaro/pydub: Manipulate audio with a simple and easy high level interface

github.com

 

def make_wav(wav_file_name):
    my_wav = AudioSegment.from_wav(wav_file_name)
    # wav의 재생 시간을 확인
    wav_len = my_wav.duration_seconds * 1000
    if wav_len > 0.0:
        # 진폭의 평균 제곱근 GET
        average_loudness = my_wav.rms
        # 진폭의 평균 값보다 30 데시벨 더 작은 진폭은 묵음으로 간주하자.
        silence_threshold = average_loudness * db_to_float(-30)
        # 묵음으로 간주된 부분을 필터 처리하여, 그 이상의 값만 담는다.
        podcast_parts = (ms for ms in my_wav if ms.rms > silence_threshold)
        # 모든 chunks를 재결합
        my_wav = reduce(lambda a, b: a + b, podcast_parts)

        # 시간을 줄여보자. 
        # (목적은 파일의 중간을 기준으로 앞뒤 1.5초씩하여 총 3초의 시간을 보여준다.
        wav_len = my_wav.duration_seconds * 1000
        # print('묵음 필터 wav_len : ', wav_len)
        avg_len = wav_len / 2
        if avg_len > (max_time * 1000):
            start_duration = avg_len - ((max_time * 1000) / 2)
            end_duration = avg_len + ((max_time * 1000) / 2)
        else:
            start_duration = 0
            end_duration = wav_len

        # print('묵음 필터 avg_len : ', avg_len)
        # print('묵음 필터 start_duration : ', start_duration)
        # print('묵음 필터 end_duration : ', end_duration)

        my_wav = my_wav[start_duration:end_duration]

        # 위 묵음 필터 처리 후 재결합 된 chunks를 wav로 저장 한다.
        # prefix를 filled_로 설정
        my_wav.export('filled_' + wav_file_name, format="wav")
        
    else:
    	# 빈 파일일 때, pefix를 empty_로 설정
        my_wav.export('empty_' + wav_file_name, format="wav")

 

그러면 기존 wav가 voice.wav일 경우,

빈 wav라면 empty_voice.wav, 그렇지 않은 wav라면 filled_voice.wav로 저장되는 make_wav 함수를 생성해 보았다.

 

reduce를 사용할 때, import를 해줘야하지만 안해줘도 되는 파이썬 버전이 있음.

from functools import reduce

 

 

나는 사일런스하게 밥을 잘 묵음.ㅋ

댓글