MicrosoftのCognitive Serviceの一つ、Bing Speech APIを使う手順をまとめました

最近、音声認識機能を色々調べており、MicrosoftのCognitive Serviceも試してみました。

今まで試した中では認識速度が最も速かったという印象です。

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

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

Mac OS : 10.11.6
Android Studio : 2.1.2

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

目次

1. 前提

1-1. Cognitive Serviceとは?

1-2. Bing Speech APIとは?

2. 実行手順

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

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

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

3. Tips

4. まとめ

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

1. 前提

1-1. Cognitive Serviceとは?

Microsoftが提供する様々な認識サービスの総称です。

Cognitive(認識の、認知の)という言葉の通り、音声認識、画像認識、感情推定、などなど、全21個のサービスがあります。

このページから全サービスの詳細を確認できます。

azure.microsoft.com


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

1-2. Bing Speech APIとは?

音声認識が可能なAPIです。Windowsだけでなく、AndroidiOSJavascriptなどに対応しています。

使用するには、Cognitive Serviceに登録してKeyやIDを入手し、これをアプリケーションに埋め込む必要があります。

Cognitive Serviceはオンライン型のサービスで、APIを使った回数に応じて課金されます。

全21個のサービスを確認したわけではありませんが、少しの利用であれば無料かわずかな金額で試せます。

2. 実行手順

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

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

www.microsoft.com

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

f:id:Takyu:20160915213722p:plain

Get Started for Freeを選択します。

f:id:Takyu:20160915213824p:plain


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

f:id:Takyu:20160915214155p:plain

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

f:id:Takyu:20160915214115p:plain

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

f:id:Takyu:20160916082212p:plain

すると、このように、subscription key(xxxxで隠されています)や、いつ選択したかの日時が表示されます。

ここで、Buy On Azureを選択すると契約手続きに進むことができます。

(ページ遷移がややこしくてはっきり覚えてないのですが、2-2で説明したAzure Portalに進むはずです)


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

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


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

各種キーはAzure Portalから取得します。

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

f:id:Takyu:20160915222126p:plain


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

f:id:Takyu:20161127084016p:plain

次に、検索用のフィールドに「cogni」くらいまで入力すると Cognitive Services APIsが表示されるのでこれを選択します。

選択すると、Cognitive Services APIが表示されるので再度選択します。右に次の画面が出てくるので、マウスでドラッグします。

f:id:Takyu:20160915223012p:plain

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

f:id:Takyu:20160915223247p:plain


ここで、ようやく具体的な課金プランを設定していきます。

ここでは、「リソース」と呼ばれるものを作ります。「リソース」の単位が、一つのAPIを使うプランを示しています。

同一の課金プランや条件でまとめたものは「リソースグループ」と呼ぶようです。

Account Name

「リソース」の名称です。

これが後で出てくるluisAppIDになります。

サブスクリプション

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

API type

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

f:id:Takyu:20160915224916p:plain

場所

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

Pricing tier

プラン一覧から好きなものを選びます。今回は無償の音声認識を選びました。

私の場合すでにsubscribe済みなので右側の表記がグレーになっていますが、通常は左側と同じようになっていて選択できます。

f:id:Takyu:20160915225113p:plain

Resource Group

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

Legal terms

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

f:id:Takyu:20160915225313p:plain


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


それぞれのkeyやIDの確認方法です。

Azure Portalから「すべてのリソース」を選択し、先ほど作ったリソース名をクリックします。

f:id:Takyu:20160915230404p:plain

ここで表示されるサブスクリプションIDをメモしておきます。

次に、マウスで右側を表示し、Keysをクリックすると3つの情報が表示されます。上から順番にluisAppID、Primary Key、Secondary Keyです。

f:id:Takyu:20160915230900p:plain


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


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

ここから入手します。

github.com


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

f:id:Takyu:20160915220153p:plain

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


ここからAndroid Studioのプロジェクトをダウンロードします。

「Cognitive-Speech-STT-Android-master」というフォルダが得られるので、これをAndroid Studioで開きます。

プロジェクトを開いたら、res/Values/string.xmlを開きます。

f:id:Takyu:20160915233701p:plain

ここの

・primaryKey

・secondaryKey

・luisAppID

・luisSubscriptionID

に、2-2で取得した4つの情報を入力します。

このままでも使えるのですが、認識できる言語が英語なので、日本語に変更します。

ソースコードの中にあるMainActivity.javaを開き、下記のようにロケールを変更します。


gist32dca461944329dfcacab9b6e0223642


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


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

f:id:Takyu:20160915232208p:plain

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

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

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

f:id:Takyu:20160915232545p:plain

「Start」を押してすぐに喋ると、ほぼ単語単位で瞬時に認識していきます。

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

f:id:Takyu:20160915233057p:plain

話し終えると、実質すぐに結果が出力されていたので、認識速度は相当速いと思います。

また、このように言葉が正確に認識されていたので、精度も高いです。


3. Tips

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

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

3-2. 価格について

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

f:id:Takyu:20160915215255p:plain


音声認識の場合、一ヶ月に5,000回の使用であれば無料ですが、15秒を超える認識になると、1,000回当たり$4がかかります。

また、テキストを音声にする場合、1,000回当たり$4かかります。個人で少し試す分には無料ないし少額で済みそうですね。

(3-3は、10/22に追記しました)

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

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


【状況】

・MSのgithubから落としたサンプルコードをAndroid Studioでビルドして実機転送する
(=今回のブログの2-3の手順を実行)

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

f:id:Takyu:20161022175950p:plain

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
24356-24458/com.microsoft.CognitiveServicesExample I/NLPLAT: Authorization token hr 80070057 'S'
24356-24458/com.microsoft.CognitiveServicesExample I/NLPLAT: Refreshing token S
24356-24458/com.microsoft.CognitiveServicesExample I/NLPLAT: Waiting for connection/send completion.
24356-25628/com.microsoft.CognitiveServicesExample I/NLPLAT: WebSocket closed unexpectedly, status: 0
24356-25628/com.microsoft.CognitiveServicesExample I/NLPLAT: Closing web socket channel
24356-25628/com.microsoft.CognitiveServicesExample I/NLPLAT: CU Client connection dropped
24356-25628/com.microsoft.CognitiveServicesExample I/NLPLAT: ConnectionStateChanged
24356-25628/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-25654/com.microsoft.CognitiveServicesExample I/NLPLAT: originating error 0x80004005
24356-25654/com.microsoft.CognitiveServicesExample I/NLPLAT: originating error 0x80004005
24356-25654/com.microsoft.CognitiveServicesExample I/NLPLAT: originating error 0x80004005

【対処方法】

・アプリを再起動し、何度か試す。

・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を


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

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

4.まとめ

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

なお、Cognitive Serviceの使用方法については、今回紹介した手順以外もあるかもしれません。また、不要な手順も含まれている可能性もあります。試される際はご了承ください。

(たとえば、今回、2-1で紹介したページで得られるKeyは使っていません)

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


===
2016/11/27 追記

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

magicbullet.hatenablog.jp

magicbullet.hatenablog.jp



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

github.com

===