BEACHSIDE BLOG

Azure と GitHub と C# が好きなエンジニアの個人メモ ( ・ㅂ・)و ̑̑

Bing Speech API ( Microsoft Cognitive Services ) で音声をテキストにする..を Bot Framework で試そう

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からテキストの部分を表示する
(私): それ見て無駄に喜ぶ

という流れです。

環境

主な環境は以下です。 C# で実装します。

  

事前に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のプロジェクト作成

ボットのプロジェクト作るのは、以前の記事にお任せです。主に以下をしています。

  • プロジェクトの作成
  • アクセスするポート番号の設定

beachside.hatenablog.com

  

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クラスの作成です。

HttpClientusingとか…..はさておき、呼出元からは、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行目のRouteAttributeは、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は、先ほど指定したRouteAttributeの通りです。

さきほどレスポンスのサンプルJSONで英語の音声データの結果を載せたので、今回は言語を日本語に指定して日本語のwavファイルを送ってみた結果、このようになりました。

f:id:beachside:20161210191316p:plain

終わりに

今回RESTでAPIをたたく実装を試しましたが、ClientLibrary(Microsoft.ProjectOxford.SpeechRecognition)で実装すると楽そうです(まだ見てない!)。
今回は、まず動作として何が必要なのかを知りたかったのでこちらを試しました。
ClientLibrary版は、そのうち試そうと思います。

音声をテキスト化が簡単に実装できることで、会議の議事録をとるのに使ってみたり、英語の動画からテキストにしたものを翻訳したり、リアルタイムな音声をテキストにしてLUISに投げて何かを返答するボットだったり…自然言語の会話をインターフェースとしたアプリが世にあるれるのも遠くない気がしてきますね。

というこで、Microsoft Cognitive Services & Bot Framework Advent Calendar 201610日目でした。(20時間ほど遅刻..すいませんっ)