CrossRoad

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

【2018/1/22更新】【Unity】公式アセット「Speech-to-Text」の使い方とTips紹介

=====================================
2018/1/22 追記

本日気づいたのですが、このアセットがdeprecatedになっていました。

Speech To Textアセットのdeprecatedを示す画面

そのため、もうダウンロードできないのですが、この記事には音声認識サービスについていくつかメモしてあるので、参考までに残しておきたいと思います。


2016/8/28 追記

Asset Storeを見ると、私が書いたときよりバージョンが上がっており、Readmeに以下はアセット「UniWeb」が必要になったことが追加されていました。

理由不明ですが、UniWebがないと動かないように変わったようです。ちなみに、UniWebとは、Web関係の処理を便利にするアセットです。$25です。

これまでは、Watson SDKを入れればインポート後のエラーは回避できたのですが、今後は、Watson SDKに加えてUniWebも必要になりました。

ということで、今後このアセットを試される場合、UniWebを購入するか、Google Non StreamingやWit.aiを使わず、エラー箇所を自力でコメントアウトすることが必要になります。

バージョン1は、私がブログに残したスクショから2016/8/12と判明しました。バージョン2は2016/8/16ですので、わずか4日で変更されたことになります。

何かライセンスなどで問題があったのかもしれません。以降は、当時書いた内容と同一です。試せてませんが、UniWebをインポートすれば後はバージョン1と同じ手順で動作確認が可能と思います。

=====================================


先日、Unity Technologiesより、新しいアセット「Speech To Text」が発表されました。最近、UWPやHoloLens関連でCortanaを調べていたり、Androidなど他OSでの音声認識エンジンをUnityで使う方法を調べていたので、せっかくなのでSpeech To Textについても調べてみました。

なお、動作確認は以下の環境で行いました。

・Windows 10 Pro
・Unity 5.4.0f3 Personal




1. Speech-to-Textとは?

Unity Technologies社が2016/8/12(現地時間)に公開したアセットです。価格は無料です。

1.1 何ができるの?

「SpeechをTextに」という言葉通り、喋った音声をテキストにすることができます。既存の音声認識エンジンをUnityで使えるようにしたアセットです。サンプルシーンでは、4種類の音声認識エンジンを使って、同時に認識結果を表示できます。

1.2「既存の音声認識エンジン」はどんなもの?

以下の4種類です。

(1) UnityEngine.Windows.Speec

Unity5.4から標準搭載されたエンジンです。情報がないのでCortanaとの違いがわかりませんが、WindowsOS用の認識エンジンと思われます。ネットワークの接続を切ると、下記のようなエラーが出て実行できないため、ネットワーク接続は必須です。
 UnityEngine.Windows.Speechをネットワーク接続なしで使うと表示されるエラーログ

他エンジンと異なり、唯一API Keyなどの指定が不要です。ただし、感覚的には認識精度はあまり高くないと感じました。

(2) Google Cloud Speech API

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の一部と解釈しました。

アプリ内で自然言語処理とコンピューター・ビジョンを利用して、世界の会話、文書、写真を深く理解できるようにします。
引用元:IBM Cloud の紹介

実際、Watson Speech to Textの使用にはBluemixアカウントが必要なので、解釈はずれてないと思いますが、違っていたらご指摘いただけると助かります。

(4) Wit.ai

botとの会話ができるサービスです。Wit.aiについては、下記がわかりやすかったです。

思ったよりカンタン。無料API『wit.ai』で、チャットボットにAIを搭載してみた手順全無料API『wit.ai』で、チャットボットにAIを搭載してみた全手順 | Ledge.ai

上記を参考に解説すると、Wit.aiは、自分で定義した会話文に基づいてシナリオを進行できるサービスです。なので、記事の中にもある通り、最初に自分でシナリオを定義していく必要があります。

上記ブログより引用したシナリオの例】

1.「天気教えて?」→bot「オーケーオーケーどこの天気だい?」
2.「ロンドン」(地域はどこでも可)→bot「そこは晴れてるよ」

引用元:思ったよりカンタン。無料API『wit.ai』で、チャットボットにAIを搭載してみた手順全無料API『wit.ai』で、チャットボットにAIを搭載してみた全手順 | Ledge.ai

Wit.aiのHPおよび使い方の解説記事を見ていくと、botとの会話はテキストベースであり、ユーザ側の会話のきっかけにはテキスト入力or音声が選べます。(今回のUnityアセットは、ここの音声入力のみを使っています)

