Cross Technology

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

【2016/11/27更新】【Android】Bing Speech APIを使う手順とトラブル対応法をまとめました

最近、音声認識機能を色々調べており、MicrosoftのCognitive Serviceも試してみました。今まで試した中では認識速度が最も速かったという印象です。

ただ、私自身がCognitive Serviceに慣れていないので準備に手間取ったため、備忘録を兼ねて、手順を含めてまとめてみました。

なお、下記の環境で検証しています。

  • Mac OS : 10.11.6
  • Android Studio : 2.1.2

1. 前提

1-1. Cognitive Serviceとは?

Microsoftが提供する様々な認識サービスの総称です。Cognitive(認識の、認知の)という言葉の通り、音声認識、画像認識、感情推定、などなど、全21個のサービスがあります。このページから全サービスの詳細を確認できます。

Cognitive Services | Microsoft Azure

今回は、その中の一つである、Bing Speech APIを使ってみました。

1-2. Bing Speech APIとは?

音声認識が可能なAPIです。Windowsだけでなく、Android、iOS、Javascriptなどに対応しています。使用するには、Cognitive Serviceに登録してKeyやIDを入手し、これをアプリケーションに埋め込む必要があります。

Cognitive Serviceはオンライン型のサービスで、APIを使った回数に応じて課金されます。全21個のサービスを確認したわけではありませんが、少しの利用であれば無料かわずかな金額で試せます。

2. 実行手順

2-1. Cognitive Serviceのアカウント登録

ここからアクセスします。Microsoftのアカウントを持っていればそれが使えます。

Cognitive Services | Microsoft Azure

API→Bing Speechの順番に選びます。

Microsoft Bing Speech APIの選択画面

Get Started for Freeを選択します。

Microsoft Bing Speech APIの開始ボタン

すると、ちょっと直感的ではないのですが、全APIの一覧が出てきます。

 Microsoft APIの一覧

未契約のAPIしか表示されないため、私のポータル画面では契約済みのBing Speechは表示されていませんが、初めての場合ここに表示されます。

Microsoft APIを使う同意選択画面

上側にチェックをつけて(下は任意)、Subscribeを選択します。

subscription keyの画面

すると、このように、subscription key(xxxxで隠されています)や、いつ選択したかの日時が表示されます。ここで、Buy On Azureを選択すると契約手続きに進むことができます。

私はすでに契約手続きを済ませてしまったのでスクリーンショットを出せないのですが、ここではクレジットカード番号の登録が必要です。

基準以下の使用であれば無料で、それを超えた場合に使用回数に応じた金額がクレジットカードから引き落とされる、という仕組みのようです。

2-2. 各種IDの取得方法

各種キーはAzure Portalから取得します。Azure Portalにはここからアクセスして、Microsoftのアカウントでサインインします。

Microsoft Azure Portalのサインイン画面

このようにダッシュボードが表示されるので、ここで「新規」を選択します。

Azure Portalのダッシュボード画面

次に、検索用のフィールドに「cogni」くらいまで入力すると Cognitive Services APIsが表示されるのでこれを選択します。選択すると、Cognitive Services APIが表示されるので再度選択します。右に次の画面が出てくるので、マウスでドラッグします。

Cognitive Services APIの設定画面

すると、このサービスはまだPreview段階であり、使用したときのデータはMicrosoftに行きますよ、という文章が出てきます。同意できるということで、「作成」をクリックします。

Cognitive Serviceの作成画面

ここで、ようやく具体的な課金プランを設定していきます。ここでは、「リソース」と呼ばれるものを作ります。「リソース」の単位が、一つのAPIを使うプランを示しています。同一の課金プランや条件でまとめたものは「リソースグループ」と呼ぶようです。

Account Name

「リソース」の名称です。これが後で出てくるluisAppIDになります。

サブスクリプション

「従来課金」か「無料試用版」の二種類があります。後者は一ヶ月経つと使えなくなります。

API type

Bing Speech API (Preview)を選択します。

Azure PortalのAPI type画面

場所

日本は選択肢になかったので、米国を選びます。

Pricing tier

