pydub.split_on_silence を使ってm4a,mp3,wavの無音部分を削除する

音声ファイルから無音部分をトリミングして保存するプログラムを書きました。

実装方法

pydubというライブラリを使います。 silencesplit_on_silenceという( str.split() のような)無音部分を削除する関数が用意されています。

ソースコード

recording-file.m4aというファイルから無音部分を削除してsilence_removed_-20.mp3などの名前で保存するプログラムです。

from pydub import AudioSegment
from pydub.silence import split_on_silence

SOURCE_FILE =  'recording-file.m4a'

sound = AudioSegment.from_file(SOURCE_FILE)

org_ms = len(sound)
print('original: {:.2f} [min]'.format(org_ms/60/1000))

for silence_thresh in range(-20, -60, -5):
    chunks = split_on_silence(sound, min_silence_len=100, silence_thresh=silence_thresh, keep_silence=100)
    if not chunks:
        continue
    cutted_sound = sum(chunks)
    cutted_ms = len(cutted_sound)
    print('silence_thresh = {}: {:.2f} [min]'.format(silence_thresh, cutted_ms/60/1000))
    cutted_sound.export('silence_removed_{}.mp3'.format(silence_thresh), format='mp3')

もともとがGoogle Pixelのレコードで録音したデータで試してみました。 無音のしきい値によって残る部分の時間は下記のとおりでした。耳で聞いた所しきい値は-35くらいがちょうど良いと感じました。

original: 35.37 [min]
silence_thresh = -20: 2.10 [min]
silence_thresh = -25: 5.58 [min]
silence_thresh = -30: 8.95 [min]
silence_thresh = -35: 11.40 [min]
silence_thresh = -40: 13.16 [min]
silence_thresh = -45: 15.91 [min]
silence_thresh = -50: 20.34 [min]
silence_thresh = -55: 25.17 [min]

real    5m56.119s
user    5m44.925s
sys     0m13.276s