英語の勉強にアメリカドラマから音声を抜き出して、その中のサイレンス部分を削除したかったのでやり方を調べたらffmpegsoxで簡単にできることがわかったので、その方法を紹介します。

動画から音声を抜き出す

一つの動画から音声を抜き出すときは

ffmpeg -i input.mp4 -vn output.wav

で抜き出せるので

フォルダごとまとめて処理するには

find . -name '*.mp4' -exec ffmpeg -i '{}' -vn '{}'.wav ';'

でフォルダ内の全ての.mp4の動画ファイルから.wavファイルが抜き出されます。-vnno videoのオプションです。

他にも-acodec copy として音声ファイルを変換せずに抜き出すこともできます。

無音部分を自動検出して削除

次に無音部分を自動的に認識して削除するのにsoxを使います。やり方によっては.wav以外も認識するようにできるようなのですが、うちの環境ではできなかったので.wavで処理をしています。

find . -name '*.wav' -exec sox '{}' '{}'_remove_silence.wav silence 1 0.1 1% -1 0.1 1% ';'

で先ほど作った.wavファイルから無音部分が全て削除されました。

wavをm4aに ffmpeg で変換

wavのままだとファイルがでかすぎるのでm4aに変換します。mp3でもいいんですが、m4aの方が圧縮効率がいいのでこちらを使います。

find . -name '*_remove_silence.wav' -exec ffmpeg -i '{}' '{}'.mp3 ';'

以上で変換終了です。

まとめ

この3行を一括変換したいフォルダにcdで移動して実行すればOKです。.wavファイルは手動で削除しときましょう。rm *.wavでもいいですが。

上記は全てcygwin上で行ってますがもちろんLinuxでもMacでも動くはずです。

find . -name '*.mp4' -exec ffmpeg -i '{}' -vn '{}'.wav ';'
find . -name '*.wav' -exec sox '{}' '{}'_remove_silence.wav silence 1 0.1 1% -1 0.1 1% ';'
find . -name '*_remove_silence.wav' -exec ffmpeg -i '{}' '{}'.mp3 ';'

参考

[ffmpeg – How to remove silence part from mp3 that is extracted from tv drama – Unix & Linux Stack Exchange][1]