プラン一覧から好きなものを選びます。今回は無償の音声認識を選びました。私の場合すでにsubscribe済みなので右側の表記がグレーになっていますが、通常は左側と同じようになっていて選択できます。

Bing Speech APIのプラン一覧

Resource Group

グループ名称です。任意の名前を付けます。例えば、「Test20160916」などです。

今回の試用における規約を守れる場合は、Agreeを選択します。

全て入力して「作成」を選ぶと、「リソース」ができます。このとき、後で使うprimary key、secondary key、Subscription IDが生成されます。

次に、それぞれのkeyやIDの確認方法を説明します。Azure Portalから「すべてのリソース」を選択し、先ほど作ったリソース名をクリックします。

Azure Portalでリソース選択をする画面

ここで表示されるサブスクリプションIDをメモしておきます。次に、マウスで右側を表示し、Keysをクリックすると3つの情報が表示されます。上から順番にluisAppID、Primary Key、Secondary Keyです。

Azure PortalでluisAppID、Primary Key、Secondary Keyを入力する画面

これでサンプルを動かすために必要なKey、IDを取得できました。

2-3. SDKのダウンロードと設定

ここから入手します。

GitHub - Azure-Samples/Cognitive-Speech-STT-Android: Android SDK for the Microsoft Speech-to-Text API, part of Cognitive Services

Cognitive Serviceのサイトトップから、このようにDevelopers → SDKs & Samples を選択しても進むことができます。

Cognitive ServiceのサイトトップからSDKs & Sampleに遷移するためのリンクボタン

さらに、Bing Speech とAndroidにチェックをつけるとGithubの同じページに進みます。

ここからAndroid Studioのプロジェクトをダウンロードします。「Cognitive-Speech-STT-Android-master」というフォルダが得られるので、これをAndroid Studioで開きます。プロジェクトを開いたら、res/Values/string.xmlを開きます。

res/Values/string.xmlの例

  • primaryKey
  • secondaryKey
  • luisAppID
  • luisSubscriptionID

これら4つについて、2-2で取得した情報を入力します。

また、このままでも使えるのですが、認識できる言語が英語なので、日本語に変更します。ソースコードの中にあるMainActivity.javaを開き、下記のようにロケールを変更します。


gist32dca461944329dfcacab9b6e0223642

あとはAndroid StudioからAndroidスマートフォンに転送して起動すれば使うことができます。(インターネット接続が必須です)

スマートフォンで起動すると、このような画面がでます。

Bing Speech APIをAndroidで動作させた例

他は試せてませんが、Use Microphone with ShortPhrase modeであれば音声認識ができて、課金もされませんでした。
(Long Ditection Modeは試していません)

モードを選択して「Start」を押すと、常時音を拾い始めます。そのため、何も喋ってなくても次々認識します。
(どの辺でAPI呼び出しを1回としているかは不明です)

たとえば、環境音を拾うと、このように謎の日本語を認識します。

Bing Speech APIが環境音を拾った例

「Start」を押してすぐに喋ると、ほぼ単語単位で瞬時に認識していきます。例えば、「今は22時12分です」と話しかけてみたところ、このように次々と認識して、最終的に音がなくなったと思われるタイミングで、認識結果を決定していました。

「今は22時12分です」の認識結果

話し終えると、実質すぐに結果が出力されていたので、認識速度は相当速いと思います。また、このように言葉が正確に認識されていたので、精度も高いです。

3. Tips

3-1. Cognitive Serviceのページについて

登録はAzure Portalで行うので、もしかすると2-1で説明した手順は不要で、いきなり2-2に進んでもよいかもしれません。

3-2. 価格について

価格はこの通りです。Pricing という場所をクリックすると出てきます。

Bing Speech APIの価格

音声認識の場合、一ヶ月に5,000回の使用であれば無料ですが、15秒を超える認識になると、1,000回当たり$4がかかります。また、テキストを音声にする場合、1,000回当たり$4かかります。個人で少し試す分には無料ないし少額で済みそうですね。

3-3. サンプルアプリをインストールしたが、Login Failedが出て使えない

(2016/10/22追記しました)

