先日、Unity Technologiesより、新しいアセット「Speech To Text」が発表されました。
Unity謹製の音声入力アセットが来た!!
— ゆーじ (@yuujii) 2016年8月14日
GoogleだけじゃなくてWindowsやWatson、Wit.aiの音声認識をUnityで扱えるようになるアセット。革命起きちゃったっぽい。
Speech-to-Texthttps://t.co/jyb06QRlv8
最近、UWPやHoloLens関連でCortanaを調べていたり、
Androidなど他OSでの音声認識エンジンをUnityで使う方法を調べていたので、せっかくなのでSpeech To Textについても調べてみました。
=================================
目次
1. Speech-to-Textとは?
2. 準備
2-1. アセットインポート
2-2. サービス登録
3. サンプルの動作確認
4. ソースコードの構成
5. その他Tips
6. 終わりに
=================================
1. Speech-to-Textとは?
Unity Technologies社が2016/8/12(現地時間)に公開したアセットです。価格は無料です。
何ができるの?
「SpeechをTextに」という言葉通り、喋った音声をテキストにすることができます。
Provides a wrapper for several speech-to-text solutions and a sample scene that compares text transcriptions from each API.
とあるように、既存の音声認識エンジンをUnityで使えるようにしたアセットです。
サンプルシーンでは、4種類の音声認識エンジンを使って、同時に認識結果を表示できます。
「既存の音声認識エンジン」はどんなもの?
以下の4種類です。
(1) UnityEngine.Windows.Speech
Unity5.4から標準搭載されたエンジンです。
情報がないのでCortanaとの違いがわかりませんが、WindowsOS用の認識エンジンと思われます。
ネットワークの接続を切ると、下記のようなエラーが出て実行できないため、ネットワーク接続は必須です。
他エンジンと異なり、唯一API Keyなどの指定が不要です。
ただし、感覚的には認識精度はあまり高くないと感じました。
Googleが提供する様々なサービスの総称「Google Cloud Platform(GCP)」の一つです。
マイクから取得した音声を音声データに変換し、それをPOSTすることで、認識結果の文字列をjson形式で受け取ります。
POST用の音声データ変換には、SoX(Sound eXchange)というOSSを使います。
色々見ていると、Pythonでの使い方紹介が多い印象です。
なお、Google Cloud Speech APIは60日までは無償利用可、以後は利用体系に応じて料金がかかります。
(3) IBM Watson Speech to Text
IBMが提供する様々なサービスの総称「Bluemix」の一つです。
[補足]
BluemixとWatsonの関係について明確に書いてある記述がありませんでした。
しかし、IBMのBluemixのサービス一覧紹介サイトに「Watson AlchemyAPI」があり、
アプリ内で自然言語処理とコンピューター・ビジョンを利用して、世界の会話、文書、写真を深く理解できるようにします。
とあるので、Bluemixの一部と解釈しました。
実際、Watson Speech to Textの使用にはBluemixアカウントが必要なので、解釈はそんなにずれてないと思いますが、違っていたらご指摘いただけると助かります。
(4) Wit.ai
botとの会話ができるサービスです。
Wit.aiについては、下記がわかりやすかったです。
上記を参考に解説すると、Wit.aiは、自分で定義した会話文に基づいてシナリオを進行できるサービスです。
なので、記事の中にもある通り、最初に自分でシナリオを定義していく必要があります。
【上記ブログより引用したシナリオの例】
1.「天気教えて?」→bot「オーケーオーケーどこの天気だい?」
2.「ロンドン」(地域はどこでも可)→bot「そこは晴れてるよ」
Wit.aiのHPおよび使い方の解説記事を見ていくと、botとの会話はテキストベースであり、ユーザ側の会話のきっかけにはテキスト入力or音声が選べます。
(今回のUnityアセットは、ここの音声入力のみを使っています)
ところで、蛇足ですが、Wit.aiとあるので、AI(Artificial Intelligence)的な要素はどこだろうと疑問に思ったのですが、上記ブログの最後で定義した言葉と多少ずれても会話ができる、という記載がありました。
また、下記のブログによると、シナリオ作成時に、会話に使えそうな候補を次々出してくれるそうです。
ということで、私はこの辺りがAIと解釈しました。
2. 準備
2-1. アセットインポート
(注) Unityのバージョンが5.4以上である必要があります。
2-1-1. Watson SDK
まずはUnityでプロジェクトを作り、アセットストアからSpeech-to-Textを入手してインポートします。
インポートすると、いきなり多数のエラーが出ます。
これはWatson Developer Cloud Unity SDKが入っていないためで、ReadmeにもWatsonサイトから入手してください、という記載があります。
SDKはここから入手できます。
2016/8/15時点では、unity-sdk-0.3.0.zipが最新版でした。
これを解凍するとunity-sdkというフォルダが生成されるので、Watsonというフォルダ名に変更します。
中身はこのようになっています。
このWatsonフォルダをAssets直下にコピーします。ここまで進めると、Unityプロジェクトのフォルダ構成はこのようになり、先ほどのエラーが消えます。
なお、Watson SDKをインポートすると、さらに新しいエラーがでます。
これは、TouchScriptというアセットがないので削除します、というエラーです。
TouchScriptがなくてもシーン実行ができるし、TouchScriptは今回のアセットの機能とは関係ないため、このまま続けて大丈夫です。
ちなみに、WatsonSDKは、Speech-to-Textアセットのスクリプトの中で呼ばれています。
そのため、もしWatsonを使わない場合であっても、
・とりあえずSDKをインポートする
・関連部分を全部コメントアウトする
のどちらかが必要です。
2-1-2. SoX
SoXとは、Sound eXchangeという音声ファイル変換ツール(コマンド)です。
元々Linux系の中で有名なコマンドですが、Windows系でも使えるようになっています。
今回はここから14.4.2を入手しました。
入手したsox-14.4.2-win32.zipを解凍し、Assets/StreamingAssetsフォルダの中に、新しくThirdParty/SoX/Windowsというフォルダを作ります。
ここにsox-14.4.2-win32フォルダの中身をそのまま入れます。
これで、インポート作業は完了です。
2-2. サービス登録
使いたいサービスに登録します。ここは先ほどのインポート時とは異なり、使わないサービスは登録しなくても大丈夫です。
なお、今回の検証では、このアセットが音声からテキスト変換する既存サービスのWrapperということがわかったので、IBM Watsonの検証は実施しませんでした。
そのため、Watsonのサービス登録や動作確認はできていませんが、本ブログの2-1の作業が終わっていれば、Google Speech APIと同様の手順により、APIusername/passwordを取得すれば動作すると思います。
2-2-1. Google Cloud Speech API (Non Streamingの場合)
(1) まずはサイトにアクセスし、「コンソールへ移動」をクリックします。
(2) Googleアカウントでログインすると、ポータル画面が表示されます。ここで、API Managerを選択します。
(3) 検索フォームで「Speech」と入力します。Google Cloud Speech APIが検索候補に出てくるので選択します。
(4) 画面中心の上付近で「有効にする」を選択します。
(下記の画像は「有効にする」を選択後なので「無効にする」と表示されていますが)
(5) 続けて、認証情報の登録を行います。下記の画面から「認証情報に進む」を選択します。
指示に従って登録していきます。
APIを呼び出す場所、については、色々な種類がありましたが、今回は「その他のUI」を選択しました。
次は APIキーを生成します。今回は名称をTestとしました。
リクエストを受けるサーバ IPアドレスについては、とりあえず空欄でも大丈夫です。
APIキーが生成されたら、Unityに戻ります。Hierarchy Viewの
Canvas/ SpeechToTextServiceWidgets/ GoogleNonStreamingSpeechToText にあるコンポーネントにAPI Keyをコピペします。
2-2-2. Google Cloud Speech API (Streamingの場合)
Google Cloud Speech APIのAPI Keyを登録すると、ポータル画面に「認証情報」という項目が追加されます。
これをクリックすると、このように認証情報を作成する画面が出てくるので、「サービスアカウントキー」を選択します。
すると、
・ App Engine default service account
・ Compute Engine default service account
という二種類の形式を選択する画面になります。それぞれの違いは調べられていませんが、今回のサンプル検証ではApp Engineを選択して動作しました。
キーファイルはjsonとP12と二種類の形式が選択できますが、今回はJSON形式を選択します。
処理を進めていくと、json形式の証明書ファイルを入手できます。
(ブラウザ設定を変えていなければ、Downloadフォルダに生成されます)
このファイルの名称をcredentials.jsonと変更し、Unity側の
Assets/StreamingAssets/GoogleStreamingSpeechToTextProgram
のフォルダにインポートします。
2-2-3. Wit.ai
Wit.aiのサイトにアクセスします。
githubかFacebookでログインし、表示されたポータル画面の右上にある"+"マークを選択して、New Appを選択します。
App作成画面になるので、名称、公開範囲を設定して + Create Appします。
続けて、作成したApp画面の右上付近にあるSettingsを選択します。
表示されたページの真ん中付近にある、API DetailsにServer Access Tokenという項目があります。
ここで表示されている文字列をコピーします。
あとは、Unity側で、
Canvas/ SpeechToTextServiceWidgets/ WitAiNonStreamingSpeechToTextのコンポーネントにAccess Tokenを指定すれば完了です。
3. サンプルの動作確認
[前提]
・インターネットに接続されている
・マイクが接続されている
なお、動作確認は、
・Windows 10 Pro
・Unity 5.4.0f3 Personal
で実施しました。
speechToTextComparison.unityを開き、シーン実行して、「Start Recording」というボタンを押してから好きな言葉をしゃべってみると、このように、複数のエンジンを同時に使って結果を比較できます。
Unity公式Asset「SpeechToText」を動かしてみました。サンプルシーンは最大4種類のエンジンで同時に音声認識を試せます。GoogleCloudSpeechAPIについては日本語対応方法を調べてみます。 pic.twitter.com/Wqv61Nnl9N
— Riftup in VR/MR@JP (@WheetTweet) 2016年8月14日
現時点だと、Google Speech APIが日本語対応できてないのと、Watsonの検証をしていないですが、Wit.aiの精度が一番高いように見えます。
4. ソースコードの構成
サンプルシーンを使って、簡単ですが動きを見てみます。
まず、画面構成についてです。
サンプルシーンはこのように左上の"Start Recording"というボタン、左側のテキスト、右側の6つのScroll Viewから構成されています。
左側のテキストは認識精度を高めるためのオプションのようですが、日本語では意味がなさそうなので今回は使っていません。
では動きを説明します。
Start Recordingボタンを押すと、音声取得状態になります。
このとき、SpeechToTextCpomparisonWidgetクラスでは
OnRecordButtonClicked()
→StartRecording()
のように呼ばれます。
StartRecording()はこのような処理が実行されています。
foreachの中にある、m_SpeechToTextServiceWidgetsという変数は、それぞれのサービスオブジェクトであり、
serviceWidget.StartRecording();
によって、各サービスで音声認識処理を開始しています。
各サービスは、いずれもSpeechToTextServiceクラスを継承しており、StreamingかNonStreamingかでさらに継承の対象が異なります。
クラス間の関係図をまとめるとこうなります。
また、きれいに描けてないですが、メソッドの呼び出しはこのような関係図になります。
5. その他Tips
5-1. 対応OSは?
Readmeには、Windows OS環境で動く、と書かれています。
Webサービスなので、本来他のOSで動かないということはないですが、たとえば今回のGoogle Speech APIを使用するために、それぞれ認識対象の音声ファイルをSoXで作成しています。
これはOS依存なので、このままではiOSやAndroidでは動かず、基本的にWindows限定と考えるのがよさそうです。
(SoXはMac版の提供もあるので、Macでも動くかもしれません)
Watsonはわかりませんが、Wit.aiについても、Google Speech APIの処理と同じ処理で音声ファイルを取得しているので、SoX依存の可能性があります。
5-2. Streaming と Non Streamingの違いは?
一般的かはわかりませんが、ここでは下記の意味で使われていました。
Streaming :
Start Recordingボタンを押してから指定時間(default:15sec)の間に認識した言葉を、逐次テキストで表示する
Non Streaming :
Recordingボタンを押してから指定時間経過後かStop Recordingボタンを押すまで音声を録音し、録音終了後にサービスに問い合わせして、認識結果をテキストで表示する
そのため、Non Streamingを使うと、Recordingが終わるまでは画面が変化せず、終了後数秒経ってから初めて画面に認識結果が表示されます。