ところで、蛇足ですが、Wit.aiとあるので、AI(Artificial Intelligence)的な要素はどこだろうと疑問に思ったのですが、上記ブログの最後で定義した言葉と多少ずれても会話ができる、という記載がありました。

また、下記のブログによると、シナリオ作成時に、会話に使えそうな候補を次々出してくれるそうです。

Facebook bot に wit.ai のボットエンジンを連携させてみる - Qiita

2. 準備

2.1 アセットインポート

(注) Unityのバージョンが5.4以上である必要があります。

まずはUnityでプロジェクトを作り、アセットストアからSpeech-to-Textを入手してインポートします。いきなり多数のエラーが出ます。

Speech-to-Textアセットインポート直後のエラーログ

これはWatson Developer Cloud Unity SDKが入っていないためで、ReadmeにもWatsonサイトから入手してください、という記載があります。

2.2 Watson SDKインポート

SDKはここから入手できます。

GitHub - watson-developer-cloud/unity-sdk: Unity SDK to use the IBM Watson services.

2016/8/15時点では、unity-sdk-0.3.0.zipが最新版でした。これを解凍するとunity-sdkというフォルダが生成されるので、Watsonというフォルダ名に変更します。

このWatsonフォルダをAssets直下にコピーします。ここまで進めると、先ほどのエラーが消えます。なお、Watson SDKをインポートすると、さらに新しいエラーがでます。

Watson SDKをインポートしたときのエラーログ

これは、TouchScriptというアセットがないので削除します、というエラーです。TouchScriptがなくてもシーン実行ができるし、TouchScriptは今回のアセットの機能とは関係ないため、このまま続けて大丈夫です。

ちなみに、WatsonSDKは、Speech-to-Textアセットのスクリプトの中で呼ばれています。そのため、もしWatsonを使わない場合であっても、

  • Watson SDKをインポートする
  • 関連部分を全部コメントアウトする

のどちらかが必要です。

2.3 SoXツールのインポート

SoXとは、Sound eXchangeという音声ファイル変換ツール(コマンド)です。元々Linux系の中で有名なコマンドですが、Windows系でも使えるようになっています。今回はここから14.4.2を入手しました。

SoX - Sound eXchange - Browse /sox at SourceForge.net

入手したsox-14.4.2-win32.zipを解凍し、Assets/StreamingAssetsフォルダの中に、新しくThirdParty/SoX/Windowsというフォルダを作ります。ここにsox-14.4.2-win32フォルダの中身をそのまま入れます。

Soxを使うためのUnityのフォルダ構成

これで、インポート作業は完了です。

3. サービス登録

使いたいサービスに登録します。ここは先ほどのインポート時とは異なり、使わないサービスは登録しなくても大丈夫です。このアセットは音声からテキスト変換する既存サービスのWrapperなので、IBM Watsonの検証は実施しませんでした。

そのため、Watsonのサービス登録や動作確認はできていませんが、本ブログの2-1の作業が終わっていれば、Google Speech APIと同様の手順により、APIusername/passwordを取得すれば動作すると思います。

3.1. Google Cloud Speech API (Non Streamingの場合)

(1) まずはサイトにアクセスし、「コンソールへ移動」をクリックします。

Cloud Computing Services  |  Google Cloud

(2) Googleアカウントでログインすると、ポータル画面が表示されます。ここで、API Managerを選択します。

(3) 検索フォームで「Speech」と入力します。Google Cloud Speech APIが検索候補に出てくるので選択します。

Google Cloud PlatformからGoogle Cloud Speech APIを選択する画面]

(4) 画面中心の上付近で「有効にする」を選択します。

(5) 続けて、認証情報の登録を行います。「認証情報に進む」を選択し、指示に従って登録していきます。

APIを呼び出す場所、については、色々な種類がありましたが、今回は「その他のUI」を選択しました。

Google Cloud Speech APIで、呼び出し場所の指定画面
次は APIキーを生成します。今回は名称をTestとしました。リクエストを受けるサーバ IPアドレスについては、とりあえず空欄でも大丈夫です。

APIキーが生成されたら、Unityに戻ります。Hierarchy Viewの

Canvas/ SpeechToTextServiceWidgets/ GoogleNonStreamingSpeechToText にあるコンポーネントにAPI Keyをコピペします。

UnityのGoogleNonStreamingSpeechToText コンポーネント画面
これで、Google Speech APIをNonStreamingで使用する準備が完了です。


3.2 Google Cloud Speech API (Streamingの場合)

Google Cloud Speech APIのAPI Keyを登録すると、ポータル画面に「認証情報」という項目が追加されます。これをクリックすると、このように認証情報を作成する画面が出てくるので、「サービスアカウントキー」を選択します。

