Bing Speech APIを使って Bot Framworkで動作を試す簡易でとりあえず動くサンプルを書いてみました。
Bing Speech API は、Microsoft Cognitive Services のAPIの一つで、ざっくりいうと、音声データをテキストにしてくれるAPIです。
Azure Bot Serviceで実装もやりたいなーと思いつつ、記事が長くなったので今回とは別バージョンの実装を試すときにでも書けたらと思います。
Overview
今回作る動作イメージは、
(私): App(←Botです)音声ファイルをアップロードする
(App): Bing Speech APIに認証
(App): Bing Speech APIに音声データ渡し、音声がテキストになったjsonを取得
(App): 受け取ったjsonからテキストの部分を表示する
(私): それ見て無駄に喜ぶ
という流れです。
- 0. 事前にMicrosoft Cognitive Servicesのアカウント準備
- 1. Bot Frameworkのプロジェクト作成
- 2. Bing Speech APIの認証
- 3. Bing Speech APIと連携
- 4. Bot Frameworkと連携
- 5. 動作確認
環境
主な環境は以下です。 C# で実装します。
- Visual Studio 2015 (Enterprise update3)
- Microsoft.Bot.Builder (Version 3.3.3)
事前にMicrosoft Cognitive Servicesのアカウント準備
Cognitive Servicesのアカウントが必要です(無料)。 Microsoft Cognitive Servicesでアカウントを持っていない人は作りましょう。執筆時点だと、リンク先の「Get Sterted for Free」のボタンから作成できます。
作成をしてログインができている前提で、
Microsoft Cognitive Services - Get started for free
にアクセスすると、キーを取得することができます。今回は、「Bing Speech - Preview」のキーを使います。
念のため書いておきますが、各種APIはある程度無料で利用できますが、料金プランは確認しておきましょう。 www.microsoft.com
1. Bot Frameworkのプロジェクト作成
ボットのプロジェクト作るのは、以前の記事にお任せです。主に以下をしています。
- プロジェクトの作成
- アクセスするポート番号の設定
2. Bing Speech APIの認証
Bing Speech APIの認証する責務のAuthentication
クラスを作りました。
認証は、OAuth2仕様ですね。Bearerトークン取得して、それを使いまわす感じですが、79行目のRefreshTokenAsync
メソッドで、有効期限が過ぎる前に更新する仕組みにしてあります。
(そして、ざっくり作っただけで、あまり動作確認してないです….)
14行目に、前述で記載した「Bing Speech - Preview」のキーをとってきて貼り付けると、実際に動かすことができます。
ざっくりな解説ですが、
「呼出元からは、40行目のGetBearerTokenAsync
メソッドを呼べばBearar Tokenを渡します。それ以外は呼び出し元は何も知らなくて結構!」という仕様です。
55行目GetBearerTokenAsync()
メソッドの戻り値のBearer Tokenを出力するところで、文字列に「Bearer」の文字を、深い意味なくつけちゃってます。
その他諸々ざっくりな要素は多々ありますが、次に進みましょう。
3. Bing Speech APIと連携
次は、Bing Speech APIを使ってメインの処理をする責務のSpeechToTextByHttpService
クラスの作成です。
HttpClient
をusing
とか…..はさておき、呼出元からは、17行目のGetTextAsync
メソッドが呼ぶのみです。
Bing Speech API にRESTで音声データを投げれば、JSONが返ってきます。言語指定は、URLでします。英語の音声を渡すときは英語を指定、日本語の音声を渡すときは日本語を指定という感じです。 とりあえず英語で動作するようにしていますが、日本語を指定して日本語の音声データを渡すと、日本語のテキストが返ってきます。
レスポンスで取得したJSONのスキーマは、こちらに記載があります。Bing Speech API がまだPreviewということで今後変更もあるかと思うのでリンクのみにしますが、今回の例だと、29行目で指定しているとおり、headerの中のnameを取得しています。
参考程度に、英語の音声データを送ったときに取得したjsonはこんな感じです。
言語のstructは以下のように書いてますが、今回のサンプルでは日本語と英語しかセットしてません。
対応言語の一覧は、こちらにあります。
4. Bot Frameworkと連携
Bot Frameworkで連携できるように、エントリーポイントとなるMessagesController
クラスに以下のメソッドを追加しました。
5行目のRoute
Attributeは、URLのパスを指定するためにつけました。
Botから指定のURLにアクセスすると、6行目のPostTestToSpeech
メソッドが呼ばれます。このメソッドで、18行で呼ばれているGetImageStream
メソッドは、43行目に定義があり、添付されたファイルを取得します。
今回は、音声ファイルをアップするとして話を進めてきましたが、正確にはwav
のファイルのみ対応です。Botのメッセージで添付ファイルが来たら、Streamで取得します(49行目)。
音声データ取得時の注意として、呼び出し元のクライアント次第では認証が必要です。例えばスカイプならBotにアクセスした場合、添付ファイル自体はスカイプ側のディレクトリにアクセスするので認証が必要になります。用途に合わせて実装ですね。今回はエミュレーターから呼ぶだけなので認証するようなコードはありません。
あとは、先ほど作ったSpeechToTextByHttpService
クラスのGetTextAsync()
メソッドを呼び出します(17行目)。
クラスのインスタンスは、3行目に定義している_speechToTextByHttpService
変数です。ここで記載してませんが、コンストラクターでインスタンス化するコードが必要です。ガチ勢はDIしてライフサイクルを管理ですね。
5. 動作確認
Emulatorを使って動作確認です。アクセスするURLは、私の場合、 http://localhost:3979/api/SpeechToTextByHttp
です。(最初textToSpeech
って誤字ってたので修正ました….)
「http://localhost:3979/」の部分の設定がご不明な方はこちらの最後の方に記載してます。それ以降のURLは、先ほど指定したRoute
Attributeの通りです。
さきほどレスポンスのサンプルJSONで英語の音声データの結果を載せたので、今回は言語を日本語に指定して日本語のwavファイルを送ってみた結果、このようになりました。
終わりに
今回RESTでAPIをたたく実装を試しましたが、ClientLibrary(Microsoft.ProjectOxford.SpeechRecognition)で実装すると楽そうです(まだ見てない!)。
今回は、まず動作として何が必要なのかを知りたかったのでこちらを試しました。
ClientLibrary版は、そのうち試そうと思います。
音声をテキスト化が簡単に実装できることで、会議の議事録をとるのに使ってみたり、英語の動画からテキストにしたものを翻訳したり、リアルタイムな音声をテキストにしてLUISに投げて何かを返答するボットだったり…自然言語の会話をインターフェースとしたアプリが世にあるれるのも遠くない気がしてきますね。
というこで、Microsoft Cognitive Services & Bot Framework Advent Calendar 201610日目でした。(20時間ほど遅刻..すいませんっ)