以前 Power Automate のクラウドフローで、Cloudmersive と Azure Speech Service を使って作成したフローのデスクトップ版です。
フロー概要
デスクトップフローではまず文字起こしの対象とするオーディオファイルを選択します。
この時、後続でファイルフォーマットによるハンドリングをしたくなかったので、mp3ファイルに限定しています。
クラウドフローの場合と同様に、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 としてアクションの結果に入れています。
最後にダイアログを表示しておしまい。
一応コード?は以下の通りです。
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スクリプトなりを実行するとよさそうです。
今回は単にダイアログに表示しただけでしたが、結果をメールで送るなど、活用シーンはありそうですね。