Google Cloud Platformのサービスアカウントキー選択画面
すると、

  • App Engine default service account
  • Compute Engine default service account

という二種類の形式を選択する画面になります。それぞれの違いは調べられていませんが、今回のサンプル検証ではApp Engineを選択して動作しました。

キーファイルはjsonとP12と二種類の形式が選択できますが、今回はJSON形式を選択します。処理を進めていくと、json形式の証明書ファイルを入手できます。このファイルの名称をcredentials.jsonと変更し、Unity側の

Assets/StreamingAssets/GoogleStreamingSpeechToTextProgram

のフォルダにインポートします。
UnityのAssets/StreamingAssets/GoogleStreamingSpeechToTextProgramの場所
これで、Google Speech APIをStreamingで使用する準備が完了です。

3.3 Wit.ai

Wit.aiのサイトにアクセスします。

githubかFacebookでログインし、表示されたポータル画面の右上にある"+"マークを選択して、New Appを選択します。

Wit.aiのポータル画面
App作成画面になるので、名称、公開範囲を設定して + Create Appし、作成したApp画面の右上付近にあるSettingsを選択します。

Wit.aiポータルのSettings画面
表示されたページの真ん中付近にある、API DetailsにServer Access Tokenという項目があります。ここで表示されている文字列をコピーします。

Wit.aiのServer Access Token表示画面
あとは、Unity側で、Canvas/ SpeechToTextServiceWidgets/ WitAiNonStreamingSpeechToTextのコンポーネントにAccess Tokenを指定すれば完了です。

UnityのCanvas/ SpeechToTextServiceWidgets/ WitAiNonStreamingSpeechToTextのコンポーネント画面

4. サンプルの動作確認

[前提]
・インターネットに接続されている
・マイクが接続されている

speechToTextComparison.unityを開き、シーン実行して、「Start Recording」というボタンを押してから好きな言葉をしゃべってみると、このように、複数のエンジンを同時に使って結果を比較できます。

現時点だと、Google Speech APIが日本語対応できてないのと、Watsonの検証をしていないですが、Wit.aiの精度が一番高いように見えます。


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依存の可能性があります。そのため、基本的にはWindows(Mac)用であり、モバイル対応はないと考えた方がよさそうです。

5.2 Streaming と Non Streamingの違いは?

一般的かはわかりませんが、ここでは下記の意味で使われていました。

Streaming


Start Recordingボタンを押してから指定時間(default:15sec)の間に認識した言葉を、逐次テキストで表示する

Non Streaming


Recordingボタンを押してから指定時間経過後かStop Recordingボタンを押すまで音声を録音し、録音終了後にサービスに問い合わせして、認識結果をテキストで表示する

そのため、Non Streamingを使うと、Recordingが終わるまでは画面が変化せず、終了後数秒経ってから初めて画面に認識結果が表示されます。

5.3 使わないサービスを無効化する方法は?

使用しないサービスは、Canvas/SpeechToTextComparisonWidget オブジェクトのコンポーネントから調整できます。たとえば、今回私はWatsonは使わなかったので、下記のようにSpeech To Text Service Widgetの配列Sizeを6から4に変更し、Watsonオブジェクトを外しました。

Speech To Text の未使用サービスを無効化する画面
シーン上では6つのScroll Viewが出たままになりますが、Watsonのサービスを使わなくてもエラーなく実行可能です。

5.4 Google Speech APIを日本語化する方法は?

現時点で不明です。Unity側のソースコードではロケール指定がなさそうでした。一方、Google Speech APIのポータルでも、言語設定に関する設定項目を見つけることができませんでした。

ただ、Pythonベースで試された方は、日本語のテキストを表示できていたので、本来は日本語対応していると思われます。私もまだコードや設定項目を詳しく見たわけではないので、見つけられたらここに追記したいと思います。

6. 終わりに

このアセットは、あくまで音声をテキストに変える、という機能をUnityで使うためのWrapperです。各サービスはそれ以外の機能もたくさんありますが、このアセットの目的と異なるので、当然それらをUnityで使うことはできません。

個人的には、音声認識のためだけに各サービスを新規契約するのは、オーバースペックな印象を持ちました。

今回のアセットを調べた動機の一つに、別途Android向け音声認識をUnityで使う方法を調べていたというのがあります。今回のアセット「Speech-to-Text」は、モバイル用途ではなさそうなので、自分が調べていた方法は引き続き活用できそうです。

Android系の音声認識をUnityで使う方法については、まとめたら別途ブログにしたいと思います。