はじめに
UnityでAndroid、iOSのネイティブ音声テキスト認識のサンプルを作成しました。
実装方法などの忘却録。
Android
iOS
Apple公式のサンプル
使用環境
macOS Big Sur 11.6.1
Unity 2021.1.26f1
Android Studio 4.0.1
Swift5.0
Android Native Pluginの作り方
Android Pluginのmodule作成の基本的な作り方をまとめていますので、参考までに。
iOS Native Pluginの作り方
iOS Pluginのmodule作成の基本的な作り方をまとめていますので、参考までに。
Androidの実装について
UnitySendMessageを使う際には「jar」ファイルをインポートする必要がありますので、下記で確認出来ます。
この設定をしておかないとコードを書いた時にimportエラーが出ます。
UnitySendMessageの引数説明
UnitySendMessage("GameObject名","関数名","引数");
- 第一引数にGameObject名、ここでは
callbackTarget
でUnityから指定してます。 - 第二引数に関数名、ここでは
callbackMethod
でUnityから指定してます。 - 第三引数にUnity側で受け取る文字列を指定しています。
また、音声認識を行うために必要なSpeechRecognizer
クラスが**メインスレッド**でしか動作しない。
NativeSpeechRecognizer.java
iOSの実装について
「ビルド周りのEditor拡張」が必要です。
また、下記の2点をinfo.plistに追加しないとクラッシュしますので、注意が必要です。
こちらをビルド時に追加するのでPostProcessor.cs
で指定しています。
<key>NSMicrophoneUsageDescription</key>
<string>音読音声の認識にマイクを使用します</string>
<key>NSSpeechRecognitionUsageDescription</key>
<string>音読音声の認識に音声認識を利用します</string>
PostProcessor.cs
NativeSpeechRecognizer.swift
NativeSpeechRecognizer.mm
Unity側のコード
ランタイムパーミッション要求が必要
音声認識で使用するマイクパーミッションの許可を取得しないといけません。
コードはこちらを参考にさせて頂きました。
最初にマイクが許可されているかを調べ、無ければ権限をリクエストします。
#if UNITY_IOS
yield return Application.RequestUserAuthorization(UserAuthorization.Microphone);
if (Application.HasUserAuthorization(UserAuthorization.Microphone)) {
} else {
Debug.Log("[iOS] Microphone not found");
}
#endif
#if UNITY_ANDROID
// マイクパーミッションが許可されているか調べる
if (!Permission.HasUserAuthorizedPermission (Permission.Microphone)) {
// 権限が無いので、マイクパーミッションのリクエストをする
yield return RequestUserPermission (Permission.Microphone);
} else {
Debug.Log("[Android] Microphone not found");
}
#endif
こちらMicrophone.devices
でマイクデバイスの一覧の取得をしています。
イヤホンの時もありますね。
foreach (var device in Microphone.devices)
{
Debug.Log("Name: " + device);
_text.text = _text.text+"\n " + device;
}
NativeSpeechRecognizerView.cs
また、Disable Unity Audio
にチェックが入っているとマイクデバイスが取得出来ません。
※ ここをチェックを入れるとUnityのデフォルトのオーディオ機能を無効化できます。
Edit
→ProjectSettings
→Audio
→Disable Unity Audio
です。
Audioを参考
AndroidManifestの変更
オーディオのパーミッションの許可が必要です。
android.permissionn.RECORD_AUDIO
また、オンラインで音声入力をしたいので、android.permissions.INTERNET
を許可する必要があります。
AndroidManifest.xml
成果物
ビルドしてもらい実機で確認可能です。該当Sceneはこちら。
SpeechRecognitionTestScene.unity
AndroidStudio Logcatでは下記のようになります。
(Gif画像あり)
参考文献