Courses
自動音声認識は近年大きく進歩しました。かつては強力なGPUを要し、結果もまちまちだった音声認識モデルが、今では一般的なPCでも高精度な書き起こしを実現できます。
同時に、モデルサイズは小さくなり、CPU推論は高速化し、多言語対応も拡大しました。これにより、文字起こし品質・速度・アクセス性・プライバシーのバランスが大きく向上しています。
MicrosoftのVibeVoice-ASR-BitNetは、その好例です。
最適化されたVibeASR.cppランタイムにより、専用GPUやクラウド送信に頼らず、Windows・Linux・macOSのPC上で多言語の音声認識をローカル実行できます。
本ガイドでは、VibeASR.cppのインストールとビルド方法、量子化モデルのダウンロード、コマンドラインでの音声ファイル文字起こし、永続ストリーミングサーバーの実行、そしてGradio製Webインターフェースでのアップロード/録音方法を解説します。
Microsoft VibeASR.cppとは?
VibeASR.cppは、MicrosoftによるVibeVoice-ASR-BitNetの公式C++推論ランタイムで、CPU上で効率的にローカル推論できるよう設計された圧縮多言語ASRモデルを実行します。
VibeASR.cppは独立した音声モデルではなく、モデル実行に必要な最適化エンジンを提供し、専用GPUやクラウド型音声サービスなしでリアルタイム文字起こしを可能にします。
そのため、ノートPC、デスクトップ、エッジデバイスなど、計算資源が限られた環境に適しています。

出典: microsoft/VibeVoice-ASR-BitNet
CPUデプロイを実用レベルにするため、Microsoftは元のVibeVoice-ASRアーキテクチャで使われていたQwen2.5-7Bの言語モデル部分を、より小型のQwen2.5-1.5Bに置き換えました。
また、主要2コンポーネントに異なる量子化手法を適用しています:
I8_S(VAEオーディオエンコーダ)I2_S(言語モデル。埋め込みは高精度)
これらの最適化により、モデル総サイズは約4.62 GBから1.58 GBへ縮小し、ノートPCやデスクトップでも実用的に動作します。
大幅な小型化にもかかわらず、圧縮モデルの語誤り率(WER)の増加は1〜4ポイント程度にとどまります。
VibeASR.cppはggmlフレームワーク、カスタムCPU命令、オペレータ融合を用いて推論速度を高めています。
Microsoftのベンチマークによると、同等サイズのモデルでWhisper.cppの1.6〜2.3倍の速度で動作し、十分なスレッド数を使用すれば対応CPU上で実時間を上回る速度での文字起こしが可能です。
MicrosoftのCPUベンチマークでは、スレッド数4でRTF 0.63、8でRTF 0.42を達成し、これはおよそ実時間の1.59倍・2.38倍の速度に相当します。
WERは、MLC Englishで8.25%、AMIヘッドセット音声で21.36%、AMI遠距離マイク音声で25.87%、LibriSpeech cleanで2.41%が報告され、精度・サイズ・CPU性能のバランスに優れています。
1. 必要なビルドツールをインストールする
VibeASR.cppはCPUのみで動作するため、専用GPUは不要です。対応するWindows・Linux・macOSのいずれかのPC、Python 3.9以降、Git、C++コンパイラ、そしてソース・ビルド・モデル用に約4GBの空きディスク容量が必要です。
ビルドにはCMakeとNinjaも必要です。
Windowsでは、コンパイラとビルドツールが同梱された端末を提供するw64devkitを使うのが最も簡単です。
Linuxでは、必要なパッケージをシステムのパッケージマネージャから直接インストールできます。
Windows
w64devkitのリリースページから最新のx64 .exeファイルをダウンロードします。

