はじめに
今回はPower Appsのマイクコントロールで録音した音声を、AzureのSpeech ServiceとCloudmersiveのVideo and Media Serviceを利用して、ノーコードで文字起こししてみました!!
実際やってみた様子は以下のツイートをご覧ください。
すげーな!Azure Speech serviceとCloudmersive! https://t.co/dItLjVBWZZ pic.twitter.com/uofEBmGkeQ
— Hiro (@mofumofu_dance) December 7, 2020
本投稿ではこの簡単なアプリと、後ろで実行しているLogic Appsの作り方を簡単に(もともと簡単だけど)紹介します。
Power Apps 側 (マイクで音声を録音して結果のテキストを表示)
ユーザーインターフェースとなるPower Appsでは、マイクコントロールで音声を録音し、ボタンでLogic Appsにリクエストを実行、結果のテキストをラベルに表示しています。
各種コントロールのプロパティ(イベント)は以下をコピペするだけです。
Microphone1.OnStop
マイクのOnStop(録音終了時)に音声を変数に設定します。
//audioという変数にマイクの音声のdata URIをセット Set(audio,JSON(Microphone1.Audio,IncludeBinaryData))
Audio1.Media
確認のため、オーディオコントロールを追加し、Media
プロパティに先ほど作成した変数(から余分な文字を削除したもの)を設定します。
//余分なダブルクォーテーションを削除 Substitute(audio,"""","")
Button1.OnSelect
ボタンを押して音声からテキストへの変換を行うLogic Apps にデータを渡します。
//resultという変数を一度初期化 Set(result,Blank()); //resultという変数にLogic Appsの戻り をセット //渡すデータは{audio:Substitute(audio,"""","")} Set(result,Speech2Text.manualinvoke({audio:Substitute(audio,"""","")}))
なお、ここではLogic Appsを直接実行できないので、Logic Apps をAzure API Management に追加し、カスタムコネクターとしてエクスポートしています。
※Azure API Managementで作成するカスタムコネクターに関しては以前の投稿をご覧ください。
Label1.Text
最後に受け取ったデータの、読み取りテキスト部分をラベルにセットして完成です。
result.DisplayText
今回はPower Apps と Logic Apps 由来のカスタムコネクターを利用していますが、プレミアムライセンスがある場合にはPower Apps x Power Automateの組み合わせでも同じように構成できます。
また、ユーザーの入力部分についても、他のアプリがあって同じデータが送れるのであれば、Power Appsである必要はありません。
Logic Apps
Logic Apps では HTTPリクエストをトリガーとしてフローを実行します。
トリガーで受信したdataURI形式の音声データのから、CloudmersiveのVideo and Mediaサービスのアクションを実行し、Speech Serviceで利用可能なWAV形式に変換しています (Power Appsでは録音された音声はWebm形式もしくはAAC形式のため、これをWAVに変換する必要がある)。
変換された音源をSpeech Serviceに渡して、結果をResponseで返却したら完了です。
※Power Automateで作成する場合には、トリガーを「Power Apps」にしてください。
HTTP 要求の受信トリガー
まずはHTTP要求受信のトリガーです。スキーマには以下のJSONをセットします。
{ "properties": { "audio": { "type": "string" } }, "type": "object" }
これはちょうど {"audio":"data:audio/webm;base64,T2dnUwACAAAAAAAAAAA..."}
のような要求に対応しています。
Cloudmersive Video and Media
Cloudmersive Video and Media コネクターを利用して、各種フォーマットからWAVに音声を変換しています。Video and Mediaについては以前の投稿をご覧ください。
ここではWAV形式への変換アクションを利用します。 各入力パラメータは下図を参照してください。
インプットのコンテンツには、HTTPで受信したデータ (audio) を dataUriToBinary()
で変換して設定しています。
@{dataUriToBinary(triggerBody()?['audio'])}
また、サンプリングレートを、Speech Serviceの仕様に合わせて 16.0にすることを忘れないようにしてください。
Speech Service API
WAVへの変換が終わったら、いよいよ音声→テキスト変換を実行します。
Speech Service のREST APIに関するドキュメントは以下を参照します。と言ってもそれほど難しくはなく、リソースを作成してサブスクリプションキーを取得したら、あとはHTTPで実行するだけです。
HTTPの各種設定値を記載します。
URI
URIはリソースを作成したリージョンと、検出する言語ロケールを指定しています。
https://japaneast.stt.speech.microsoft.com/speech/recognition/conversation/cognitiveservices/v1?language=ja-JP&profanity=raw
Headers
ヘッダーで特に気を付けるのは、Content-TypeとOcp-Apim-Subscription-Keyです。
Ocp-Apim-Subscription-Key にはリソースの"Keys and Endpoint"から取得したキーを指定します。
{ "Accept": "application/json", "Content-type": "audio/wav; codecs=audio/pcm; samplerate=16000", "Ocp-Apim-Subscription-Key": "xxxxxxxxxxxxx" }
あとはBodyにCloudmersiveのアクション実行結果 (Body)をそのまま指定するだけです。
Response
最後は「Response」アクションで結果をそのまま返します。
Power Appsに返すときにはスキーマを定義しておく必要があるので、以下を指定してください。
{ "properties": { "DisplayText": { "type": "string" }, "Duration": { "type": "integer" }, "Offset": { "type": "integer" }, "RecognitionStatus": { "type": "string" } }, "type": "object" }
おわり
Power Apps と Logic Apps双方の作成が終わったら、あとはAzure API Managementでカスタムコネクターをエクスポートするか、または有償プランが利用できる環境ではLogic Apps→Power Automateに置き換えることもできます。
これまでffmpegなどを利用して音声のファイル形式を変換していたのが、Cloudmersiveのアクションを使うことで本当にノーコードで作成できるようになったのは大きいですね。
今回はPower Appsからのトリガーでしたが、たとえばDropboxに音声をアップロードしたら一括テキスト変換を実行して.txtを保存してもよいと思います。
ぜひCloudmersive x Speech Serviceを試してみてください!