Pythonで音声ファイルを分割する
Pythonでは、pydubとpydub.silenceを使用して音声ファイルを無音位置で分割できます。
インストール
pydubをインストールします。
pip install pydub
また、実行にはffmpegが必要です。インストールしていない場合はインストールしてください。
sudo apt update
sudo apt install ffmpeg
使用方法
from pydub import AudioSegment
from pydub.silence import split_on_silence
def split_audio(input_file_path, output_dir_path):
# read audio file
audio = AudioSegment.from_file(input_file_path)
# split file when point of silence
segments = split_on_silence(audio, silence_thresh=-40)
for i, segment in enumerate(segments):
segment.export(f"{output_dir_path}/file_{i+1}.wav", format="wav")
#;
split_audio("./wav/hello.m4a", "./wav")
silence_thresh
は無音とみなす閾値です。上記では、-40dB(デシベル)以下の音を無音とみなしています。デフォルトは-16dBです。
出力フォーマット
他にも指定可能のようですが、私の環境では、以下の指定が可能でした。
- wav
- mp3
- ogg
ビットレート指定
export()
メソッドのパラメータにビットレートを指定できます。
segment.export(f"{output_dir_path}/file_{i+1}.mp3", format="mp3", bitrate="192k")
最低無音時間の設定
split_on_silence()
のパラメータに無音時間の閾値(無音とみなす最小の無音時間)をmin_silence_len
で設定できます。この時間より短い無音は無視されます。単位はミリ秒です。デフォルトは1秒です。
次の例では、2秒間無音と判定された場合のみ分割します。
split_on_silence(audio, silence_thresh=-42, min_silence_len=2000)
探索精度
split_on_silence()
のパラメータseek_step
で無音時間を探索する際の探索精度を設定できます。単位はミリ秒でデフォルトは1ミリ秒です。この値が細かいと処理に時間がかかります。
split_on_silence(audio, silence_thresh=-42, seek_step=10)