Open4
音声の途切れ目を計算する
目標
音声ファイルの中に音声が途切れている部分を自動で検出したい。
背景
語学学習などで音声ファイルが付属されている書籍を読んでいる時に、フレーズ単位や文章単位で再生をしたいのに、それよりも大きな塊で1つのファイルとして提供されていることが多く、巻き戻し操作などがやりにくい。
pydubの中にdetect_silence
というメソッドが提供されている。
splitまでしてくれる関数もある。(split_on_silence
)
pydubを使うと結構簡単に分割処理が実装できる
import argparse
import os
import shutil
from pydub import AudioSegment, silence
def parse_args():
parser = argparse.ArgumentParser()
parser.add_argument("input_file", type=str, help="input audio file")
parser.add_argument(
"-o",
"--output_dir",
type=str,
help="directory to save split audio file",
default="output",
)
args = parser.parse_args()
return args
def main():
args = parse_args()
audio = AudioSegment.from_file(args.input_file)
# silence_threshの値でsplitのされ方が大きく変わる
audio_pieces = silence.split_on_silence(
audio, min_silence_len=100, silence_thresh=-50, keep_silence=100
)
shutil.rmtree(args.output_dir, ignore_errors=True)
os.makedirs(args.output_dir, exist_ok=True)
for piece_idx, audio_piece in enumerate(audio_pieces):
filename, ext = os.path.splitext(os.path.basename(args.input_file))
save_path = os.path.join(args.output_dir, f"{filename}-{piece_idx+1}" + ext)
audio_piece.export(save_path)
if __name__ == "__main__":
main()
silence_thresh
の値にどんな値を渡すかで結果が結構変わってくる。