Ubuntu Weekly Recipe

第877回リアルタイム文字起こしをローカルマシンで実現できるWhisperLiveKitを使ってみよう

OpenAIが高精度の音声認識・文字起こしを実現できるモデルであるWhisperを公開してから数年、Whisperを元にしたさまざまなツールが登場しました。今回紹介するWhisperLiveKitもそのひとつで、ローカルマシンで使える上に、より低遅延で話者認識にも対応していると謳っています。今回はそんなWhisperLiveKitをUbuntuマシンにインストールしてみましょう。

図1 このような長文でも、ほぼ誤認識することなく数秒遅れで認識してくれる

WhisperLiveKitは低遅延な文字起こしツール

たとえあなたが比類なきぼっちだったとしても、人間である以上は何らかのコミュニケーションから逃れられません。視覚を使うのか、聴覚なのか、それ以外か。会話重視なのか、それとも文字主体なのか。どのようなコミュニケーション手段を取るかはその人の特性次第な部分があります。この記事を読まれているのであれば、おそらくYouTubeで動画を見るよりも、文字を読んで情報を取得するほうが得意なタイプなのでしょう。

今回紹介するWhisperLiveKitは、誰が喋っているかの判別(Speaker Diarization⁠⁠、音声活動の検出などの技術を組み合わせ、低遅延の音声認識と文字起こしを実現するシステムです。この文脈でWhisperと言えば、今をときめくOpenAIが公開した音声認識・文字起こしのモデルですね。

Whisperはその精度の高さと利用のお手軽さから登場後もいろいろな人が(魔)改造し、いかに高速に、いかに遅延を小さく、いかに低リソースでも動くようになるかを競ってきました。Whisperそのものは、ある程度の長さをもった音声ファイルを変換する使い方を想定していたため、特にリアルタイム変換にも対応しようとする改造が多かったのではないでしょうか。WhisperLiveKitもその方向性を目指して、複数の技術を組み合わせて構築されています。

さっそくWhisperLiveKitを実際にインストールして使ってみましょう。Python製のツールですので、Pythonの流儀に従ってインストールします。いくつか選択肢はありますが、今回は第850回のUbuntuにおけるシステムPythonと、Pythonの仮想環境を使い分ける方法で紹介したpipxコマンドを使うことにしましょう[1]

まずは必要なパッケージを先にインストールしておきます。

$ sudo apt install pipx ffmpeg python3-dev

ここでffmpegはWhisperLiveKit内部の音声処理のために使われます。また、python3-devはCUDAを使うために必要です。一応CPUのみでも動きますが、せっかくの低遅延性がほぼ活かせません[2]。よってCUDAが動く環境で試すことをおすすめします。ここではNVIDAのGPUとCUDA環境がインストール済みである前提で進めます。具体的にはUbuntu 24.04 LTSの公式リポジトリにあるnvidia-cuda-toolkitパッケージとドライバを使っています。CUDAのバージョンは12.0です。

次にWhisperLiveKitをインストールしましょう。

$ pipx install whisperlivekit
  installed package whisperlivekit 0.2.7, installed using Python 3.12.3
  These apps are now globally available
    - whisperlivekit-server
done! ✨ 🌟 ✨

ここでは0.2.7をインストールしていますが、記事公開の直前に0.2.8がリリースされています。以降の説明は原則として0.2.7時点のものです。末尾に0.2.8の注意点を記載していますのでそちらもご確認ください

ただしこれだけでは動きません。torchaudioモジュールがないなどのメッセージが出てしまいます。必要なモジュールを追加でインストールしましょう。pipxでインストールしたコマンドは、~/.local/share以下にvenv環境が作られます。ここにPythonライブラリを追加でインストールするには、pipx injectコマンドを使います。

$ pipx inject whisperlivekit torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu129
  injected package torch into venv whisperlivekit
done! ✨ 🌟 ✨
  injected package torchvision into venv whisperlivekit
done! ✨ 🌟 ✨
  injected package torchaudio into venv whisperlivekit
done! ✨ 🌟 ✨

ここではPyTorchのダウンロードサイトからCUDA 12.9版をインストールしました。CUDA非対応版をインストールする場合は、末尾の「cu129」「cpu」に置き換えてください。

では、実際にサーバーを起動してみましょう。

$ whisperlivekit-server --model medium --language ja --host 0.0.0.0
INFO:     Started server process [402677]
INFO:     Waiting for application startup.
Using cache found in /home/shibata/.cache/torch/hub/snakers4_silero-vad_master
WARNING:whisperlivekit.simul_whisper.backend:
SimulStreaming backend is dual-licensed:
• Non-Commercial Use: PolyForm Noncommercial License 1.0.0.
• Commercial Use: Check SimulStreaming README (github.com/ufal/SimulStreaming) for more details.

INFO:     Application startup complete.
INFO:     Uvicorn running on http://0.0.0.0:8000 (Press CTRL+C to quit)

上記のように「Uvicorn running on ...」と表示されたら準備完了です。なお、初回実行時はモデルのダウンロードが行われるため、それなりに時間がかかります。mediumだと1.5GiBぐらいダウンロードするようです。また、mediumは5GiBぐらいのGPUメモリーを使用しますので、GPUのメモリーサイズが小さい場合は、mediumではなくbaseやsmallを選んでみてください。10GiB以上ある場合は最高精度のlarge-v3が使えます。

WhisperLiveKitをインストールしたマシンのIPアドレスにアクセスしてみましょう。

図2 録音開始ボタンだけの非常にシンプルなレイアウト

早速録音ボタンを押したいところですが、まだ準備は完了していません。最近のFirefoxはHTTPS接続でない場合、マイクを使えない設定になっているからです。正しい対処法はWhisperLiveKitをHTTPS対応にすることです。自己署名証明書を作成して、それを取り込んで、whisperlivekit-serverコマンドのオプションで指定するか、Nginxなどのリバースプロキシーを経由することになるでしょう。

ただ、今回はそこまで手間をかけたくないので、Firefox側の設定を変更します。まずFirefoxのアドレスバーからabout:configを入力します。次のような警告が表示されますので、⁠危険性を承知の上で使用する」を選びます。

図3 Firefoxの設定を、通常の設定画面以外から変更する場合はこのように警告される。その必要性をよくよく考えてから設定を変更しよう

ここで検索バーにmedia.*.insecure.enabledを入力すると表示される次の項目をそれぞれ「true」に変更します。

  • media.devices.insecure.enabled
  • media.getusermedia.insecure.enabled
図4 WhisperLiveKitを試し終えたら元に戻すことをお忘れなく

これで準備完了です。なお、この設定はHTTPでもメディアデバイスのリストアップやアクセス可否のダイアログの表示を許容するものです。基本的には「false」にしておくのが正しい状態となります。よって、WhisperLiveKitを試し終わったら元に戻してください。

あとは「録音ボタン」を押して、音声デバイスのアクセス許可のダイアログに対して許可するボタンを押したら録音開始です。普段言えないような思いの丈を、全力でウェブブラウザーにぶつけてください。無事に音声が認識されて、日本語の文章になりましたでしょうか。

今回は次のような環境を使いました。

Machine MINISFORUM MS-A2
CPU AMD Ryzen 9 9955HX 16C/32T
Memory DDR5-5600 128GiB
GPU RTX A1000 8GiB
OS Ubuntu 24.04 LTS Server

この環境ではlarge-v3はロードできませんでしたが、large-v3-turboやmediumを使えばほぼリアルタイムで変換してくれました。認識率も悪くなかったのですが、たまに文字化けするようです。どうやら音声認識の過程で、生成した文字列を修正するときにUTF-8な日本語文字列をうまく扱えていない印象があります。これは後述する--never-fireオプションをつけると、発生しなくなりました。

large-v3-turboと--never-fireを組み合わせて読み上げた例。音の読み取りという観点だとほぼ完璧に文字起こしできており、漢字への変換もおおよそ期待通りの挙動を示している

上記動画の「Speaker 1」が話者を検知している部分です。その隣の時間が発言開始時刻から終了時刻までになります。発言を続けるほど終了時刻は長くなります。

さらに変換中は「Transcription lag 2.5s」のような表示がでます。これはつまり音声は検知したけれども、まだ変換処理中の時間です。表示されている文字列が2.5秒ほどずれていることになります。今回の環境だと最大でも4秒ちょっとのずれでした。

ちなみに実行中のGPU/CPUの使用率は次のようになっていました。

図5 画面右がbtopの結果で、画面左上がnvitopの結果。ただし上記動画撮影時とは別の文章をテスト中に撮影した

画像をみていただければわかるように、GPUのメモリーは8GiBの半分ぐらいを恒常的に使用しています。CPU側のメモリーはほぼ使用しません。また音声認識時はCPUも1コアだけ負荷が大きく上がるようです。

精度を維持したままより遅延を小さくするという観点だと、GPUメモリーが12GiB以上搭載されており、なおかつ高性能なGPUを使うのが一番となります。

WhisperLiveKitのさまざまなオプション

ここまでだけで、ある程度は使い物になるはずです。ただ、WhisperLiveKitにはさまざまなオプションもあるのでそれも試してみましょう。結論から言うと、そのまま動くものはほとんどなく、環境依存で使えたり使えなかったりするようです。

モデルの選択

音声認識の品質を左右するモデルは--model モデル名で指定します。選択肢はいくつかありますが、選ぶとしたら次のいずれかでしょう。

  • tiny: 1GiB程度
  • base: 1GiB程度
  • small: 2GiB程度
  • medium: 5GiB程度
  • large-v3-turbo: 6GiB程度
  • large-v3: 10GiB程度

GPUメモリーの使用量は、こちらで試してみた体感の数字です。もちろん大きいほうが精度はあがりますが、速度は遅くなります。ただ、mediumとlarge-v3-turboについてはその差は実感できませんでした。

言語の選択

言語の選択は--language 言語コードで指定します。autoを書くと自動判定してくれます。こちらで試した限り、autoでは日本語として判定してもらえませんでした。

ネットワーク関連の設定

--host IPアドレス--port ポート番号でサーバーが待ち受けるアドレスやポート番号を指定できます。何も指定しない場合はローカルホストの8000番ポートで待ち受けます。他のマシンからアクセスしたい場合は、--host 0.0.0.0のように指定してください。

--ssl-certfile--ssl-keyfileでサーバー証明書や秘密鍵を指定できます。

音声認識のバックエンドの設定

--backend バックエンドで音声認識のバックエンドを選択できます。何も指定しなければ、超低遅延のSimulStreamingとなりますが、他にも以下が選べるようです。

  • faster-whisper:OpenAIが開発したオリジナルのWhisperを高速化したもの
  • whisper_timestamped:単語ごとの正確なタイムスタンプをつけるような機能を追加したWhisper
  • mlx-whisper:AppleのCPU向けに最適化されたバックエンド
  • opeai-api:OpenAIのAPIを利用するバックエンド

simultreaming以外はそれぞれ追加でPythonパッケージをインストールする必要があります。詳細はREADME.mdのOptional Dependenciesを参照してください。

冒頭でも触れたように、音声認識の分野はWhisperの登場でがらっと変わった印象があります。Faster Whisperをはじめとして、Whisperベースのいろいろなものが登場しました。今回のWhisperLiveKit以外にもいろいろありますので、探してみると良いでしょう。

特にこだわりがなければ、まずはSimulStreamingをそのまま使うと良いでしょう。ただしこれは「PolyForm Noncommercial License」と商用ライセンスのデュアルライセンスとなっています。特に商用利用を検討している場合は注意してください。

話者検知の設定

--diarizationを指定すると、どのセリフをだれが喋ったかを判別できます。と言っても名前が出るわけではなく、Web UI上は「Speaker 1」⁠Speaker 2」とわかれるわけです。CUDAを使う環境でこの機能を使うには、NVIDIA NeMoをインストールする必要があります。

$ pipx inject whisperlivekit "git+https://github.com/NVIDIA/NeMo.git@main#egg=nemo_toolkit[asr]"

ただし今回の環境では複数人で喋ってみたり声色を変えたり、動画を聴かせてみたものの、うまく検知できませんでした。NVIDIA NeMoが結構な量の警告を出しているので、他にも足りないか、何らかのバージョン依存性が存在していた可能性もあります。

その他の設定

他にもいろいろなパラメーターがありますが、代表的なものをあげておきましょう。

  • --min-chunk-sizeは最小の音声チャンクサイズを秒単位で指定する。小さくするほど負荷はあがるものの、処理が間に合えばレイテンシーは下がる
  • --frame-thresholdは小さくするほど高速に、大きくするほど正確になるパラメーター
  • --never-fireは誤認識でありやすい最後の単語を切り捨てない設定

最後の--never-fireについては、設定すると日本語において文字化けする可能性が減る印象です。ただし一連の発言の最後の言葉がなかなか変換されなくもなります。

音声認識もまた、未来感のある世界

最近のAIと言えば、LLMを活用した画像生成やVibe Coding、AIエージェントなどの話題に事欠きまん。ただし音声認識もまたAI活用事例として有力な存在です。議事録の文字起こしはもちろん、音声入力や聴覚障害者への支援、リアルタイム翻訳など既に応用例も多々あります。うまく実世界と組み合わせれば、きっと未来感のある何かを創り出せるはずです。

WhisperLiveKitも今回のように単独でも使えますが、どちらかというとその低遅延性を活かして、他と組み合わせて応用する方向性と相性が良いでしょう。Webサーバー部分の実装を参考にしながら、ぜひいろんな仕組みに組み込んでみてください。

おすすめ記事

記事・ニュース一覧