Cross Technology

Unity、VR、MR、ARを中心とした技術ブログ

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

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

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

f:id:Takyu:20180712212435j:plain

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


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.Speech

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を搭載してみた手順全公開 | Ledge.ai(レッジエーアイ)

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

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

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

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

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

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

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

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

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) まずはサイトにアクセスし、「コンソールへ移動」をクリックします。

Google Cloud including GCP & G Suite — Try Free  |  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します。

Wit.aiのポータル上での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で使う方法については、まとめたら別途ブログにしたいと思います。