Unityで音声認識

Unityで音声認識をするための勉強

 

Unity 2017.3

 

求める音声認識の条件

・PC、Andoroidで認識できる(できればデバイスを選ばない)

・日本語対応

 

備考

・トリガーキー

音声入力するのにキー操作が必要なのは本末転倒だが

PCなら不要、スマホなら何かしらのトリガーをつけないと消費電力ヤバそう。

・通信

Googleの音声認識みたいに一度通信をする必要があるヤツは

ローカルでは使えないけど精度が高そう

・金額

無料が望ましい・・・が

有料で使えそうなものがあるなら買ってもOK

 

色々調べるも、今の実力では簡単には行きそうにないので

今回は最低限のWindows10だけで音声認識ができる状態にする。

 


Microsoftのページで

Unityの音声認識を取り扱ってるページを発見したので試してみる

https://docs.microsoft.com/ja-jp/windows/mixed-reality/voice-input-in-unity

 


【事前準備】

windows の設定>プライバシー>マイク
アプリがマイクにアクセスできるようにする:オン
デスクトップアプリがマイクにアクセスできるようにする:オン

 

 

【フレーズ認識】

指定したキーワードがあった場合にアクションを行う。

 

●音声認識を有効にする
Edit > Project Settings > Player

Windows Storeタブ
Publishing Settings > Capabilities
「Microphone」にチェックをつける

 

※反応しない場合は

windows 設定>音声認識、手書き~>音声認識サービスと入力候補をオンにします のボタンを押してみる

 

KeywordRecognizerについてはここを参照

https://docs.unity3d.com/ja/current/ScriptReference/Windows.Speech.KeywordRecognizer.html

 

ソースは紹介されているものをログに出力するように加工

とりあえず自分なりのコメントで分かったつもりになってみる。

using System.Collections;
using System.Collections.Generic;   //Windowsの音声認識で使用(最初から指定されてる)
using UnityEngine;
using UnityEngine.Windows.Speech;   //Windowsの音声認識で使用
using System.Linq;                  //Windowsの音声認識で使用

public class Script_VoiceInput : MonoBehaviour {
       
    KeywordRecognizer keywordRecognizer;
    Dictionary<string, System.Action> keywords = new Dictionary<string, System.Action>();

	void Start () {


        //反応するキーワードを辞書に登録
        keywords.Add("こんにちは", () =>{
            Debug.Log("「こんにちは」をキーワードに指定");
        });

        keywords.Add("おはよう", () =>{
            Debug.Log("「おはよう」をキーワードに指定");
        });

        //キーワードを渡す
        keywordRecognizer = new KeywordRecognizer(keywords.Keys.ToArray());
		
        //キーワードを認識したら反応するOnPhraseRecognizedに「KeywordRecognizer_OnPhraseRecognized」処理を渡す
        keywordRecognizer.OnPhraseRecognized += KeywordRecognizer_OnPhraseRecognized;
        
        //音声認識開始
        keywordRecognizer.Start();
        Debug.Log("音声認識開始");
	}
	



	void Update () {
		
	}


    //キーワードを認識したときに反応する処理
    private void KeywordRecognizer_OnPhraseRecognized(PhraseRecognizedEventArgs args){
        
        //デリゲート
        //イベントやコールバック処理の記述をシンプルにしてくれる。クラス・ライブラリを活用するには必須らしい
        System.Action keywordAction;// keywordActionという処理を行う

        //認識されたキーワードが辞書に含まれている場合に、アクションを呼び出す。
        if (keywords.TryGetValue(args.text, out keywordAction)){
           // keywordAction.Invoke();
            Debug.Log("認識した");
        }
    }

    
}

 

このスクリプトを空のGameObjectに張り付けて実行

 

 

ボイスロイド:東北きりたんにしゃべってもらった

うまく動いてくれた。

キーワードとして指定した「おはよう」、「こんにちは」は反応して

登録してない単語「こんばんは」には反応しない。

 

 

以下のエラーが出て反応しない人はこちらを確認してみてください。

UnityException: Speech recognition is not supported on this machine.

Unity音声認識のエラーが倒せない

 


【ディクテーション】

音声をテキストに変換する。

 

●ディクテーション機能を有効にする
Edit > Project Settings > Player

Windows Storeタブ
Publishing Settings > Capabilities
InternetClient」にチェックをつける

※もしかしたらコルタナさんで音声認識を許可しておかないといけないかも?

 

DictationRecognizerについてはここを参照

https://docs.unity3d.com/ja/current/ScriptReference/Windows.Speech.DictationRecognizer.html

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Windows.Speech;   //Windowsの音声認識で使用


public class Script_VoiceText : MonoBehaviour {
    
    DictationRecognizer dictationRecognizer;

	void Start () {
		dictationRecognizer = new DictationRecognizer();
        
        //ディクテーションを開始
        dictationRecognizer.Start();
        Debug.Log("音声認識開始");

	}
	
	void Update () {
		
        dictationRecognizer.DictationResult += DictationRecognizer_DictationResult;//DictationRecognizer_DictationResult処理を行う
        
        dictationRecognizer.DictationHypothesis += DictationRecognizer_DictationHypothesis;//DictationRecognizer_DictationHypothesis処理を行う

        dictationRecognizer.DictationComplete += DictationRecognizer_DictationComplete;//DictationRecognizer_DictationComplete処理を行う
        
        dictationRecognizer.DictationError += DictationRecognizer_DictationError;//DictationRecognizer_DictationError処理を行う

	}

    //DictationResult:音声が特定の認識精度で認識されたときに発生するイベント
    private void DictationRecognizer_DictationResult(string text, ConfidenceLevel confidence){
        Debug.Log("認識した音声:" + text);
    }
    
    //DictationHypothesis:音声入力中に発生するイベント
    private void DictationRecognizer_DictationHypothesis(string text){
        Debug.Log("音声認識中:"+ text);
    }

    //DictationComplete:音声認識セッションを終了したときにトリガされるイベント
    private void DictationRecognizer_DictationComplete(DictationCompletionCause cause){
        Debug.Log("音声認識完了");
    }

    //DictationError:音声認識セッションにエラーが発生したときにトリガされるイベント
    private void DictationRecognizer_DictationError(string error, int hresult){
        Debug.Log("音声認識エラー");
    }


}

 

空のGameObjectに貼り付けて実行

 

正 解「Unity音声認識」

認識後「Unityって音声認識」

 

ちょっと間違ってるけど、いい感じで認識してくれた。

 

 


注意点

  1. 認識装置が起動し、最初の5秒間音声が聞こえない場合は、タイムアウトになる。
  2. 認識装置が結果を与えたが20秒間無音を聞くと、認識装置はタイムアウトする。

 

※フレーズ認識とディクテーションの両方を使用する場合

アプリケーションでフレーズ認識とディクテーションの両方を使用する場合は、

もう一方を開始する前に完全にシャットダウンする必要があるとのこと。

 

 

とりあえずPC側での音声認識はOK

 

 

ミクさんに踊ってもらう

 

 

 

 

 

2019.6追記

https://docs.microsoft.com/ja-jp/azure/cognitive-services/speech-service/quickstart-csharp-unity

Unity 用 Speech SDK は、現在ベータ版です。 Windows デスクトップ (x86 および x64) またはユニバーサル Windows プラットフォーム (x86、x64、ARM/ARM64)、および Android (x86、ARM32/64) がサポートされています。

こんなの出てた。今度試してみる。

 

 

 

関連記事




コメントを残す

※コメントは承認後に表示されます。
 コメントを公開されたくない場合、名前の後に「:非公開」とつけてください。