MoreBeerMorePower

Power Platform中心だけど、ノーコード/ローコード系を書いてます。

Azure Speech ServiceとCloudmersive Video and Media Serviceで ノーコードで音声の文字起こし

はじめに

今回はPower Appsのマイクコントロールで録音した音声を、AzureのSpeech ServiceとCloudmersiveのVideo and Media Serviceを利用して、ノーコードで文字起こししてみました!!

実際やってみた様子は以下のツイートをご覧ください。

本投稿ではこの簡単なアプリと、後ろで実行しているLogic Appsの作り方を簡単に(もともと簡単だけど)紹介します。

Power Apps 側 (マイクで音声を録音して結果のテキストを表示)

ユーザーインターフェースとなるPower Appsでは、マイクコントロールで音声を録音し、ボタンでLogic Appsにリクエストを実行、結果のテキストをラベルに表示しています。

f:id:mofumofu_dance:20201207215259p:plain
Power 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 に追加し、カスタムコネクターとしてエクスポートしています。

f:id:mofumofu_dance:20201207220552p:plain
Speech2Textというカスタムコネクターを追加した

※Azure API Managementで作成するカスタムコネクターに関しては以前の投稿をご覧ください。

mofumofupower.hatenablog.com

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で返却したら完了です。

f:id:mofumofu_dance:20201207213915p:plain
Logic Apps のワークフロー全体図

※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については以前の投稿をご覧ください。

mofumofupower.hatenablog.com

ここではWAV形式への変換アクションを利用します。 各入力パラメータは下図を参照してください。

f:id:mofumofu_dance:20201207224055p:plain
Cloudmersiveの音声変換アクション

インプットのコンテンツには、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"から取得したキーを指定します。

f:id:mofumofu_dance:20201207224924p:plain

{
  "Accept": "application/json",
  "Content-type": "audio/wav; codecs=audio/pcm; samplerate=16000",
  "Ocp-Apim-Subscription-Key": "xxxxxxxxxxxxx"
}

あとはBodyにCloudmersiveのアクション実行結果 (Body)をそのまま指定するだけです。

f:id:mofumofu_dance:20201207225133p:plain

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を試してみてください!

f:id:mofumofu_dance:20201207230216p:plain