ダウンロードしたファイルは自己解凍形式です。実行して、以下のような扱いやすい場所に展開します:
C:\w64devkit
次に以下を開きます:
C:\w64devkit\w64devkit.exe
これでGCC、CMake、Make、Ninjaが揃った端末が起動します。環境変数を手動設定することなく、この端末で以降のWindows手順を実行できます。
Linux
Ubuntu、Debianなどの系統では、以下でコンパイラとビルドツール一式をまとめてインストールできます:
sudo apt update
sudo apt install build-essential cmake ninja-build git python3 python3-venv
これでGCC、CMake、Ninja、Git、Python、仮想環境作成用パッケージがインストールされます。
macOS
macOSでは、まずAppleのコマンドライン開発ツールをインストールします:
xcode-select --install
さらに、Git、Python 3.9以降、CMake、Ninjaが必要です。残りのツールはHomebrewでのインストールが簡単です:
brew install git python cmake ninja
2. VibeASR.cppをクローンしPython環境を用意する
以下のセットアップ手順は、Windows・Linux・macOSで共通です。
OSごとの差分は、Python仮想環境の有効化コマンドのみです。
ターミナルを開き、プロジェクトを保存したいフォルダへ移動して、VibeASR.cppリポジトリをクローンします:
git clone --recursive https://github.com/microsoft/VibeASR.cpp.git
cd VibeASR.cpp

--recursiveオプションは必須のllama.cppサブモジュールも取得します。これがないと、推論ランタイムのビルドに必要なファイルが不足します。
プロジェクトフォルダ内にPython仮想環境を作成します。
python -m venv .venv
OSに応じたコマンドで有効化します。
w64devkit端末を使うWindows:
. .venv/Scripts/activate
Linux・macOS:
source .venv/bin/activate
有効化後、プロンプトの前に(.venv)が表示されます。Pythonが利用可能か確認します:
python --version
pipをアップグレードし、依存関係をインストールします:
python -m pip install --upgrade pip
pip install -r requirements.txt
これにはセットアップスクリプトやモデルダウンロード、ローカルのGradio Web UIで使用するPythonパッケージが含まれます。
3. VibeASR.cppをビルドしモデルをダウンロードする
VibeASR.cppには、C++ビルドとモデルのダウンロードを一括で行うセットアップスクリプトが含まれています。
これにより、コマンドライン/ストリーミング実行ファイルのコンパイル、必要なGGUFパッケージのインストール、量子化済みモデルのプロジェクトへのダウンロードが実行されます。
セットアップスクリプトを実行する前に、仮想環境が有効化されていることを確認してください。
まずLinux・macOSでは次を実行します:
python setup_env.py
続いてWindowsでは、w64devkit端末内で以下を実行します:
CMAKE_GENERATOR=Ninja python setup_env.py
CMAKE_GENERATOR=Ninjaを指定すると、CMakeがw64devkit環境にないMicrosoft Visual C++ではなく、Ninjaビルドシステムを使用します。
セットアップスクリプトは次を行います:
- 必要なPythonパッケージ
ggufをインストール - VibeASR.cppの設定とコンパイル
- 推論およびストリーミング実行ファイルのビルド
- 量子化済みVibeASRモデルのダウンロード
models/vibeasrに保存
完了後、主要な推論実行ファイルは以下に配置されます。
Windows:
build/bin/asr_infer.exe
Linux・macOS:
build/bin/asr_infer
実行ファイルが正しくビルドされたか、コマンドラインオプション一覧を表示して確認します。
Windows:
./build/bin/asr_infer.exe --help
Linux・macOS:
./build/bin/asr_infer --help

