※ 2023/11/03 更新
ソースコードへOnDestroy()の追加
2023年時点で簡易的に音声認識(音声入力)を行う方法を自身なりにまとめました。
ここで言う、音声認識とは
音声を認識して、それをテキストへ文字起こしする機能のことです。
Unityで音声認識を実装する方法は多数あります。
Web Speech API , Google Cloud Speech API , Intel RealSenseなどなど。
その中でも、今回は、
「UnityEngine.Windows.Speech」を使用した
音声認識(音声入力)をご紹介いたします。
UnityEngine.Windows.Speechはキーワード認識だけではない
UnityEngine.Windows.Speechはキーワードを登録して、そのキーワードが発せられたらtrue(発せられましたという信号)を返す機能が注目されがちです。
ですが、UnityEngine.Windows.Speechには、これ以外に、発せられた音声をそのままテキストで返す。音声認識(音声入力)も存在します。
今回は、その音声認識について紹介します。
注意
先に注意点をお話しします。
自身の実装しているUnityEngine.Windows.Speechの音声認識機能では、
以下の注意が必要です。
・WebGL形式での出力不可
・「あーーーーーーーーー」という音声を発した時、
「あー」というテキストに省略される。(伸ばし棒は省略される)
・音声認識速度は遅い
認識して文字が出力されるまで時間がかかる
上記に関して、現段階では実装はできていません。
あらかじめご了承ください。
実装方法
手順は3つで完了します。
① スクリプトの作成
② スクリプトのアタッチ
③ Windows側の設定
① スクリプトの作成
以下のスクリプトを作成します。
作成方法は通常通りで大丈夫です。
using System.Collections; using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; using UnityEngine.Windows.Speech; /* * 注意 * ・WebGL形式での出力不可 * ・「あーーーーーーーーー」という音声を発音しても、「あー」に省略される。 * (伸ばし棒は省略される) * * 設定(windows11) * ・機能を使用するには * 設定→プライバシーとセキュリティ→音声認識→オンライン音声認識 をオンにする * */ public class VoiceText : MonoBehaviour { public Text text_; public DictationRecognizer m_DictationRecognizer; // オブジェクトが破棄されるとき private void OnDestroy() { // 破棄 // 下記を記載しないと処理中断時にエラーになる m_DictationRecognizer.Stop(); m_DictationRecognizer.Dispose(); } void Start() { text_.text = ""; m_DictationRecognizer = new DictationRecognizer(); // 発音終了時 //DictationResultのイベントを登録 m_DictationRecognizer.DictationResult += (text, confidence) => { //音声認識した文章はtextで受け取れます。 text_.text = text; }; /* // 発音中 m_DictationRecognizer.DictationHypothesis += DictationRecognizer_DictationHypothesis; */ // 音声入力停止時に再起動 m_DictationRecognizer.DictationComplete += (completionCause) => { if (completionCause == DictationCompletionCause.TimeoutExceeded) { //音声認識を起動。 m_DictationRecognizer.Start(); } else { //その他止まった原因に応じてハンドリング } }; //Dictationを開始 m_DictationRecognizer.Start(); } /* private void DictationRecognizer_DictationHypothesis(string text) { text_.text = text; } */ }
② スクリプトのアタッチ
・Scene側で空オブジェクトを作成(名前は適当で大丈夫)
・その空オブジェクトに、①のスクリプトをアタッチ。(貼り付け)
・仮のテキスト作成。
・①のスクリプトのpublic text_に仮のテキストをアタッチ。
(Unity側でスクリプトに、text_ (None)にテキストをドラッグ&ドロップ)
③ Windows側の設定
この状態で実行したとき、エラーが発生する場合は、
以下の設定を行ってみましょう。
・Windows11の場合
Windowsの方の設定を開く(UnityではなくPCの設定の方です)
↓
プライバシーとセキュリティ
↓
(Windowsのアクセス許可)音声認識
↓
オンライン音声認識
をオンにする
・Windows10の場合
Windowsの方の設定を開く(UnityではなくPCの設定の方です)
↓
プライバシー
↓
音声認識
↓
オンライン音声認識
をオンにする
この設定は、
Webを介したマイクを使用する許可になります。
この許可がない場合、利用できません。
実行
上記の対応完了後、実行すると、以下のように音声認識が完了していると思います。
発音中に処理を取りたい場合
発音中にテキストを受け取りたい場合は、
以下のスクリプトで実行してください。
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; using UnityEngine.Windows.Speech; /* * 注意 * ・WebGL形式での出力不可 * ・「あーーーーーーーーー」という音声を発音しても、「あー」に省略される。 * (伸ばし棒は省略される) * * 設定(windows11) * ・機能を使用するには * 設定→プライバシーとセキュリティ→音声認識→オンライン音声認識 をオンにする * */ public class VoiceText : MonoBehaviour { public Text text_; public DictationRecognizer m_DictationRecognizer; // オブジェクトが破棄されるとき private void OnDestroy() { // 破棄 // 下記を記載しないと処理中断時にエラーになる m_DictationRecognizer.Stop(); m_DictationRecognizer.Dispose(); } void Start() { text_.text = ""; m_DictationRecognizer = new DictationRecognizer(); /* // 発音終了時 //DictationResultのイベントを登録 m_DictationRecognizer.DictationResult += (text, confidence) => { //音声認識した文章はtextで受け取れます。 text_.text = text; }; */ // 発音中 m_DictationRecognizer.DictationHypothesis += DictationRecognizer_DictationHypothesis; // 音声入力停止時に再起動 m_DictationRecognizer.DictationComplete += (completionCause) => { if (completionCause == DictationCompletionCause.TimeoutExceeded) { //音声認識を起動。 m_DictationRecognizer.Start(); } else { //その他止まった原因に応じてハンドリング } }; //Dictationを開始 m_DictationRecognizer.Start(); } private void DictationRecognizer_DictationHypothesis(string text) { text_.text = text; } }
// 発音終了時
にコメントを付け。
// 発音中
のコメントを外しました。
おわりに
今回は音声認識を実装する方法を説明しました。
この記事が何かのお役に立てれば幸いです。
Web(frog blend)
・公式HP「ふろっぐぶれんどのゲームセンター」
・外部リンクまとめ