コルネの進捗や備忘録が記されたなにか

進捗や成果物や備忘録てきななにかを雑に更新していきます。

【Power Apps】音声をテキストに変換する~その3~


スポンサードリンク

Power Automate でフローを作成する

Power Automate で実装する機能は以下です。

  • Power Apps からのオーディオデータ取得
  • Azure Functions にオーディオデータ(webm )を渡して「wav」に変換する
  • Speech to Text にオーディオデータ(wav )を渡して解析を行う
  • Speech to Text の解析結果をPower Apps に渡す

それでは作成していきましょう!

Power Automate の全体図

これから作成するPower Automate の全体構成はこのような感じになっています。

f:id:koruneko:20200614210107p:plain

Power Apps からのオーディオデータ取得

Power Apps からオーディオデータを取得するために、トリガに「PowerApps」を選択します。
続いて、「作成」アクションを追加し、「入力」には「PowerApps で確認」を選択します。
f:id:koruneko:20200616012717p:plain

続いて、「JSON の解析」を追加します。
コンテンツには先ほどの「作成」の出力結果である「出力」を選択し、スキーマには以下を入力します。(「サンプルから生成」で自身で作成されても大丈夫です。)

JSON の解析」のスキーマ

{
    "type": "object",
    "properties": {
        "Url": {
            "type": "string"
        }
    }
}

f:id:koruneko:20200616013020p:plain

Azure Functions にオーディオデータ(webm )を渡して「wav」に変換する

JSON の解析」で出力された結果をAzure Functions に渡して「webm」を「wav」に変換しましょう!

「HTTP」アクションを追加します。

  • 方法:「POST」を選択します。
  • URI前回の記事で作成したAzure Functions の「関数の URL の取得」で取得したURL を入力します。
    f:id:koruneko:20200616001959p:plain
  • 本文:こちらにはAzure Functions に渡すデータをセットします。
    Power Apps から渡ってきたデータはBase64エンコードされたデータなので、バイナリデータに変換する必要があります。
    なので以下のように入力します。
dataUriToBinary(body('JSON_の解析')?['Url'])

f:id:koruneko:20200616022802p:plain

Speech to Text にオーディオデータ(wav )を渡して解析を行う

先ほど「wav」形式に変換を行ったオーディオデータをSpeech to Text に渡して解析を行いましょう!

先ほど同様「HTTP」アクションを追加します。

  • 方法:「POST」を選択します。
  • URIURIには以下のエンドポイントを入力します。
https://<REGION_IDENTIFIER>.stt.speech.microsoft.com/speech/recognition/conversation/cognitiveservices/v1?language=<language>&format=detailed

<REGION_IDENTIFIER>には選択した「地域」を入力します。
には音声の言語を入力します。

例)

https://japaneast.stt.speech.microsoft.com/speech/recognition/conversation/cognitiveservices/v1?language=ja-JP&format=detailed

参考:Speech to Text REST API

  • ヘッダー:ヘッダーにて設定可能な項目は以下です。
    f:id:koruneko:20200616025725p:plain
    今回は「Ocp-Apim-Subscription-Key」と「Content-type」を設定します。

    • Ocp-Apim-Subscription-Key:前回の記事で作成したSpeech to Text のキーを入力します。
      f:id:koruneko:20200616010721p:plain
    • Content-type:今回渡すデータは「wav」形式なので「audio/wav」を設定します。
  • 本文:先ほどのHTTP アクションの「本文」を設定します。

f:id:koruneko:20200616024940p:plain

Speech to Text の解析結果をPower Apps に渡す

最後に解析結果をPower Apps に渡しましょう!

Speech to Text の結果は下記のようなJSON 形式で結果が出力されます。

f:id:koruneko:20200617015317p:plain

こちらの出力結果を変数として利用できるように「JSON の解析」を行います。

f:id:koruneko:20200616030318p:plain

スキーマは以下。

JSON の解析」.スキーマ

{
    "type": "object",
    "properties": {
        "RecognitionStatus": {
            "type": "string"
        },
        "Offset": {
            "type": "integer"
        },
        "Duration": {
            "type": "integer"
        },
        "NBest": {
            "type": "array",
            "items": {
                "type": "object",
                "properties": {
                    "Confidence": {
                        "type": "number"
                    },
                    "Lexical": {
                        "type": "string"
                    },
                    "ITN": {
                        "type": "string"
                    },
                    "MaskedITN": {
                        "type": "string"
                    },
                    "Display": {
                        "type": "string"
                    }
                }
            }
        }
    }
}

今回Power Apps に返そうと思う値は「Display」です。
ただし、「Display」は「NBest」のオブジェクトとなっているので、値にそのまま「Display」を設定してしまうと、「Apply to each」内にアクションが配置されてしまいます。

「PowerApps または Flow に応答する」は「Apply to each」内に配置することができないので少し工夫が必要です。

そこで今回は「Display」を一度変数に格納し、その変数の値をPower Apps に返そうと思います。

「変数を初期化する」アクションを追加します。

  • 名前:任意の変数名を入力します。今回は「outPutText」と入力します。
  • 種類:「文字列」を選択します。
  • 値:初期値を入力します。今回は設定しません。

f:id:koruneko:20200617023250p:plain

こちらで初期化した変数に「Display」を設定します。

「変数の設定」アクションを追加し、

  • 名前:outPutText (先ほど作成した変数名)
  • 値:Display

f:id:koruneko:20200617023713p:plain

値に「Display」を設定すると自動でアクションが上図のように「Apply to each」で囲われたかと思います。

最後にこちらの変数をPower Apps に渡しましょう。

「PowerApps または Flow に応答する」アクションを追加します。

「+出力を追加」を選択し、その後「テキスト」を選択します。

f:id:koruneko:20200617024250p:plain

  • タイトル:Power Apps に渡す変数の名前を設定します。今回は「result」とします。
  • 値を入力して応答してください:outPutText (先ほど作成した変数名)

f:id:koruneko:20200617025509p:plain

以上でPower Automate の作成は完了です!
フローを任意の名前で保存してください。

完成!

その1でPower Apps からPower Automate を呼び出している箇所がありましたが、こちらで作成したPower Automate を設定してください。

また、Power Automateの結果を変数に格納していましたが、Power Automate からはテーブルで値が返ってきています。
なのでこの結果を表示する場合は、

[Power Apps で設定した変数名].[Power Automate からPower Apps に応答するときに設定したタイトル]

としてください。
今回ですと、以下のようになりますね。

_output.result

さいごに

3回に渡ってPower Apps で音声をテキストに文字おこしするアプリの作成方法についてご紹介しました。

第2回の内容は普段プログラムやクラウドサービスを触られない方からすると少し敬遠したくなる内容だったかもしれません...

今回は小規模でしたが、このようにアプリを作成していくと、標準で機能が用意されておらず開発が必要になってくる部分がでてくるかもしれません。
そのような場合はエンジニアに頼っちゃえばいいと私は思っています。

このような感じでどこかに丸投げではなく、皆で協力してアプリを作成して業務改善などが行われる世の中になるといいですね。


スポンサードリンク