5
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Unityで音声認識を試してみた4パターン(Vosk / Whisper.cpp / SAPI / UnityEngine.Windows.Speech)

Last updated at Posted at 2025-10-22

はじめに

オフラインで日本語音声認識をUnity上で動かしたくて、
以下の4つの方法を実際に試しました。

  1. Vosk + Unity
  2. Whisper.cpp + Unity
  3. Windows Speech Recognition (SAPI)
  4. UnityEngine.Windows.Speech

それぞれの動作結果・対応状況・導入の注意点をまとめます。


🧩 概要比較

手法 オフライン 日本語 英語 対応状況 備考
Vosk + Unity ◎ 安定動作 DLL連携でシンプルに実装可
Whisper.cpp + Unity ○ 動作 DLL自作が必要。軽量モデル推奨
Windows Speech Recognition (SAPI) × 非対応 Unityランタイムでは使用不可
UnityEngine.Windows.Speech △ 条件付き OS設定に依存。英語環境で安定

1. Vosk + Unity

特徴

  • 完全オフラインで動作
  • 日本語・英語モデルが提供されている
  • 軽量で短文の認識が速い

導入手順(要点)

  1. 公式リポジトリからC#バインディングを導入
  2. libvosk.dll と依存DLLをプロジェクトに追加
  3. 音声モデルを Assets/StreamingAssets/vosk-model-small-ja-0.22 などに配置
  4. 認識呼び出し(例):
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より高め)

手順(要点)

  1. whisper.cpp を取得し、BUILD_SHARED_LIBS=ON で DLL をビルド
  2. モデル(例:ggml-tiny.bin, ggml-small.bin)を Assets/StreamingAssets/Whisper/ に配置
  3. 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

参考リンク


※ 本文中のファイルパスや設定名は一例です。環境に合わせて適宜読み替えてください。

最後に

この記事はChatGPTとのやり取りをそのままMarkdown形式でまとめて書き出してって言ったものをコピペしました。
いや~ちゃんと要点がまとまっているし、いいじだいだな~
一応これは、自分が忘れないようです。

5
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?