4. ファイルとストリーミングの文字起こしを試す
ランタイムとモデルの準備ができたら、2種類の文字起こし方法を試せます。
標準の推論実行ファイルは単一の音声ファイルを処理して完成した原稿を返します。一方、ストリーミングサーバーはモデルを常駐させ、トークン生成に合わせて逐次文字起こしを表示します。
まず、VibeASR.cppプロジェクトフォルダ内から短いサンプル録音をダウンロードします:
curl -L "https://homepages.inf.ed.ac.uk/htang2/notes/speech-samples/103-1240-0000.wav" -o recording.wav
音声ファイルは現在のプロジェクトディレクトリにrecording.wavとして保存されます。
音声ファイルを文字起こしする
標準の推論コマンドは、オーディオエンコーダと言語モデルを読み込み、録音を処理し、完成した文字起こしを出力します。
まずWindowsでは次を実行します:
./build/bin/asr_infer.exe \
--vae-model models/vibeasr/vibeasr-vae-encoder-i8_s.gguf \
--lm-model models/vibeasr/vibeasr-lm-i2_s-embed-q6_k.gguf \
--audio recording.wav \
-t 6 \
--greedy
続いてLinux・macOSでは、拡張子.exeを外して同じコマンドを使います:
./build/bin/asr_infer \
--vae-model models/vibeasr/vibeasr-vae-encoder-i8_s.gguf \
--lm-model models/vibeasr/vibeasr-lm-i2_s-embed-q6_k.gguf \
--audio recording.wav \
-t 6 \
--greedy

-t 6は推論に6スレッドを割り当てます。CPUに応じて増減してください。
--greedyは各デコーディングステップで最も尤もらしいトークンを選択し、安定した結果を得やすくします。
筆者の環境では、14.085秒の録音が約13.7秒で処理されました:
RTF: 0.9726
Speed: approximately 1.03× real time
RTF(Real-Time Factor)は処理時間を音声の長さと比較した指標です。
1.0未満であれば、実時間より速く書き起こせたことを意味します。実際の性能はCPU、OS、スレッド数、録音の長さなどで変わります。
トークン逐次のストリーミングを試す
VibeASR.cppには常駐型ストリーミングサーバーも含まれています。2つのモデルファイルを一度読み込み、そのまま待機し、毎回の再起動・再読み込みなしに複数の録音を連続処理できます。
出力は大規模言語モデルのストリーミングに近い動作です。
全文の完了を待たず、デコーダが各トークンを生成するたびにテキストが表示されます。
トークンは単語全体、語の一部、句読点など様々ですが、完成まで順次表示されます。
まずWindowsでは以下でサーバーを起動します:
./build/bin/asr_stream_server.exe \
--vae-model models/vibeasr/vibeasr-vae-encoder-i8_s.gguf \
--lm-model models/vibeasr/vibeasr-lm-i2_s-embed-q6_k.gguf \
-t 6 \
--greedy
続いてLinux・macOSでは以下を実行します:
./build/bin/asr_stream_server \
--vae-model models/vibeasr/vibeasr-vae-encoder-i8_s.gguf \
--lm-model models/vibeasr/vibeasr-lm-i2_s-embed-q6_k.gguf \
-t 6 \
--greedy

モデルの読み込みが完了し、次が表示されるまで待ちます:
---READY---
音声ファイルのパスを入力してEnterを押します:
recording.wav
文字起こしはトークン単位で表示されます。処理が完了するとサーバーは次を表示します:
---END---

モデルを再読み込みせずに、続けて別のファイルパスを入力できます。サーバーを停止するには次を入力します:
exit
この常駐ワークフローは、複数の録音を連続で処理する場合や、逐次的な文字起こし出力が必要な他アプリとVibeASR.cppを連携させる場合に特に有用です。
5. Webインターフェースを起動・検証する
VibeASR.cppには、音声ファイルのアップロードやマイク録音ができるローカルのGradio Web UIが付属します。手順はWindows・Linux・macOSで共通ですが、Windowsの実行ファイルは.exeで終わります。
Gradio、SoundFile、NumPyなど、インターフェースに必要な依存関係はすでにrequirements.txtでインストール済みです。
まず仮想環境が有効であることを確認します。
w64devkit端末を使うWindows:
. .venv/Scripts/activate
Linux・macOS:
source .venv/bin/activate
続いてWindowsでは以下で起動します:
python demo/gradio_asr_demo.py \
--port 7860 \
--bin build/bin/asr_infer.exe \
--server-bin build/bin/asr_stream_server.exe
一方、Linux・macOSではデフォルトの実行ファイルパスが自動検出されます:
python demo/gradio_asr_demo.py --port 7860
モデルパスは全OS向けにGradioスクリプト内で設定済みのため、コマンドに含める必要はありません。
また、標準推論実行ファイルとストリーミングサーバーのパスを個別に指定することも可能です。
ブラウザで以下にアクセスします:
http://127.0.0.1:7860
インターフェースを触ってみる
このインターフェースでは次のことができます:
- CPUモデルの選択
- CPUスレッド数の選択
- OnlineとOffline処理の切り替え
- Greedyデコードの有効化、または温度・Top-pの調整
- 音声ファイルをアップロード、またはマイクから直接録音
- 名前や専門用語などのホットワードを任意で追加
- 文字起こし結果、音声長、RTFの表示
ここでのOnlineモードは音声がオンラインサービスに送信されるという意味ではありません。
長い録音をチャンクに分けて逐次処理し、可能な場合はasr_stream_serverを利用します。
Offlineモードは、結果表示の前に音声全体を処理します。

