FFmpegは、多数の動画・音声フォーマットを互いに変換できるソフトウェアとしてもっともよく知られているものの1つです。数年前からはメジャーアップデートを繰り返すようになり、様々な機能改善や追加が活発に行われるようになっています。
さて、去る8月22日にFFmpeg 8.0がリリースされました。ここにおいてはVulkanを使用した変換が大きく強化されたことも大きいですが、Whisperによる文字起こし機能も使用できるようになったというところも大きいです。これまで文字起こしをさせるためにはYouTubeにアップロードして付いた自動字幕起こしをいい感じに使うのが手っ取り早かった状況が、少しでも変化するかもしれないという期待があります。
というわけで、Windows環境においてFFmpeg 8.0で使用可能となったOpenAIのWhisperモデルを用いた文字起こしをやっていこうかと思います。日本語情報があまりなく若干困ったことをまとめたような、結果としてまとまりのない記事になる気がしますが、何かの役に立てば幸いです。
結論
- 実は
whisper.cpp
ライブラリのビルドしたものはGitHubに存在している - 公式ドキュメントを読み込むのがやっぱり強い
- 文字起こしの労力が省けて便利かもしれない
最初に使えるかどうかを確認
まず初めに、FFmpeg 8.0をインストールします。ここにおいて注意するべき点としてはビルドオプションに--enable-whisper
が付いているかどうかを確認することです。ソースからビルドした方は自分で確認すればよいのですが、既にビルドしたものを導入した方は適当なターミナルにおいてffmpeg -version
を実行して適切なビルドオプションがあるかどうかを確認してください。
ご存じの通り、FFmpegはビルドオプションを設定することで使える機能を変えることが出来ます。例えばgyan.devでビルドされているものはこういったような表示となります。
ffmpeg -version
ffmpeg version 8.0-full_build-www.gyan.dev Copyright (c) 2000-2025 the FFmpeg developers
built with gcc 15.2.0 (Rev8, Built by MSYS2 project)
configuration: --enable-gpl --enable-version3 --enable-static --disable-w32threads --disable-autodetect --enable-fontconfig --enable-iconv --enable-gnutls --enable-lcms2 --enable-libxml2 --enable-gmp --enable-bzlib --enable-lzma --enable-libsnappy --enable-zlib --enable-librist --enable-libsrt --enable-libssh --enable-libzmq --enable-avisynth --enable-libbluray --enable-libcaca --enable-libdvdnav --enable-libdvdread --enable-sdl2 --enable-libaribb24 --enable-libaribcaption --enable-libdav1d --enable-libdavs2 --enable-libopenjpeg --enable-libquirc --enable-libuavs3d --enable-libxevd --enable-libzvbi --enable-liboapv --enable-libqrencode --enable-librav1e --enable-libsvtav1 --enable-libvvenc --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxavs2 --enable-libxeve --enable-libxvid --enable-libaom --enable-libjxl --enable-libvpx --enable-mediafoundation --enable-libass --enable-frei0r --enable-libfreetype --enable-libfribidi --enable-libharfbuzz --enable-liblensfun --enable-libvidstab --enable-libvmaf --enable-libzimg --enable-amf --enable-cuda-llvm --enable-cuvid --enable-dxva2 --enable-d3d11va --enable-d3d12va --enable-ffnvcodec --enable-libvpl --enable-nvdec --enable-nvenc --enable-vaapi --enable-libshaderc --enable-vulkan --enable-libplacebo --enable-opencl --enable-libcdio --enable-openal --enable-libgme --enable-libmodplug --enable-libopenmpt --enable-libopencore-amrwb --enable-libmp3lame --enable-libshine --enable-libtheora --enable-libtwolame --enable-libvo-amrwbenc --enable-libcodec2 --enable-libilbc --enable-libgsm --enable-liblc3 --enable-libopencore-amrnb --enable-libopus --enable-libspeex --enable-libvorbis --enable-ladspa --enable-libbs2b --enable-libflite --enable-libmysofa --enable-librubberband --enable-libsoxr --enable-chromaprint --enable-whisper
libavutil 60. 8.100 / 60. 8.100
libavcodec 62. 11.100 / 62. 11.100
libavformat 62. 3.100 / 62. 3.100
libavdevice 62. 1.100 / 62. 1.100
libavfilter 11. 4.100 / 11. 4.100
libswscale 9. 1.100 / 9. 1.100
libswresample 6. 1.100 / 6. 1.100
Exiting with exit code 0
ビルドオプションの最後の方に--enable-whisper
が付いていることが確認できます。これが--disable-whisper
のようになっていたりそもそも明示的に記されていなかったりすると使えない可能性があります。このように、Whisperをそもそも使えるようなビルドをしているかどうかを確認することで、余計なトラブルを心配することなく次のステップへと進めます。
whisper.cppのインストール
では--enable-whisper
が付いているからといって、すぐさまWhisperを使った文字起こしが出来るかというとそうではありません。FFmpegの公式ドキュメントを見ると以下のようなことが書かれています。
It requires the whisper.cpp library (https://github.com/ggml-org/whisper.cpp) as a prerequisite. After installing the library it can be enabled using: ./configure --enable-whisper.
すなわち「whisper.cppライブラリが必要で、ライブラリが入った後で--enable-whisper
を設定すると使えるよ」というわけです。これだけ読むと自分の環境にwhisper.cppをインストールする必要はないように聞こえますが、実際に使用する際にWhisperモデルの所在を聞かれるためwhisper.cppライブラリが手元にあった方が便利です。モデルだけをダウンロードして使うこともできますが、その場合においてはwhisper-cli
という強力なCLIツールが使えません。というわけでwhisper.cppをインストールしていきましょう。
whisper.cppライブラリというのはOpenAIが公開したオリジナルのWhisper(Pythonで書かれています)をC++へと移植したもので、速度などの点で有利だとされています。主要なPC向けOSの他なぜかAndroidやWASMにまで対応しているらしいです。
whisper.cppライブラリのREADME通りに設定していけば問題ないと言えば問題ないのですが、Windows環境でwhisper.cppをビルドするためにはMSVC及びMinGWを要求されます。このうちMinGWは用意するのが地味に面倒なため、手元でビルドするのは避けたいような気もします。手元でビルドしてみたい方は先人が書かれたこちらの記事をご参照ください。私は面倒なので別の手段を取ることにしました。
実はwhisper.cppにおいてはリリース時にGitHub Actionsで種々のビルドを行っており、リリース一覧の各バージョンの下部においてそのZIPファイルをダウンロードすることが可能です。ここにおいては先述のビルド作業によって手に入る大半のものが含まれており、手元でごちゃごちゃする手間を大幅に省くことが出来ます。適切な場所に展開し環境変数に追加する(パスを通す)作業を行っておくと便利です。
次にモデルをダウンロードします。models/README.mdを見ると、基本的には手元でビルドしその後モデルをダウンロードすることとなっておりますが、別に手作業でダウンロードしても動くということです。HuggingFace上からダウンロード可能ということで、手作業で適当にダウンロードし、いい感じの場所に配置しておきましょう。HuggingFace上にはtinyからlargeといった種々のモデルに加えて、量子化されたモデルもありますのでハードウェアと相談しながら適切なモデルを落としてみるとよいかと思います。
FFmpegでWhisper使って文字起こし
これでFFmpegにおいてWhisperを用いた文字起こしをすることが出来るようになりました。ではFFmpegの公式ドキュメントを参考にして進めていきましょう。
ffmpeg -i input.mp4 -vn -af "whisper=model={モデルの場所}:language=ja:destination=output.srt:format=srt" -f null -
注意するべき点としては、モデルの場所を指定する際、コロンをバックスラッシュ2つを用いてエスケープする必要があるところでしょうか。エクスプローラーからそのまま「パスをコピー」するとコロンがコロンのままついてきてしまうので、絶対パスを使用する場合は特に注意する必要があるかと思います。例えばC:/
から始まる場合はC\\:/
とする必要があります。私はこれを忘れて5分くらいを無駄にしてしまいました。[AVFilterGraph @ 000001fe96004f00] No option name near
みたいなエラーや[AVFilterGraph @ 000001fe96004f00] Error parsing filterchain
みたいなエラーが出ている場合はこれを疑ってみてください。
コマンドの実行中においては3秒ごと(queue
オプションによって変更可能、これによってキューに入れられる秒数も変化します)に情報が更新されます。ここにおいては他のFFmpegを用いた処理と同様にその速度が出ますので、処理にかかる時間の参考とすることが可能です。私の環境ではlargeモデルにおいても2倍以上の速度で実行することが出来ましたし、baseを用いた際においては4倍以上の速度で実行することが出来ました。そのためリアルタイム処理を行ったとしても十分に間に合うかと思います。
このコマンドにおいてはSRT形式で出力していますが、単純なテキスト形式とJSON形式でも出力することが可能です。必要に応じて選択してください。ただ、一旦処理した後に再度WebVTT形式に変換することなども容易なので、基本的にSRT形式で出力するのがよいかと思います。なお、whisper.cppのドキュメントにおいてはカラオケ形式での字幕を生成することが出来る(-owts
オプション)とのことですが、現状FFmpeg側のオプションにおいて対応していませんでしたので、今後の対応を期待したいです。
文字起こしの評価については人それぞれなので割愛しますが、めちゃくちゃな文字起こしをしてしまうような印象はなかったものの一部文字化けが見受けられました。そこら辺のパソコンでもsmallモデルは動くと思うので、文字起こしの性能について気になる方は試してみるとよいかと思います。
最後に
FFmpegのWhisperフィルターによって、本家Whisperを導入し音声ファイルをわざわざ16000HzのWAVファイルに変換して文字起こしをしなくとも、若干透過的に文字起こしをすることが出来るようになりました。実際わざわざ変換して文字起こしをさせるのは面倒であったことに加えて、FFmpegのストリーム機能を活用してリアルタイムで文字起こしをすることが出来ると考えると使い道が広がるかと思います。
かなり怠惰な方法を紹介してしまいましたが、きちんとGPUを使って高速化したりファインチューニングをしてもっとモデルをより良いものにしたりすることが一応可能となっています。そのようにしたい方はこんな記事よりも先人の書かれた記事を参考にしてWhisper.cppの導入をしていただければ、先述の恩恵を受けることが出来ますので検討していただけますと幸いです。