WhisperX:単語ごとのタイムスタンプと locuteurs
WhisperXは、Whisperに2つの機能を追加するオープンソースの拡張ツールです(BSD-2-Clauseライセンス、GitHubで24,000を超えるスター)。音声モデルを使った強制アライメントによって単語ごとのタイムスタンプを正確に付ける機能と、pyannote-audioによる話者分離機能を備えています。すべてローカルで動作し、プロジェクトによれば、Whisper large-v2を使ったバッチ推論では、実時間の最大70倍の速度で処理できます。ただし、1つではなく3つのモデルを読み込む必要があります。
Whisper は非常に優れた文字起こしと概略的なタイムスタンプを生成します。WhisperX は、単純な文書を超えた場面ですべてを変える 2 つの機能を追加します。強制アライメントにより、実際に正確な単語単位のタイムスタンプが得られ、話者分離により、誰がいつ話したかが示されます。これにより、文字起こしは利用可能な字幕や読みやすい会議議事録に変換されます。
#Whisperだけでは解決できないこと
WhisperXはBSD-2-Clauseライセンスの自由ソフトウェアで、Whisperを拡張し、モデル単体にはない2つの機能を追加します。wav2vec2モデルによる強制アライメントで得られる単語ごとのタイムスタンプと、pyannoteモデルが付ける話者ラベルです。表示タイミングを正確に合わせる必要がある字幕や、誰が発言したか分かる会議記録を作るなら、WhisperXが必要です。テキストだけが欲しいなら、Whisper単体またはfaster-whisperで十分です。その代わり、1つではなく3つのモデルを読み込む必要があり、話者分離にはHugging Faceのアクセストークンも必要です。また、明記されている制限もあります。数字や金額はアライメントされず、同時発話の処理は苦手で、話者分離も完全ではありません。すべてローカルで動作し、GPUでもCPUでも、Macでも利用できます。
Whisperは優れた文字起こしテキストを生成します。ただ、テキスト以外のものを求めると、その弱点が現れます。WhisperXのリポジトリによると、Whisperのタイムスタンプは単語単位ではなく発話単位で付けられ、数秒ずれることがあります。文書では気にならないずれでも、字幕では許容できません。字幕が一拍遅れて表示されるくらいなら、字幕がまったくないほうがよいからです。また、Whisperには話者を区別する仕組みがありません。2時間の会議も、話者の区別がない1つの独白として返ってきます。
WhisperXは、モデルを置き換えるのではなく、処理工程を追加することで、その両方に対応します。この設計によって、使い慣れた文字起こしの品質が保たれます。BSD-2-Clauseライセンスで公開されているこのプロジェクトは、現在GitHubで24,000を超えるスターを獲得しています。これは、文字起こしにタイムスタンプを付け、発話者を割り当てるという、このプロジェクトが応えるニーズが、字幕作成の用途をはるかに超えていることを示しています。
#3つのステップ
お使いのマシンで、プライベートかつ無料のChatGPTを1時間で構築 — LM Studio、Ollama、Open WebUI、ご自身のドキュメント、クラウド不要。
- 永久に利用できるオンラインスペース
- PDF + ファイル
- 生涯アップデート
| ステップ | 役割 | 必要なもの |
|---|---|---|
| 音声検出(VAD) | 文字起こしの前に、音声信号を発話区間に分割します | 発話検出器(デフォルトはpyannote、オプションでsilero) |
| 文字起こし | 音声はfaster-whisperを用いてテキストに変換されます。faster-whisperはWhisperの高速実装です。 | Whisperモデルは、サイズが品質とメモリの使用量を決定します(コマンドラインのデフォルトはsmall) |
| 強制アライメント | wav2vec2 を使い、各単語の位置を音声内の正確な時刻に合わせ直します | その言語に対応した音素モデル |
| 話者の分離 | pyannote-audioを使って音声を話者ごとに分割し、各発話にラベルを付けます | デフォルトのpyannote speaker-diarization-community-1モデル。アクセスには利用条件への同意が必要です |
声の検出は二つの役割を担っています。デポジットによると、これは幻覚を減少させ、セグメントをグループ化できるだけでなく、誤字率を低下させることなく、単語レベルでの誤りを維持します。一方、アライメントステップはしばしば過小評価されています。このステップが、wav2vec2モデルを用いて、音声信号内の各単語の実際の位置に合わせることで、単語単位での時刻記録を信頼できるものにします。これは言語に依存します。デポジットでは、言語に特化したwav2vec2モデルが必須であると明記しており、英語、フランス語、ドイツ語、スペイン語、イタリア語に加えて、Hugging Faceを通じてさらに多くの言語に対応するデフォルトモデルが存在するとされています。リストに記載されていない言語については、自ら音声的モデルを検索し、テストを行う必要があります。トランスクリプション自体はグループインフェンスを活用しています。プロジェクトでは、large-v2モデルを使用した場合、リアルタイムの70倍の処理速度を実現できると発表していますが、READMEに使用されたハードウェアは明記されていません。この数字は、あなたのマシン上で確認できる上限値と見なしてください。
#話者分離:過度な期待をせずに
ラベル付けは、pyannote-audioを使い、録音全体にわたる声の特徴をグループ化することで行います。現在のWhisperXのデフォルトモデルは、CC-BY-4.0ライセンスで公開されているspeaker-diarization-community-1です。16 kHzのモノラル音声信号を入力として受け取り、ステレオはモノラルに変換し、それ以外のサンプリング周波数の音声はリサンプリングします。モデルの説明ページでは、旧パイプライン3.1よりも大幅に優れているとしています。WhisperXのリポジトリは限界を率直に説明しています。発話が重なる場合の処理は十分ではなく、話者の分離も依然として「完璧には程遠い」状態です。pyannoteが公開している話者ダイアライゼーションの誤り率も、それを示しています。コーパスによって、AISHELL-4では11.7%、AMI(個別マイク)では17.0%、AMI(遠隔マイク)では19.9%、CALLHOME(パート2)では26.7%、Ego4Dでは46.8%です。これらは学術用コーパスで、ご自身の録音ではありませんが、この数値の規模からも、結果の見直しは依然として必要だと分かります。状況が悪化するのは、まさに会議が複雑になる場面です。互いの発言を遮る人がいる、マイクから遠い人がいる、声が似ているといった場合です。
実用上の補足が2点あります。話者数の最小値と最大値を指定できます(オプション --min_speakers と --max_speakers)。話者数がわかっている場合は、リポジトリでも指定を推奨しています。モデルが話者数を推測する必要がなくなるためです。また、ラベルは仕組み上、匿名です。システムが示すのは、3人分の声があったことと、各発話がどの声に属するかであり、その人が誰かではありません。ラベルと名前を対応づけるのは手作業で行う工程であり、この時点で文字起こしは個人データにもなります。
#ベンチマークではなく、実際の精度
文字起こしそのものについても数値を示しておく必要があります。一般的なベンチマークでは、実際よりも良い印象を与えてしまうためです。商用文字起こしサービスのVexaScribeによると、Whisper large-v3の単語誤り率は、単一話者の雑音の少ない音声データセットであるLibriSpeech test-cleanで約2.7%です。会議、ポッドキャスト、通話などの実際の英語音声では、同サイトはこの誤り率を約8〜12%としています。これらは業界の事業者が公表した大まかな目安で、英語についての数値です。ご自身のフランス語の録音については何も示していません。WhisperXは文字起こしそのものを改善するわけではなく、その結果はWhisperによるもののままです。WhisperXが追加するのは、各単語が音声のどの位置にあるか、誰が発話したかを正確に把握する機能です。この2つの情報は、単語誤り率では捉えられません。
| ニーズ | ツール |
|---|---|
| プレーンテキスト、高速 | Whisper だけまたは faster-whisper などの高速実装 |
| 適切なタイミングで表示される字幕 | WhisperX:アライメントこそが存在意義 |
| 誰が何を言ったかの記録 | 話者分離を有効にしたWhisperX |
| リアルタイム文字起こし、低遅延 | ストリーミング向けのエンジン。この処理パイプラインはファイル向けです |
#必要なリソース
- Whisperモデルのサイズがすべてを決めます
- 大きなモデルほど良質な文字起こしが得られますが、必要なメモリも最も多くなります。リポジトリでは、モデルを大きくするとGPUメモリの必要量が増える代わりにタイムスタンプの精度が向上する一方、アライメントモデルを大きくしても効果はほとんどないと説明されています。
- 読み込まれるモデルは1つではなく3つ
- 文字起こし、アライメント、分離の各モデルがすべて同時にメモリに常駐すると、メモリ使用量がピークに達します。リポジトリの Python サンプルでは、各モデルの処理が終わるたびにモデルを解放します(ガベージコレクションの後に torch.cuda.empty_cache() を実行)。これは、メモリ容量の小さい GPU でよく使われる対策です。
- Macも含め、GPUなしで
- リポジトリには、CPU用およびmacOS用のコマンドラインとして--compute_type int8 --device cpuが示されています。CPUでの処理時間は公開されていないため、バッチ処理を計画する前に、短い抜粋で測定してください。NVIDIAのGPUを使用する場合はCUDA 12.8のツールキットが必要で、プロジェクトによると、large-v2をbeam_size=5で使う場合のメモリ使用量は8GB未満です。
- バッチ処理が役立つ
- 公表されている速度を実現するのはバッチ処理です。コマンドラインのデフォルトは --batch_size 8 です。この値を下げると(リポジトリでは4が挙げられています)、GPUメモリが解放されます。
#インストールして文字起こしを開始する
インストールには pip を使います。このパッケージには Python 3.10〜3.13 が必要です。コマンドラインでは、デフォルトで利用可能なすべての形式(srt、vtt、txt、tsv、json、aud)が出力されます。--highlight_words True オプションを指定すると、SRTおよびVTT字幕で、各単語が発話されるタイミングに合わせて下線が表示されます。話者分離が有効な場合、JSONには話者ラベルも含まれます。
- 01WhisperXをインストールするpip install whisperxでパッケージをインストールします。NVIDIA GPUを使用する場合は、リポジトリの指示に従い、まずCUDA 12.8ツールキットをインストールします。リポジトリでは、Whisperのインストール手順を参照しながら、ffmpegもインストールする必要がある場合があると説明しています。
- 02文字起こしとアライメントを行う中程度のサイズの Whisper モデル(デフォルトは small)で最初の処理を実行し、言語が事前にわかっている場合は指定する。指定しない場合、言語は自動検出され、その言語に応じてアライメントモデルが決まる。
- 03必要に応じて話者分離を有効にする--diarizeと、pyannoteモデルの利用条件に同意した後に取得したHugging Faceのアクセストークンを追加し、話者数が分かる場合はその数も指定する。
- 04出力ファイルを読み直す生成された SRT または JSON ファイルを開き、いくつかの箇所を無作為に選んで確認する。特に、複数の人がほぼ同時に話している場面では、話者の交代を確認する。
#アライメントではタイムスタンプを付けられないもの
リポジトリには、完璧な字幕を約束する前に知っておくべき制限が挙げられています。1つ目は数字に関するものです。例えば「2014.」や「£13.60」のように、アライメントモデルの辞書にない文字を含む単語はアライメントできず、タイムスタンプも付きません。金額や日付が頻繁に出てくる会議では、こうした単語はSRT内で個別の時刻情報を持たない状態になります。2つ目は同時発話で、WhisperもWhisperXもうまく処理できません。3つ目は言語で、言語に対応したwav2vec2モデルが必要です。
元のWhisperとの2つの違いも、出力テキストに差が生じる理由です。バッチごとに1回の処理で済ませるため、Whisperのタイムスタンプを付けずに推論を行います。リポジトリでは、これにより標準の出力と異なる結果になる可能性があると注意しています。また、ハルシネーションを減らすため、condition_on_prev_textオプションはデフォルトで無効になっています。2026年からは、--interleaved_contextオプションでセグメント間の連続したコンテキストを復元できます。プロジェクトによると、句読点や専門用語に役立ちますが、導入されて間もない機能なので、採用前に音声の一部でテストしてください。
#具体的なユースケース
- トレーニング動画への字幕付け
- 単語単位のタイムスタンプを付けることで、字幕が音声より一文分遅れるのを防げます。こうしたずれはすぐに目につき、教育コンテンツでは視聴の妨げになります。
- 複数の話者がいる会議の議事録
- 話者を分離することで、誰が何を提案したかを再現できます。発言者を明示しない要約では、この情報を忠実に伝えることはできません。
- 長時間のポッドキャストおよびインタビュー
- バッチ推論は長時間の録音向けです。著者らの論文タイトル「Time-Accurate Speech Transcription of Long-Form Audio」も、そのことを示しています。
- インデックス対象の音声アーカイブ
- 単語ごとにタイムスタンプが付いたテキストがあれば、検索結果から文書全体を開くだけでなく、録音内の該当する正確な時点に直接移動できます。
- ソーシャルメディア向けの抜粋
- 印象に残るフレーズが発せられた箇所を単語単位で正確に特定できれば、動画全体をもう一度聴き直さずに、短いクリップを切り出しやすくなります。
これらのケースには、リアルタイムの文字起こしが不要という共通点があります。録音済みのファイルを後から処理するため、遅延の制約を受けずにバッチ推論で処理する時間を確保できます。必要なのがライブ字幕になった場合、例えば講演のライブ配信や通話中の字幕では、利用できるマシンがどれほど高性能でも、WhisperXは適切なツールではありません。
#文字起こしは入力であり、成果物ではありません
実際の利用では、ほぼすべての場合、文字起こし自体が目的ではありません。文字起こしの結果をローカルモデルに渡し、そのモデルが報告書、決定事項の一覧、要約などを作成します。このため、求められる品質にも影響があります。あまり使われない単語の文字起こしミスよりも、誰がどの順番で発言したかという構造のほうが重要です。この構造によって、モデルは発言内容を正しい話者に結び付けられるからです。
具体的には、合理的な本番運用のワークフローでは、2つの役割を分けます。WhisperXがタイムスタンプと話者ラベル付きのテキストを生成し、その後、別の言語モデルがそのテキストを読み直して構造化された要約を作成します。両者を1回の呼び出しにまとめ、モデルに音声を直接要約させると、WhisperXがまさに提供するために作られた正確なタイムスタンプをパイプラインで得られなくなり、特定の箇所を後から検証することも難しくなります。
もう一つの利点は、文字起こしを一度行えば、音声を再処理せずに、短い議事録、決定事項の記録、字幕といった複数の成果物に再利用できることです。タイムスタンプとラベルが付いたテキストが、情報の基準となります。
- 出典:GitHub上の公式WhisperXリポジトリ
- 出典:話者分離モデルpyannote community-1
- 出典:VexaScribe(商用サービス)、Whisper large-v3の単語誤り率
- ソース:PyPI上のwhisperx
#FAQ
WhisperXは無料ですか?+
発話者の分離の信頼性はどのくらいですか?+
GPU は必要か?+
WhisperX、それともWhisper単体?+
フランス語で動作しますか?+
リアルタイムで音声を文字に変換できますか?+
ご意見、誤りのご指摘、補足はありますか?ぜひお知らせください。皆さんにとってより良いガイドにするために役立ちます。