短い録音を試す
最初のテストでは、マイクから短い文を直接録音し、OfflineモードでCPUスレッドを4に設定しました。

0.9584のRTFは、1秒の音声に約0.96秒を要したことを意味します。
これはおよそ実時間の1.04倍で、録音の実長よりわずかに速く完了しました。
長い録音を試す
約109.7秒の音声でもテストしました。モデルは全文の文字起こしに成功し、以下が表示されました:
RTF: 0.5305
Audio: 109.7s

つまり、1秒の音声に約0.53秒で処理できたということです。全体の書き起こしには約58秒を要し、およそ実時間の1.88倍の速度でした。
まとめ
ローカル音声認識の実用性がここまで高まったことに驚かされました。
古いCPUでも、VibeASR.cppはGPUや大容量メモリ、大きなストレージを必要とせず、実時間に近い、あるいはそれ以上の速度で音声を文字起こしできます。
コンパイル済み実行ファイルは、Pythonアプリへの組み込み、FastAPIエンドポイントでのラップ、ローカルツールの文字起こしエンジンとしての利用などにも適しています。
主に検討すべき設定は、プロセスに割り当てるCPUスレッド数です。
また、逐次的に文字起こしを表示するオンラインモードと、音声処理後に全文を返すオフラインモードのどちらを使うかも選択します。
セットアップは依然として、特にWindows・Linux・macOSでさらなる簡素化の余地があります。
プロジェクトは現在も開発中のため、インストールや事前ビルドのバイナリ提供は今後改善されるはずです。安定したスタンドアロンバイナリが提供されれば、ローカルの音声認識プロジェクトでさらに幅広く活用できると感じています。
あわせて、GPT Live Transcribe APIのチュートリアルもご覧ください。
FAQs
VibeASRモデルは実際どの言語に対応していますか?
VibeVoice-ASRモデルは標準で50以上の言語に対応しています。 英語、中国語、フランス語、イタリア語、韓国語、ポルトガル語、ベトナム語などが含まれます。 明示的な言語設定は不要で、1つの文中に複数言語が混在する「コードスイッチング」にも自動で対応できます。
MP3や動画ファイルは事前に変換が必要ですか?
コマンドライン実行ファイルのasr_inferを直接使う場合、.wavファイル(通常は16kHz、16-bitモノラル)を想定しています。MP3、M4A、FLACなど他形式の音声がある場合は、CLIに渡す前にFFmpegなどのツールでWAVへ変換してください。
話者の識別や語単位のタイムスタンプは出力できますか?
ベースのVibeVoice-ASRアーキテクチャは、「Who」(話者識別)、「When」(タイムスタンプ)、「What」(内容)を単一パスで出力する構造化出力に明示的に対応しています。 ただし、軽量なC++推論実行ファイル(VibeASR.cpp)は現在、逐次的な生テキストの文字起こしに焦点を当てています。話者IDやタイムスタンプを含む完全な構造化JSON出力を得るには、通常はPythonのtransformersライブラリでモデルを実行する必要があります。