Copy & Paste Engineer

2025/7/15

ffmpeg+SoX×Python:ノイズキャンセリングパイプラインの作り方

はじめに

ノイズキャンセリングは、マイク特有のハムノイズや環境音を低減し、クリアな音声を得るための技術です。単体のツールだけでは対応が難しい場合もありますが、ffmpeg のFFTベースノイズ除去フィルタと、SoX の詳細なプロファイル除去・ダイナミックレンジ圧縮を組み合わせることで、より高品質な結果を得られます。


前提条件と環境構築

Ubuntu/Debian 系でのインストール例:

sudo apt update
sudo apt install ffmpeg sox

Python側は標準ライブラリのみで動作可能です。


パイプラインの全体像


ステップ詳細解説

ffmpeg によるフィルタ処理

ffmpeg_filters = [
    "afftdn",                                     # FFTベースのノイズ除去
    "equalizer=f=1500:t=q:w=1:g=3",               # 1.5kHz 帯域のゲイン調整
    "silenceremove=stop_periods=-1:stop_duration=1:stop_threshold=-50dB",  # 無音トリム
    "agate",                                      # ゲート処理
]
subprocess.run(
    ["ffmpeg", "-y", "-i", str(audio_path),
     "-af", ",".join(ffmpeg_filters),
     str(temp_ffmpeg_output)],
    check=True, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL
)

equalizer フィルタの各パラメータ解説


このように、equalizer=f=1500:t=q:w=1:g=3 は「1.5 kHz 帯を Q=1 で広めに取りつつ +3 dB 持ち上げる」設定です。録音環境やマイク特性に合わせて、中心周波数(f)や帯域幅(w)・ゲイン(g)を調整してください。

SoX によるノイズプロファイル作成と除去

sox <入力ファイ> -n trim 0 0.2 noiseprof noise.prof
sox <入力ファイ> <出力ファイ> noisered noise.prof 0.21

SoX によるダイナミックレンジ圧縮(compand)

sox <入力ファイ> <出力ファイ> compand 0.3,1 6:-70,-60,-20 -5 -90 0.2

これらの値はあくまでも「音声を聞き取りやすくする」ための一例です。録音環境や素材の特徴に合わせて以下のように調整してください。

これらを詰めていくことで、よりクリアで自然なノイズキャンセリング結果が得られます。