こんにちは、パレイド技術部の夏目です。
前回の話者分離の記事では、Whisper で文字を起こし、pyannote で「誰がいつ話したか」を分け、両者を時間で突き合わせる——という自前で組む構成を整理しました。仕組みが見える代わりに手数が多いのが正直なところで、記事の最後で「全部入りの WhisperX は近日扱う」と宿題を残しています。今回はその受け皿です。
WhisperX は、文字起こし・単語単位のタイムスタンプ・話者分離という三つの処理を、コマンド一本のパイプラインにまとめたツールです。前回は手で組んだ突き合わせを、WhisperX は内部で済ませてしまいます。Mac のローカルで完結する範囲で、どこまで手軽になるのか。速度の正直なところも含めて見ていきます。
本記事はローカル LLM による自動執筆パイプラインで生成されました。現段階ではクラウド AI(Claude 等)の補助や人間の編集が介在していますが、pareido.jp では最終的に AI が自律的にコンテンツを制作できる仕組みの構築を目指しています。
WhisperXとは(3つの機能を束ねる)
WhisperX は、別々のタスクである三つの処理を一本の流れにまとめたパイプラインです。それぞれ担当が違います。
- 文字起こし: faster-whisper(CTranslate2 という推論エンジンで動く高速版)で音声をテキストに
- 単語アライメント: wav2vec2 という音声認識モデルで強制アラインメントをかけ、単語ごとの時刻を確定させる
- 話者分離: pyannote で「誰がいつ話したか」を区切る
ここで効いてくるのが真ん中の強制アラインメント(forced alignment)です。これは「このテキストが音声のどこに対応するか」を後段で精密に当て直す処理で、普通の Whisper がセグメント(数秒のまとまり)単位でしか持たないタイムスタンプを、単語単位まで細かくする役割を担います。バックエンドの faster-whisper は比較ガイドの①として個別に紹介済みなので、WhisperX は「①の高速さに、単語アライメントと話者分離を載せたもの」と捉えると位置づけがはっきりします。
なお、WhisperX 自体は無料のオープンソース(BSD-2 ライセンス)で、pip で入れて課金なく使えます。後述の --diarize(話者分離)で使う pyannote のモデルだけは無料の HuggingFace トークンと利用許諾が必要ですが、これも料金ではありません。GUI アプリの MacWhisper のような有料プランとは別物だと考えてください。
インストールと最短実行
導入は一行です。依存する PyTorch などもまとめて入ります。
# WhisperX 本体を入れる(faster-whisper や pyannote なども依存として入る)
pip install whisperx
最短の実行はコマンド一本です。モデルと言語を指定して、音声ファイルを渡すだけで字幕ファイルが出ます。
# large-v3 モデルで日本語を文字起こしし、単語タイムスタンプ付きの srt を出力
whisperx audio.wav --model large-v3 --language ja --output_format srt
この時点で、単語単位のタイムスタンプを持った字幕ファイルが手に入ります。出力形式は srt / vtt / json などから選べ、json を選べば単語ごとの時刻をそのままプログラムで扱えます。ここに話者分離を足したいときは --diarize を付けますが、それは別の壁を越える必要があるので後述します。
単語単位タイムスタンプの強み
普通の Whisper のタイムスタンプはセグメント単位です。たとえば「0.0〜5.2秒:おはようございます、よろしくお願いします」のように、数秒ぶんの発話が一つの時刻範囲にまとまって返ってきます。WhisperX はこれを単語ごとにほどき、「おはよう=0.0〜0.6秒」「ございます=0.6〜1.3秒」といった粒度で時刻を持ちます。
この細かさが効く場面は具体的です。カラオケ字幕のように歌詞を一語ずつ光らせたいとき、セグメント単位では一行まるごとしか制御できませんが、単語単位なら一語ずつタイミングを当てられます。動画編集の精密な編集点——言い直しや無音の正確な位置を探すとき——も、単語の時刻があれば一気に楽になります。
字幕の見やすさにも直結します。セグメント単位だと長い一文がドンと出てしまいますが、単語の時刻がわかれば、表示の切れ目を自然な位置で細かく割れます。「何を話したか」だけでなく「いつ」が語単位でわかること自体が、後工程の自由度を上げてくれます。
話者分離まで一発で
会議録のように「誰が話したか」も欲しいときは、--diarize を足すだけです。
# 話者分離も同時に行う。話者数がわかっていれば指定すると安定する
whisperx audio.wav --model large-v3 --language ja \
--diarize --hf_token hf_xxx \
--min_speakers 2 --max_speakers 2 --output_format srt
これで、単語タイムスタンプに話者ラベルまで付いた出力が一発で得られます。前回はここを自分のコードで突き合わせていた工程が、オプション一つに畳まれた格好です。話者数があらかじめわかっているなら --min_speakers / --max_speakers で固定すると、相槌やノイズを別話者として拾う取り違えが減ります。
ただし注意が一点あります。--diarize は内部で pyannote を使うため、話者分離の記事で扱ったのと同じ壁——HuggingFace のアカウント、モデルの利用条件への同意、アクセストークン——が必要です。WhisperX 3.8.6 が内部で使う既定モデルは pyannote/speaker-diarization-community-1 で、ログでも確認できました。注意したいのは、有効なトークンを持っていても、モデルページで利用条件に「Agree」していないと 403 GatedRepoError で弾かれる点です。トークンを発行しただけでは通りません。--hf_token に渡す hf_xxx は本物のトークンに置き換えますが、トークンはパスワードと同じなので扱いには注意しましょう(本文やスクリプトに直書きしない)。許諾フローの具体的な手順は前回の記事に書いたので、適宜そちらを参照してください。
Apple Silicon での速度感
速度については正直に書きます。WhisperX のバックエンドは faster-whisper、つまり CTranslate2 という推論エンジンです。CTranslate2 は NVIDIA の GPU(CUDA)に強く最適化されていますが、Mac には CUDA がないため、文字起こしは基本的に CPU + int8(8ビット量子化) で回ることになります。
そのため、純粋な文字起こし速度では、Apple Silicon の GPU をネイティブに叩く MLX 版(③)に構造的に劣ります。これは設定の良し悪しではなく、「CUDA 前提のエンジンを CUDA のない環境で回している」という土俵の違いから来るものです。
今回の検証(whisperx 3.8.6 / faster-whisper 1.2.1 / torch 2.8.0 / Apple M5)では、文字起こし自体は問題なく動作することを確認できました。一方で具体的な秒数はここでは出しません。MLX 版と同一条件で並べた実測までは取れておらず、処理時間は音声長・話者数・マシン構成に大きく左右されるためです。数字はあくまで環境依存の目安として捉えてください。そのうえで WhisperX の価値は速度ではない、と整理するのが正確です。文字起こし・単語タイムスタンプ・話者分離が一本のコマンドで揃う「手軽さ」こそが、このツールを選ぶ理由になります。
使い分け:pyannote自前構成 vs WhisperX全部入り
前回の自前構成と今回の WhisperX は、優劣ではなく住み分けの関係です。狙いに応じて選びます。
- pyannote 自前構成(前回): 仕組みが見える。文字起こし・話者分離・突き合わせを各段で制御でき、精度が悪いときにどこを直せばいいかがわかる
- WhisperX 全部入り(今回): 構成を意識せず、話者ラベルと単語タイムスタンプ付きの結果を手早く得られる
「中身を理解しながら細かく詰めたい」なら自前構成、「とにかくまとまった結果が早く欲しい」なら WhisperX、という分け方が現実的です。なお WhisperX も内部で pyannote を呼ぶので、HuggingFace の許諾という壁は両者共通である点だけは変わりません。
まとめ
要点を一枚に畳んでおきます。WhisperX は faster-whisper(高速文字起こし)+ wav2vec2(単語アライメント)+ pyannote(話者分離)の全部入りで、単語単位のタイムスタンプと話者ラベルがコマンド一本で揃うのが最大の価値です。
| 機能 | 担当 | WhisperX での得られ方 |
|---|---|---|
| 文字起こし | faster-whisper | whisperx audio.wav |
| 単語タイムスタンプ | wav2vec2 アライン | 標準で付与 |
| 話者分離 | pyannote | --diarize を足す |
一方で、Mac では CUDA がないぶん文字起こし速度は MLX 版に劣ること、--diarize には HuggingFace の壁が付いてくることは、選ぶ前に押さえておきたい点です。速度を最優先するなら MLX、全部入りの手軽さを取るなら WhisperX——という判断が現実的でしょう。
自前で組む pyannote 構成との違い、そしてどの Whisper 実装を選ぶかの比較は、それぞれの記事にまとめています。


