Servicesのアカウントが必要です(無料)。Servicesでアカウントを持っていない人は作りましょう。Free」のボタンから作成できます。freeにアクセスすると、キーを取得することができます。Preview」のキーを使います。念のため書いておきますが、各種APIはある程度無料で利用できますが、料金プランは確認しておきましょう。Frameworkのプロジェクト作成ボットのプロジェクト作るのは、以前の記事にお任せです。APIの認証する責務のAuthenticationクラスを作りました。認証は、OAuth2仕様ですね。Bearerトークン取得して、それを使いまわす感じですが、79行目のRefreshTokenAsyncメソッドで、有効期限が過ぎる前に更新する仕組みにしてあります。Preview」のキーをとってきて貼り付けると、実際に動かすことができます。Tokenを渡します。それ以外は呼び出し元は何も知らなくて結構!」という仕様です。Tokenを出力するところで、文字列に「Bearer」の文字を、深い意味なくつけちゃってます。その他諸々ざっくりな要素は多々ありますが、次に進みましょう。APIを使ってメインの処理をする責務のSpeechToTextByHttpServiceクラスの作成です。HttpClientをusingとか.....はさておき、呼出元からは、17行目のGetTextAsyncメソッドが呼ぶのみです。RESTで音声データを投げれば、JSONが返ってきます。言語指定は、URLでします。英語の音声を渡すときは英語を指定、日本語の音声を渡すときは日本語を指定という感じです。英語で動作するようにしていますが、日本語を指定して日本語の音声データを渡すと、日本語のテキストが返ってきます。レスポンスで取得したJSONのスキーマは、こちらに記載があります。Previewということで今後変更もあるかと思うのでリンクのみにしますが、今回の例だと、29行目で指定しているとおり、headerの中のnameを取得しています。参考程度に、英語の音声データを送ったときに取得したjsonはこんな感じです。言語のstructは以下のように書いてますが、今回のサンプルでは日本語と英語しかセットしてません。対応言語の一覧は、こちらにあります。Frameworkで連携できるように、エントリーポイントとなるMessagesControllerクラスに以下のメソッドを追加しました。5行目のRouteAttributeは、URLのパスを指定するためにつけました。Botから指定のURLにアクセスすると、6行目のPostTestToSpeechメソッドが呼ばれます。このメソッドで、18行で呼ばれているGetImageStreamメソッドは、43行目に定義があり、添付されたファイルを取得します。今回は、音声ファイルをアップするとして話を進めてきましたが、正確にはwavのファイルのみ対応です。Botのメッセージで添付ファイルが来たら、Streamで取得します(49行目)。音声データ取得時の注意として、呼び出し元のクライアント次第では認証が必要です。スカイプならBotにアクセスした場合、添付ファイル自体はスカイプ側のディレクトリにアクセスするので認証が必要になります。用途に合わせて実装ですね。今回はエミュレーターから呼ぶだけなので認証するようなコードはありません。あとは、先ほど作ったSpeechToTextByHttpServiceクラスのGetTextAsync()メソッドを呼び出します(17行目)。クラスのインスタンスは、3行目に定義している_speechToTextByHttpService変数です。ここで記載してませんが、コンストラクターでインスタンス化するコードが必要です。ガチ勢はDIしてライフサイクルを管理ですね。動作確認Emulatorを使って動作確認です。(最初textToSpeechって誤字ってたので修正ました....)「http://localhost:3979/」の部分の設定がご不明な方はこちらの最後の方に記載してます。それ以降のURLは、先ほど指定したRouteAttributeの通りです。さきほどレスポンスのサンプルJSONで英語の音声データの結果を載せたので、今回は言語を日本語に指定して日本語のwavファイルを送ってみた結果、このようになりました。終わりに今回RESTでAPIをたたく実装を試しましたが、ClientLibrary(Microsoft.ProjectOxford.SpeechRecognition)で実装すると楽そうです(まだ見てない!)。今回は、まず動作として何が必要なのかを知りたかったのでこちらを試しました。ClientLibrary版は、そのうち試そうと思います。音声をテキスト化が簡単に実装できることで、会議の議事録をとるのに使ってみたり、英語の動画からテキストにしたものを翻訳したり、リアルタイムな音声をテキストにしてLUISに投げて何かを返答するボットだったり...自然言語の会話をインターフェースとしたアプリが世にあるれるのも遠くない気がしてきますね。201610日目でした。当ブログに掲載されている情報は、必ずしも正確性や安全性を保証するものではありません。掲載された内容によって生じた損害等の一切の責任を負いかねます。当ブログに掲載されている情報は個人の見解であり、所属する団体・組織は一切関係ありません。スターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。