MoreBeerMorePower

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

Power Automate Desktop と Azure Speech Serviceで MP3 ファイルを文字起こし

f:id:mofumofu_dance:20210312133801p:plain

以前 Power Automate のクラウドフローで、Cloudmersive と Azure Speech Service を使って作成したフローのデスクトップ版です。

mofumofupower.hatenablog.com

フロー概要

f:id:mofumofu_dance:20210608163517p:plain
フロー全体

デスクトップフローではまず文字起こしの対象とするオーディオファイルを選択します。

この時、後続でファイルフォーマットによるハンドリングをしたくなかったので、mp3ファイルに限定しています。

f:id:mofumofu_dance:20210608163410p:plain
ファイル選択ダイアログアクション

クラウドフローの場合と同様に、Azure Speech Serviceで許容されるWAV形式にファイルを変換したいので、取得したファイル名の"mp3" を"wav"に置換した文字列 (結果は絶対パスになる) を定義しておきます。

ほぼすべての処理は3つ目のPowerShellスクリプトで実行しています。

PowerShell スクリプトでは、まず ffmpeg を使って MP3 -> WAV にオーディオを変換。その結果できたWAVを Speech Service の Speech to Text API に渡しています。

ffmpeg -i %SelectedFile% %Replaced%

$url='https://japaneast.stt.speech.microsoft.com/speech/recognition/conversation/cognitiveservices/v1?language=ja-JP&profanity=raw'
$headers = @{
    'Accept'='application/json'
    'Content-type'='audio/wav; codecs=audio/pcm; samplerate=16000'
 'Ocp-Apim-Subscription-Key'='ここにライセンスキー'
}
$req = Invoke-WebRequest -uri $url -Method Post -Headers $headers -Infile %Replaced%
$res = $req.Content| ConvertFrom-Json
echo $res.DisplayText

ファイルを直接渡したい場合には Invoke-WebRequest-Infile オプションを指定するとよいそうです。

レスポンスに入っている 読み取り結果の文字列をPowerShellOutput としてアクションの結果に入れています。

最後にダイアログを表示しておしまい。

f:id:mofumofu_dance:20210608164523p:plain

一応コード?は以下の通りです。

Display.SelectFile Title: $'''Choose audio file''' InitialDirectory: $'''C:\\Users\\hiro\\Music''' FileFilter: $'''*.mp3''' IsTopMost: False CheckIfFileExists: False SelectedFile=> SelectedFile ButtonPressed=> ButtonPressed
Text.Replace Text: SelectedFile TextToFind: $'''mp3''' IsRegEx: False IgnoreCase: False ReplaceWith: $'''wav''' ActivateEscapeSequences: False Result=> Replaced
System.RunPowershellScript Script: $'''ffmpeg -i %SelectedFile% %Replaced%

$url=\'https://japaneast.stt.speech.microsoft.com/speech/recognition/conversation/cognitiveservices/v1?language=ja-JP&profanity=raw\'
$headers = @{
    \'Accept\'=\'application/json\'
    \'Content-type\'=\'audio/wav; codecs=audio/pcm; samplerate=16000\'
 \'Ocp-Apim-Subscription-Key\'=\'ここにSpeech Serviceのキー\'
}
$req = Invoke-WebRequest -uri $url -Method Post -Headers $headers -Infile %Replaced%
$res = $req.Content| ConvertFrom-Json
echo $res.DisplayText''' ScriptOutput=> PowershellOutput ScriptError=> ScriptError
Display.ShowMessage Title: $'''読み取り結果''' Message: PowershellOutput Icon: Display.Icon.None Buttons: Display.Buttons.OK DefaultButton: Display.DefaultButton.Button1 IsTopMost: False ButtonPressed=> ButtonPressed2

おわり

Power Automate Desktop で Azureのサービスを読んで遊んでみました。

Cognitiveサービスなども、Binaryを直接渡さないといけないシーンがあり、そういうときには標準の「Webサービスを呼び出します」アクションだとうまくいかないので、PowerShellスクリプトなり、Pythonスクリプトなりを実行するとよさそうです。

今回は単にダイアログに表示しただけでしたが、結果をメールで送るなど、活用シーンはありそうですね。