ffmpegを使って無音部分でwavファイルを分割する

最近AIにナレーションを生成してもらうことが増えたのですが、動画編集のときに音声ファイルが分割されていたほうがうれしいので、ffmpegを使って無音部分で分割してみました。

ソースコード

split_wav.py
import subprocess
import re
import os
import sys

def split_audio_at_silence_center():
# 1. コマンドライン引数のチェック
if len(sys.argv) < 2:
print("使用法: python script.py <入力ファイル名>")
sys.exit(1)

input_file = sys.argv[1].strip()

# 2. ファイルの存在確認
if not os.path.exists(input_file):
print(f"エラー: ファイル '{input_file}' が見つかりません。")
sys.exit(1)

# パラメータ設定
silence_threshold = -30 # dB
silence_duration = 0.5 # 秒

print(f"解析中: {input_file} ...")

# 3. 無音部分の検出
detect_command = [
"ffmpeg", "-i", input_file,
"-af", f"silencedetect=n={silence_threshold}dB:d={silence_duration}",
"-f", "null", "-"
]

process = subprocess.run(detect_command, stderr=subprocess.PIPE, text=True)
output = process.stderr

# 4. 無音の開始点と終了点を両方抽出
# silence_start: 10.123 ... silence_end: 11.123 のペアを探す
starts = re.findall(r"silence_start: ([\d\.]+)", output)
ends = re.findall(r"silence_end: ([\d\.]+)", output)

if not starts or not ends:
print("十分な無音部分は検出されませんでした。")
return

# 5. 中間点の計算
# 各無音区間の中央値を分割ポイントとする
split_points_list = []
for s, e in zip(starts, ends):
center = (float(s) + float(e)) / 2
split_points_list.append(f"{center:.3f}")

split_points = ",".join(split_points_list)

# 6. 分割実行
base_name = os.path.splitext(input_file)[0]
output_pattern = f"{base_name}_part_%03d.wav"

split_command = [
"ffmpeg", "-y", "-i", input_file,
"-f", "segment",
"-segment_times", split_points,
"-c", "copy",
output_pattern
]

result = subprocess.run(split_command)

if result.returncode == 0:
print("-" * 30)
print(f"完了! {len(split_points_list) + 1}個のファイルに分割されました。")
print(f"分割ポイント(秒): {', '.join(split_points_list)}")
else:
print("分割処理中にエラーが発生しました。")

if __name__ == "__main__":
split_audio_at_silence_center()

最終更新: