FFmpeg 8.0で文字起こしができるようになるんだってさ

FFmpeg 8.0で文字起こしができるようになるんだってさ
Photo by Aaron Burden / Unsplash

この前Whisperでの文字起こしをするために試行錯誤する記事を書いたばかり。

AIを使って寝てる間に文字起こしをしてもらいたい!
文字起こしをAIにやらせることができたらいいなあと思い立ち、とにかくやってみた。 私のラップトップはLenovoの「ThinkBook 16p G2 ACH Laptop - Type 20YM」。詳細スペックはこんな感じ。 構成 ハードウェア構成 * CPU: AMD Ryzen 7 5800H (3.20 GHz、8コア16スレッド) * GPU: NVIDIA GeForce RTX 3060 Laptop GPU (6GB VRAM) * メモリ: 40GB DDR4-3200 ※標準16GBから増設済み * ストレージ: 512GB SSD PCIe ソフトウェア環境 * OS: Windows 11 Pro (64bit) * バージョン: 24H2 パフォーマンス的なお話 このスペックでは、

まさか、FFmpegで文字起こし機能が直接使えるようになるっぽい。

ソースコードを見ると、OpenAI謹製のWhisperではなく、C++で書き直されたwhisper.cppライブラリが使用されていますね。元祖Whsperに比べて高速に処理ができそう。

というか、面倒だった環境構築がいらなくなりそうだね。PyTorchは依存関係にうるさくて、バージョン管理が面倒だったのだけれど、whisper.cppさえ入れておけば、あとはFFmpegのほうで指定するだけでうまいこと動くことになりそう!ワクワク!

FFmpegのメーリングリストみててびっくり!

いろいろ記事で取り上げられていたこともあって、2025年7月、FFmpegの開発メーリングリストに投稿されたパッチを見てみました。

重い腰を上げて作ってみたWhisperの文字起こし環境がいらなくなるみたい。

Whisper.csppよる文字起こし機能をFFmpegのフィルター機能として統合するみたいで、使うまでのステップが劇的に簡素化されそう。

出典情報

主要ソース

  • FFmpeg開発メーリングリスト: [PATCH] Whisper audio filter(2025年7月9日投稿)
  • 投稿者: Vittorio Palmisano氏
[FFmpeg-devel] [PATCH] Whisper audio filter

参考記事

  • Vittorio Palmisano氏による解説記事(Medium)
Run Whisper audio transcriptions with one FFmpeg command
Introduction

技術的な実装をチラッと見てみる

採用されたライブラリについて

ソースコードを見ると、FFmpegに統合されるのはOpenAI謹製のPython版Whisperではなく、whisper.cppのほうであるのがわかるね。

#include "whisper.h"  // whisper.cppのヘッダファイル

struct whisper_context *ctx_wsp;
struct whisper_state *whisper_state;

whisper.cppはC++で書き直されたWhisperの実装で、元のPython版と比較して3〜10倍の高速化を実現しているっぽいです。同じ精度ならそりゃあ速いほうがいいよね。しかもGPUなしで高速に動作するんだってさ。

GitHub - ggml-org/whisper.cpp: Port of OpenAI’s Whisper model in C/C++
Port of OpenAI’s Whisper model in C/C++. Contribute to ggml-org/whisper.cpp development by creating an account on GitHub.

ビルド設定も見てみる

configureスクリプトに追加されたオプションを見ると、どんな感じで統合されていてどんな感じで使うのかなあと雰囲気だけ知れます。

--enable-whisper enable whisper filter [no]

この設定から、FFmpegのビルド時にWhisper機能を有効化できるようですね。ソースコードの依存関係設定では以下のように定義されています。

whisper_filter_deps="whisper"
enabled whisper && require_pkg_config whisper "whisper >= 1.7.5" whisper.h whisper_init_from_file_with_params

whisper.cppライブラリのバージョン1.7.5以上が必要で、pkg-configを通じて自動的に依存関係が解決される仕組みになっていますね。

フィルターの詳細機能解説

基本的なパラメータ構成

新しく追加されたaf_whisper.cファイルには、いろいろな設定オプションが定義されました。

パラメータ デフォルト値 説明
model STRING - whisper.cppモデルファイルのパス(必須)
language STRING "auto" 言語指定(自動検出も可能)
queue INT 3000 音声バッファサイズ(ミリ秒)
use_gpu BOOL true GPU使用の有効化
gpu_device INT 0 使用するGPUデバイス番号
destination STRING "" 出力先(ファイル、URL、標準出力)
format STRING "text" 出力フォーマット(text/srt/json)

VAD(Voice Activity Detection)の高度な統合

これは便利だろうなと思ったのが、Silero VADモデルとの統合ですよ。音声認識システム自体は音声があるのかどうかを識別できないので、BGMなんかを必死に文字お越ししようと頑張ってくれるのだよね。BGMならまだしも無音区間を一生懸命認識したって時間が無駄なので、無音区間はスキップしてくれるよって機能だと思う。効率的。

VADパラメータ デフォルト値 説明
vad_model STRING - VADモデルファイルのパス
vad_threshold FLOAT 0.5 音声検出の閾値(0.0-1.0)
vad_min_speech_duration INT 50 最小音声継続時間(ミリ秒)
vad_min_silence_duration INT 500 最小無音継続時間(ミリ秒)

実際、当該ソースコードの実装を見ると、VAD機能でWhisperの処理効率を向上させる仕組みなんだなあってわかります。

struct whisper_vad_segments *segments = whisper_vad_segments_from_samples(
    wctx->ctx_vad, wctx->vad_params, wctx->audio_buffer, wctx->audio_buffer_fill_size);

さっきも言った通り、この機能によって音声が含まれる区間のみを処理し、無音部分をスキップすることで効率的に処理が進むようになります。

処理フローの技術的詳細についてちょこっと

音声データの前処理要件

ソースコードから、Whisperフィルターが要求する音声形式についても見てみましょう。

FILTER_SAMPLEFMTS(AV_SAMPLE_FMT_FLT, AV_SAMPLE_FMT_FLTP)

このフィルターは32ビット浮動小数点形式(FLT/FLTP)の音声データのみを受け付けます。また、Whisperの仕様により16kHzのサンプリングレートとモノラルチャンネルが必要です。

出力フォーマットについて

FFmpegなので当然実装されている出力フォーマットはいろいろ選べて、超実用的。

SRT形式の出力例

buf = av_asprintf("%d\n%02ld:%02ld:%02ld.%03ld --> %02ld:%02ld:%02ld.%03ld\n%s\n\n",
                  wctx->index,
                  start_t / 3600000, (start_t / 60000) % 60, (start_t / 1000) % 60, start_t % 1000,
                  end_t / 3600000, (end_t / 60000) % 60, (end_t / 1000) % 60, end_t % 1000,
                  text_cleaned);

JSON形式の出力例

buf = av_asprintf("{\"start\":%ld,\"end\":%ld,\"text\":\"%s\",\"turn\":%s}\n",
                  start_t, end_t, text_cleaned, turn ? "true" : "false");

従来の実装との比較分析

環境構築の複雑さの解消

従来のWhisper環境構築で必要だった手順と新しい統合版を比較してみましょう。

私がやってた従来のPython版Whisperセットアップ(複雑)
  1. Python環境の準備
    • Anacondaまたは仮想環境の構築
    • Python 3.8以上の確認
  2. GPU関連の複雑な設定
    • CUDAツールキットのインストール
    • nvidia-smiでの対応バージョン確認
    • cuDNNライブラリの手動設定
  3. PyTorchの慎重なインストール
    • CUDA版PyTorchの正確なバージョン選択
    • 依存関係の手動解決
  4. Whisperライブラリの導入
    • OpenAI Whisperパッケージのインストール
    • モデルファイルの個別ダウンロード
新しいFFmpeg統合版(簡単!たぶん)

即座に実行可能

ffmpeg -i input.wav -af "whisper=model=ggml-base.bin" output.srt

モデルファイルの準備

# whisper.cppからモデルをダウンロード
wget https://huggingface.co/ggml-org/whisper.cpp/resolve/main/ggml-base.bin

ビルド時の簡単な設定

./configure --enable-whisper
make && make install

パフォーマンスの大幅改善

whisper.cppの採用により実現される性能向上について、技術的な背景を解説します。

メモリ使用量の最適化

C++実装により、Pythonインタープリターのオーバーヘッドが完全に排除されます。また、whisper.cppは量子化技術を活用して、モデルサイズを大幅に削減しています。

並列処理の効率化

ソースコードに見られるGPU処理の実装もあったので、CPUだけでなくGPUのCUDAを使って高速に処理することも考えられていますね。

struct whisper_context_params params = whisper_context_default_params();
params.use_gpu = wctx->use_gpu;
params.gpu_device = wctx->gpu_device;

実践的な使用例とその解説

多分こんな感じで使えるようになるんじゃないかなあっていう。

基本的な動画からの文字起こし

ffmpeg -i presentation.mp4 -vn \
  -af "aformat=sample_rates=16000:channel_layouts=mono,whisper=model=./ggml-base.en.bin:language=en:destination=transcript.srt:format=srt" \
  -f null -

このコマンドの各部分を詳しく解説します。

  • -vn: 動画ストリームを無効化(音声のみ処理)
  • aformat=sample_rates=16000:channel_layouts=mono: Whisperが要求する音声形式に変換
  • whisper=model=./ggml-base.en.bin: whisper.cppモデルファイルを指定
  • language=en: 英語として処理
  • destination=transcript.srt: SRT形式で出力
  • -f null -: 音声出力は破棄(文字起こしのみが目的)

リアルタイム文字起こしの実現

ffmpeg -f alsa -i hw:0 \
  -af 'highpass=f=200,lowpass=f=3000,aformat=sample_rates=16000:channel_layouts=mono,whisper=model=./ggml-medium.bin:language=ja:queue=10000:destination=-:format=json:vad_model=./ggml-silero-v5.1.2.bin' \
  -f null -

こんな感じで処理ができるかなあと。

  1. 音声フィルタリング: ハイパス(200Hz)とローパス(3000Hz)フィルターで会話部分を強調
  2. 拡張バッファ: 10秒間のキューで長い発話にも対応
  3. VAD統合: Sileroモデルで音声区間を自動検出
  4. 標準出力: リアルタイムでJSON形式の結果を出力

まとめ

FFmpeg 8.0はwhisper.cppを採用して統合するようですね。複雑な環境構築から解放されそうなのがうれしい。それに高速で軽量な文字起こし処理が実現できるなら本当にいろいろな場面で有効活用できそうです。

現在の開発状況から、FFmpeg 8.0は2025年8月中のリリースが予定されています。

8月のリリースが待ち遠しいですねえ。


本記事は2025年7月のFFmpeg開発メーリングリストに投稿されたパッチコードを雰囲気で分析しているだけです。実際のリリース版では仕様が変更される可能性があります。

Read more

北海道登别温泉游记:在"地狱"中寻找人间仙境

北海道登别温泉游记:在"地狱"中寻找人间仙境

"山中何所有?岭上多白云。"初到登别,我便想起了陶弘景的这句诗。只是这里的白云,不是飘在岭上,而是从地底升腾而起,氤氲缭绕,如梦如幻。 这座被誉为"温泉百货公司"的小镇,藏着日本11种温泉泉质中的9种——这样的天赐恩泽,即便放眼全球也是凤毛麟角。 初识登别 从新千岁机场出发,我选择了最便捷的直达巴士。窗外的北海道风光如画卷般展开,大约一个多小时,登别温泉的牌坊便出现在眼前。若是从札幌出发,JR北海道的特快列车也是不错的选择,在登别站下车后转乘巴士,很快就能抵达温泉街。 温泉旅宿 百年老店第一滝本馆 在第一滝本馆的大厅里,放置着一根高九米、重达十吨的镀金大金棒,赫然入目气势非凡。这家创立于1858年的老字号温泉旅馆,背后有着一段动人的故事。 创始人滝本金藏的妻子曾患皮肤病,在登别温泉很快痊愈。这神奇的疗效让滝本先生当即决定在此建造温泉旅馆,让更多人享受温泉的恩泽。166年过去了,这份初心依然在每一滴温泉水中流淌。 在大浴场里,5种不同泉质的温泉水各有其妙。这里采用"放流式"——温泉水直接从源头流入,

By Sakashita Yasunobu
曾经的"北方华尔街"小樽深度游记

曾经的"北方华尔街"小樽深度游记

从JR札幌站出发前往小樽,短短32分钟的车程。窗外的风景从现代都市逐渐过渡到怀旧小镇,我的心情也渐渐从都市的喧嚣中沉静下来。电车沿着海岸线驶向小樽,这座曾经被称之为"北方华尔街"的小城。 列车在小樽站停靠,随着人群我走出月台。 如果你像我一样是个喜欢深度体验的旅行者,不妨考虑在KITARINN租一辆电动脚踏车。小樽的坡道不少,电动车会让你的探索之旅轻松很多。我来到站前叫KITARINN自行车租赁(这里还提供行李寄存服务),我们租到一辆电动自行车。老板娘是个热情的人,她用简单的中文跟我们打招呼。 如果您带着孩子或者长辈同行,可以步行两分钟直接前往旁的中央巴士总站。这里的巴士线路四通八达,不仅可以到达市内各个景点,还能前往积丹、札幌、余市等地。对于行程紧凑的游客来说,这无疑是最省力的选择。 华尔街的金色记忆 大约骑行五分钟左右,我便来到了色内街。这里曾经是小樽金融业的心脏,虽然昔日的荣华繁华不再,但那些石制建筑如同这座城市历史的守望者依然威严挺拔。 首先似鸟美术馆映入眼帘时,我被那典雅的建筑风格深深震撼。这座原北海道拓殖银行小樽支店的建筑,见证了《蟹工船》作者小林多喜二的青春

By Sakashita Yasunobu
指宿沙蒸温泉游记

指宿沙蒸温泉游记

玉手箱列车开启指宿之旅 前往沙蒸温泉胜地指宿是我两个月前就开始酝酿的计划,特意选择了乘坐传说中的特急玉手箱号观光列车。说到"玉手箱"的由来,就不能不提及那个在日本家喻户晓、记载在《日本书纪》和《丹后国风土记》中的古老传说。 善良的渔夫浦岛太郎救了一只海龟,被邀请到龙宫做客。在那里,他与美丽的乙姬公主一见钟情,在如梦似幻的海底世界度过了三年时光。当思母之情涌上心头,决定返回人间时,乙姬公主送给他一个精美的玉手箱,千叮咛万嘱咐切不可打开。然而,当浦岛太郎回到故乡,却发现人间已过三百年,熟悉的一切都已不复存在。无比悲痛的他违背了诺言,打开了那个神秘的玉手箱,瞬间从青壮少年变成了白发苍苍的老翁。 据说设计师水户冈锐治正是从浦岛太郎打开玉手箱的瞬间中汲取了灵感。当我亲眼看到指宿玉手箱列车那黑白相间的车身设计,看到停靠时从车顶喷出后飘散而去的白色水雾,不禁为设计师如此传神地将神话传说与现代列车设计融合的妙想而深深折服。 JR KYUSHU D&S TRAINS D&S列車の旅 特急指宿のたまて箱JR KYUSHU D&S TRAINS D&

By Sakashita Yasunobu
“夜空摇曳金穗,万灯承载人愿”秋田竿灯节记

“夜空摇曳金穗,万灯承载人愿”秋田竿灯节记

早就听说过秋田竿灯节的魅力,这个被誉为日本东北三大传统民俗节庆活动之一的盛典。终于在今年8月让我有了亲身体验的机会,于是和朋友相约,踏上了这段探索秋田竿灯文化的旅程。 秋田竿燈まつり-Akita Kanto Festival- 国重要無形民俗文化財厄よけ、五穀豊穣などを願う行事として長い歴史を持つ「秋田竿燈まつり」。約280本もの竿燈の明かりが会場の大通りを埋め尽くし、まるで黄金の稲穂のように揺らめき、真夏の夜空を照らします。国重要無形民俗文化財。 踏上秋田之旅 竿灯祭是约270年历史的国家重要无形民俗文化财产,源自人们为驱离农忙时节的睡魔而举行的除邪消灾活动。据史料记载,关于秋田竿灯节最早的文字记录可以追溯到江户宽政年间,这让我们对即将见证的这一拥有230多年历史的传统民俗充满了期待。8月2日,我们轻装从东京站出发,乘坐新干线约4小时便抵达了JR秋田站。从中央检票口出来,天棚上装饰着竿灯悬挂的米白色的和纸制灯笼立刻营造出了节日氛围。检票口不远处摆放着:憨厚可爱的秋田犬毛绒布偶,旁边是巨大的红脸蓝脸生剥鬼面具,瞬间吸引了我们驻足拍照。生剥鬼是秋田地区独特的民俗文化象征,红脸和蓝

By Sakashita Yasunobu