理由がわかりませんが、私の環境では2回発生しました。

【状況】
  • MSのgithubから落としたサンプルコードをAndroid Studioでビルドして実機転送する

(=今回のブログの2-3の手順を実行)

  • 実機でアプリを起動すると、Login Failedというメッセージが出て音声認識できない。

Bing Speech APIでLogin Failedが出た画面例

  • Android StudioのLogCatで見ると、このようなエラーが繰り返し発生

24356-25607/com.microsoft.CognitiveServicesExample I/NLPLAT: WebSocket closed unexpectedly, status: 0
24356-25607/com.microsoft.CognitiveServicesExample I/NLPLAT: Closing web socket channel
24356-25607/com.microsoft.CognitiveServicesExample I/NLPLAT: CU Client connection dropped
24356-25607/com.microsoft.CognitiveServicesExample I/NLPLAT: ConnectionStateChanged
24356-25607/com.microsoft.CognitiveServicesExample I/NLPLAT: WSRequest
24356-24458/com.microsoft.CognitiveServicesExample I/NLPLAT: Initiating websocket connection. m_connection=0xaf276d1c host=websockets.platform.bing.com port=443
24356-25628/com.microsoft.CognitiveServicesExample I/NLPLAT: originating error 0x80004005
24356-25628/com.microsoft.CognitiveServicesExample I/NLPLAT: originating error 0x80004005
24356-25628/com.microsoft.CognitiveServicesExample I/NLPLAT: originating error 0x80004005
24356-25650/com.microsoft.CognitiveServicesExample I/NLPLAT: Auth token status: 401
24356-25650/com.microsoft.CognitiveServicesExample I/NLPLAT: originating error 0x8000ffff
24356-24458/com.microsoft.CognitiveServicesExample I/NLPLAT: originating error 0x80070057

【対処方法】
  • アプリを再起動し、何度か試す。
  • 1日以上経ってからアプリ再起動を試す

うまく説明できてなくて申し訳ないのですが、私の場合、2回ともこれで治りました。もし同様の症状が出た場合は試してみてください。

3-4. gradle関係でエラーが出て、ビルドが失敗する。

(2016/11/6追記しました)

【状況】

Githubから落としてsync gradeを実行すると、下記のエラーが出る場合がある

A problem occurred evaluating project ':samples:SpeechRecoExample'.
> Failed to apply plugin [id 'com.android.application']
   > Minimum supported Gradle version is 2.14.1.  Current version is 2.10. If using the gradle wrapper, try editing the distributionUrl in /Users/Username/AndroidStudioProjects/BingSpeechAPI_Unity_git/Cognitive-Speech-STT-Android-master/gradle/wrapper/gradle-wrapper.properties to gradle-2.14.1-all.zip
【対処方法】

gradle.wrapper.propertiesを以下のように変更し、指示されたgradleを使うことでエラーを回避できます。

// distributionUrl=https\://services.gradle.org/distributions/gradle-2.10-all.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-2.14.1-all.zip

4. おわりに

IDやkeyの生成ページや、ソースコード上での対応付けが難しかったですが、性能としてはこれまで調べた中でも相当に高いという印象を持ちました。

なお、Cognitive Serviceの使用方法については、今回紹介した手順以外もあるかもしれません。また、不要な手順も含まれている可能性もあります。試される際はご了承ください。(たとえば、今回、2-1で紹介したページで得られるKeyは使っていません)

せっかくなので、次はこれをUnityで使えるようにしてみようと思います。

===
2016/11/27 追記

Unityで使うための手順を整理しました。

【2016/11/27 更新】UnityでBing Speech to Text API(Android用)を使う方法(Android Studio側の構築手順) - Cross Technology

【2017/3/1更新】(4-2) UnityでBing Speech to Text API(Android用)を使う方法(Unity側の構築手順) - Cross Technology

Unityで使えるようにしたサンプルコードをgithubに置きました。

GitHub - flushpot1125/CognitiveSpeech-STT-Android_Unity: You can use the following URL sample with Unity if you use the repository! (https://github.com/Microsoft/Cognitive-Speech-STT-Android)

===