CrossRoad

XRを中心とした技術ブログ。 Check also "English" category.

iOS/Android内蔵の音声認識エンジンを使うUnityプロジェクト「speech-and-text-unity-ios-android」を試してみました (Android 13 Pixel)

スマートフォンで音声認識をしたい場合、いろいろな方法があります。
今回はスマートフォンのOS内蔵の音声認識エンジンを使って、UnityでSpeech To Textができる「speech-and-text-unity-ios-android」というリポジトリを試したことをまとめました。

使用環境がAndroid13で、元のリポジトリと環境が合ってないためいくつかエラーが出たため、その辺のエラー解決方法なども書いています。

使用した環境
・Mac OS Ventura 13.4
・Pixel 7 (Android 13)
・Unity 2021.3.28f1

1. speech-and-text-unity-ios-androidとは

GitHubで公開されているリポジトリです。スマートフォンのOS内蔵の音声認識エンジンを使ってSpeech To TextとText To Speechが実現できます。

github.com

この記事を参考にさせていただきました。
baba-s.hatenablog.com

スマートフォンで音声認識を実現する場合、少なくとも3つの方法があります。
(1) OS内蔵の音声認識エンジンを呼び出して使う
(2) どこかの団体、企業が提供している音声認識エンジンを自分のアプリに組み込んで使う
(3) Azure/Googleなどが提供するクラウド型音声認識サービスと接続し、インターネット接続して使う

今回は(1)の方法です。以下の記事ではSpeech Recognizerとして書かれています。

Unityで音声認識機能利用 - Qiita

2. サンプルシーンを開く

GitHubリポジトリから丸ごとダウンロードして、Unity で開きます。

開いたら、Assets/SpeechAndText/Sample フォルダにあるSampleSceneを選択して、サンプルシーンを開きます。

Sample scene of 'speech-and-text-unity-ios-android'

このような画面が出ればOKです。今回はiOS/Androidで動くアプリなので、この状態でUnity Editorで実行して赤いマイクボタンを押しても"Not Support in Editor"という表示が出ます。

The STT app is not supported in Unity Editor

これが確認できたらOKです。

3. Pixel7 (Android13) におけるビルド設定と手順

ここに一番はまりました。。

大まかに手順を解説します。最初にBuild Setting画面にしてAndroidにSwitch Platformしていることを前提にしています。

(1) Project Settings > Player のCompany NameとProduct Nameを任意の言葉に変更する

ここが変更されないと、インストール時にエラーになることがあります。ここではCompany Name をlimes、Product NameをSTT_limesとしました。

Project Settings on Unity Android

(2) Project Settings > Player のIdenticationで target levelを33にする

今回はPixel 7 がAndroid 13なのでMinimumもTargetもlevelを33にします。

Minimum target level of Project Settings on Unity Android

LevelとOSのバージョン対応表はこちらにあります。

developer.android.com

(3) Project Settings > Player のConfigurationでScripting BackendをMonoから IL2CPPに変更する

Scripting Backend of Project Settings on Unity Android

(4) Project Settings > Player のTarget Architechtureで、ARM64を選択する

(3)によってIL2CPPに変更しているため、ARM64が選択できるようになっています。

Activate ARM64 of Project Settings on Unity Android

(5) Assets/Plugins/Android/AndroidManifest.xmlを修正する

(4) まで実施することで、apkのビルドはできます。しかし、インストールが失敗するか、インストールできても「インストールされていません」というメッセージが出て起動することができません。

これを回避するには、Visual Studio CodeなどでAndroidManifest.xmlを開き、android:exported="true"を追記します。

    <activity 
      android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize"
      android:name="com.starseed.speechtotext.MainActivity"
      android:exported="true">
      <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
      </intent-filter>
    </activity>   

(6) [Optional] Filesアプリに提供元不明アプリインストールの許可をつける

これは、apkファイルをスマートフォンにコピーし、スマートフォン内でインストール作業をする場合です。UnityからBuild and Runでインストールする場合は不要です。

こちらに記載があるのですが、Android7以前はスマートフォン全体の設定でアプリインストールの許可ができました。
Android8以降は、apkを管理するアプリ単位でインストールの可否を個別に許可する必要があります。今回はAndroid13なので後者ですね。

sp7pc.com

4. 動作確認

Pixel7で動かすとこのようになります。赤いマイクを押してから英語で話すと、話をした結果がテキストで表示されます (画像左)。

Speech Recognizer results on Unity Android app

また、この画面の中では日本語非対応なのですが、上にあるInputFieldに"ja-JP"と入力してから"Apply"ボタンを押せば日本語に対応します (画像右)。

英語モードのときに「Today is a rainy day」と発話し、日本語モードのときに「今日は雨です」と発話してみました。内蔵音声認識エンジンなのですぐに応答し、精度も良い印象です。

なお、このアプリは赤いマイクボタンを1回だけタッチすると数秒間音声認識モードになります。マイクボタンを押しっぱなしにするとアプリが落ちます。


2023/8/29追記

ビルドに詰まったときのログや解決方法については、こちらにまとめました。

www.crossroad-tech.com


5. おわりに

機会あれば、iOSでのビルド結果も試してみたいと思います。