LoginSignup
3

More than 1 year has passed since last update.

[Unity] Android・iOSでネイティブの音声テキスト認識を実装する

Last updated at Posted at 2021-11-18

はじめに

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で指定しています。

info.plist
<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のデフォルトのオーディオ機能を無効化できます。
EditProjectSettingsAudioDisable Unity Audioです。
Audioを参考
 2021-11-17 20.44.40.png

AndroidManifestの変更

オーディオのパーミッションの許可が必要です。
android.permissionn.RECORD_AUDIO
また、オンラインで音声入力をしたいので、android.permissions.INTERNETを許可する必要があります。

AndroidManifest.xml

成果物

ビルドしてもらい実機で確認可能です。該当Sceneはこちら。

SpeechRecognitionTestScene.unity

AndroidStudio Logcatでは下記のようになります。
(Gif画像あり)
logcat.gif

参考文献

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
3