英語の勉強にアメリカドラマから音声を抜き出して、その中のサイレンス部分を削除したかったのでやり方を調べたらffmpegとsoxで簡単にできることがわかったので、その方法を紹介します。
動画から音声を抜き出す 一つの動画から音声を抜き出すときは
ffmpeg -i input.mp4 -vn output.wav で抜き出せるので
フォルダごとまとめて処理するには
find . -name '*.mp4' -exec ffmpeg -i '{}' -vn '{}'.wav ';' でフォルダ内の全ての.mp4の動画ファイルから.wavファイルが抜き出されます。-vnが no 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]
...