Open4

音声の途切れ目を計算する

fg450safg450sa

目標

音声ファイルの中に音声が途切れている部分を自動で検出したい。

背景

語学学習などで音声ファイルが付属されている書籍を読んでいる時に、フレーズ単位や文章単位で再生をしたいのに、それよりも大きな塊で1つのファイルとして提供されていることが多く、巻き戻し操作などがやりにくい。

fg450safg450sa

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()

fg450safg450sa

silence_threshの値にどんな値を渡すかで結果が結構変わってくる。