はじめに
オフラインで日本語音声認識をUnity上で動かしたくて、
以下の4つの方法を実際に試しました。
- Vosk + Unity
- Whisper.cpp + Unity
- Windows Speech Recognition (SAPI)
- UnityEngine.Windows.Speech
それぞれの動作結果・対応状況・導入の注意点をまとめます。
🧩 概要比較
| 手法 | オフライン | 日本語 | 英語 | 対応状況 | 備考 |
|---|---|---|---|---|---|
| Vosk + Unity | ✅ | ✅ | ✅ | ◎ 安定動作 | DLL連携でシンプルに実装可 |
| Whisper.cpp + Unity | ✅ | ✅ | ✅ | ○ 動作 | DLL自作が必要。軽量モデル推奨 |
| Windows Speech Recognition (SAPI) | ❌ | ✅ | ✅ | × 非対応 | Unityランタイムでは使用不可 |
| UnityEngine.Windows.Speech | ❌ | ✅ | ✅ | △ 条件付き | OS設定に依存。英語環境で安定 |
1. Vosk + Unity
特徴
- 完全オフラインで動作
- 日本語・英語モデルが提供されている
- 軽量で短文の認識が速い
導入手順(要点)
- 公式リポジトリからC#バインディングを導入
-
libvosk.dllと依存DLLをプロジェクトに追加 - 音声モデルを
Assets/StreamingAssets/vosk-model-small-ja-0.22などに配置 - 認識呼び出し(例):
using Vosk;
var model = new Model("vosk-model-small-ja-0.22");
var rec = new Recognizer(model, 16000.0f);
// マイクのPCMを渡して rec.AcceptWaveform(...)
ビルド時の注意
- DLL は Assets/Plugins/x86_64/ に置くか、PostBuildで出力先にコピーする
- 依存DLL(例:
libstdc++-6.dll,libgcc_s_seh-1.dll,libwinpthread-1.dll)も同梱
2. Whisper.cpp + Unity
特徴
- OpenAI Whisper のC++実装
- 高精度・多言語対応(英語・日本語ともに強い)
- CPUのみでも動作可能(負荷はVoskより高め)
手順(要点)
- whisper.cpp を取得し、
BUILD_SHARED_LIBS=ONで DLL をビルド - モデル(例:
ggml-tiny.bin,ggml-small.bin)をAssets/StreamingAssets/Whisper/に配置 - C# から DLL を
DllImportで呼び出す
安定化のポイント
- 直接
whisper_full_default_params()を呼ぶとエディタが固まる事例あり
→ DLL側でブリッジ関数(例:whisper_full_greedy)をエクスポートし、
既定パラメータ設定~実行までをネイティブ側で完結させると安定
3. Windows Speech Recognition (SAPI)
結果
- .NETアプリでは使用可だが、Unityからは非対応
- 理由:SAPIはCOM/レジストリ依存。UnityのMono/IL2CPP環境からは直接アクセスできないため初期化で例外発生
補足
- 外部C#プロセスでSAPIを動かし、UnityとIPC通信する構成なら可能だが、今回は見送り
4. UnityEngine.Windows.Speech
特徴
- Unity標準API(
DictationRecognizer,KeywordRecognizer) - 内部的にWindows Speech Service(WinRT)を利用
- 手軽に導入でき、英語で安定
最小実装(ボタンで開始/停止し、結果をログ出力)
using UnityEngine;
using UnityEngine.Windows.Speech;
public class DictationRecognizerButton : MonoBehaviour
{
private DictationRecognizer recognizer;
private bool isListening;
void Start()
{
recognizer = new DictationRecognizer();
recognizer.DictationResult += (text, confidence) => Debug.Log("[Speech] " + text);
recognizer.DictationError += (error, hresult) => Debug.LogError("[Speech] Error: " + error + " (" + hresult + ")");
Debug.Log("[Speech] Initialized.");
}
public void OnButtonClick()
{
if (!isListening) { recognizer.Start(); isListening = true; Debug.Log("[Speech] Start"); }
else { recognizer.Stop(); isListening = false; Debug.Log("[Speech] Stop"); }
}
void OnDestroy()
{
if (recognizer != null) { recognizer.Stop(); recognizer.Dispose(); }
}
}
事前設定(重要)
- Windows の「音声認識」を有効化(設定 → プライバシー/音声)
- 英語認識が目的なら、音声の言語を English (United States) に設定
- 多くの環境でクラウド処理に依存(完全オフラインは不可)
英語対応まとめ
| 手法 | 英語対応 | 備考 |
|---|---|---|
| Vosk | 可能 |
vosk-model-en-us-0.22 等の英語モデルを使用 |
| Whisper.cpp | 可能(高精度) | 自動言語判定あり。英語は特に強い |
| SAPI | 可能 | ただしUnityからは非対応 |
| UnityEngine.Windows.Speech | 可能 | Windowsの音声設定が英語であることが前提 |
まとめと推奨
- オフライン・軽量・実装容易:Vosk + Unity
- 高精度・多言語:Whisper.cpp + Unity
- Windows標準APIをそのまま:SAPIはUnityでは不可(見送り)
- 手早く英語コマンド入力:UnityEngine.Windows.Speech
参考リンク
-
Vosk API: https://github.com/alphacep/vosk-api
-
whisper.cpp: https://github.com/ggerganov/whisper.cpp
-
DictationRecognizer: https://docs.unity3d.com/ScriptReference/Windows.Speech.DictationRecognizer.html
-
先人の知恵
vosk-unity-asrを使ってUnityでローカルの音声認識処理を行う
vosk-unity-asr
whisper.unity
Unity Sentisを使ったローカルで高速なspeech-to-text
Unityで音声認識(Speech to text)
※ 本文中のファイルパスや設定名は一例です。環境に合わせて適宜読み替えてください。
最後に
この記事はChatGPTとのやり取りをそのままMarkdown形式でまとめて書き出してって言ったものをコピペしました。
いや~ちゃんと要点がまとまっているし、いいじだいだな~
一応これは、自分が忘れないようです。