TECH BLOG

画像1.png

2025.10.20

文字起こしを内製してみた:WhisperXで実務レベルの音声認識を検証

WhisperX を活用して、社内会議の自動文字起こしを検証。高速・高精度な処理に加え、クラウドを使わない安全な運用を実現。実務でのAI活用を一歩進める取り組みです。

投稿者:かまわら

1. はじめに

 AIの普及により、音声認識((ASR: Automatic Speech Recognition))技術はここ1〜2年で急速に実用化が進みました。その結果、Google Meet や Zoom など、主要なオンライン会議ツールにも自動文字起こし機能が搭載され、会議の録音をAIが自動で議事録化される時代になりました。
とはいえ、対面での打ち合わせや社外非公開の会議やネットワーク制限のある環境では、クラウドベースのサービスを利用できないこともあります。

 そこで今回は、「ローカル環境で動作し、実務に耐えうる文字起こし」をテーマにOpenAIの Whisper を拡張した WhisperX を検証しました。

画像5.png



2. WhisperXを選んだ理由

 OpenAIのWhisperは多言語対応かつ高精度なASRモデルとして注目されていますが、会議録や議事録など、実務利用の現場では「処理速度」や「話者識別」にもう少し工夫が欲しいと感じる場面もあります。

実際に社内で検証した際も、
長時間の音声では出力に時間がかかっただけでなく、結果がフレーズ単位で区切られているため、誰がどの発言をしたのか分かりにくく、確認作業にも手間がかかるという課題がありました。

 そのWhisperを拡張し、実務での使いやすさを高めたのが「WhisperX」です。WhisperXは、これらの課題を解決する実装で、以下の3つの観点からWhisperを強化しています。

高速化(faster-whisper / CTranslate2)
 CTranslate2を採用し、処理速度と省メモリ性能を大幅に改善して長時間データでも安定稼働します。
語単位アライメント(タイムスタンプ精度向上)
 wav2vec2系アライナーにより、単語レベルで音声と文字を正確に対応させ、後処理の効率を高めます。
話者識別統合(pyannote.audio)
 pyannote.audioのダイアライゼーションを統合し、「誰が話したか」を自動付与して一貫したタイムラインで出力します。

つまり、WhisperXは「誰が・いつ・何を話したか」を同じ時間軸で扱える仕組みを備えており、下の比較図のように、Whisperがフレーズ単位で出力していたものを、WhisperXでは語単位+話者情報付きで出力できます。
この情報を活用すれば、発話の区切れ目をもとに会話単位での整理や可視化も可能になります。

画像4.png

 

3. 実際に使ってみた感想

 WhisperXはセットアップがシンプルで環境構築もスムーズに進み、実際に社内の録音データで試したところ、次のような結果となりました。

  • 精度:Whisperと同等。日本語の句読点も自然で、2時間程度の音声でも安定して処理できました。
  • 速度:CTranslate2により、推論が約10倍高速化でき、2時間の音声を約4分で処理できました(Whisperは約40分)。※環境により変動します
  • 話者識別:pyannote.audioの統合で発話区間のズレが減り、安定した結果が得られました。精度は改善の余地がありますが、議事録化には十分なレベルです。

つまり、WhisperXは「Whisperの精度を保ったまま、実務で使える水準まで発展させた実装」と言えます。社内ツールとしても十分実用可能なレベルでした。

~ 実務で利用する際のポイント ~

  • CUDA / cuDNN の整合性:PyTorchとCTranslate2の対応バージョンがずれると実行時エラーの原因になります。
  • ライブラリの固定化whisperx / faster-whisper / pyannote.audio は、pip freeze で環境を固定しておくのが安全です。
  • Google Colab実行時の注意:再接続のたびにGPUやCUDAバージョンが変わる可能性があります。安定運用を目指すなら、ローカルGPU環境がおすすめです。

構成サンプル

import whisperx

# 音声ファイルの読み込み
audio = whisperx.load_audio("sample.wav")

# 音声認識モデルのロード
prompt = "文体や誤字傾向を補正できるプロンプト"
model = whisperx.load_model(
    "large-v3", device="cuda", compute_type="float16",
    asr_options={"initial_prompt": prompt}
)

# 文字起こし実行
asr_result = model.transcribe(audio, batch_size=16, language="ja")

# 語単位アライメント(日本語モデルを指定)
align_model, metadata = whisperx.load_align_model(
    language_code="ja", device="cuda",
    model_name="vumichien/wav2vec2-large-xlsr-japanese"
)
aligned_result = whisperx.align(
    asr_result["segments"], align_model, metadata, audio,
    device="cuda", return_char_alignments=False
)

# 話者識別(Hugging Faceトークンが必要)
diarize_model = whisperx.DiarizationPipeline(
    use_auth_token="YourKEY", device="cuda"
)
diarize_segments = diarize_model(audio, min_speakers=2, max_speakers=5)
final_result = whisperx.assign_word_speakers(diarize_segments, aligned_result)

# 結果確認
print(final_result["segments"][:2])

4. まとめ

 WhisperXは、Whisperの精度をそのままに、高速化・語単位アライメント・話者識別を統合し、実務でも扱いやすい構成になっています。約2時間の会議音声でも安定して処理が行え、推論の高速化とローカル環境での安全性の両面が確認できました。

今回の検証を通して感じたのは、「クラウドに頼らず、自社環境で十分な精度を出せる音声認識」 が現実的になってきたということです。
WhisperXのようなオープンソース実装を活用すれば、セキュリティを確保しつつ、長時間データの処理や議事録生成を効率化できます。

 今後は、生成AIと組み合わせて「文字起こし+要約」や「会議内容の自動整理」など、"文字起こしを超えた活用"にも広げていけそうです。WhisperXは、単なる自動化ツールではなく、音声データを構造的に扱うための土台として、今後のAI活用の幅を大きく広げてくれる存在だと感じました。