🤖

Power Automate for Desktop を使って VOICEPEAK にテキストを読み上げてもらおう!

2022/12/23に公開

この記事は、Microsoft Power Automate Advent Calendar 2022 カレンダー1の23日目の参加記事です。

2022年の後半は画像生成系や文章生成系の話題で持ちきりだったけど、前半は音声合成系がそれなりに話題になってた気がするんですよね。最近、テキスト読み上げソフト VOICEPEAK にもキャラクターが追加されたーなんて(一部界隈で)盛り上がってたりなんかしたこともあって、今回は、PAD を使って VOICEPEAK でテキストを読み上げてもらっちゃおう!というのを書いていきます。あの、みんな大好きな ターコイズブルーのやつ も単体で発売されてるので、気に入ったら購入しましょう!でも、他のキャラのを買えば、やつはおまけで付いてくるぞ!あと、この記事の VOICEPEAK は 商用可能6ナレーターセット版のだから、もしかしたらキャラクター版だと若干違うかもしれないので、その場合は参考程度で、ひとつヨロシク!

こんな感じのを作っていきますよー。
https://youtu.be/HSxOBPMNKt4

必要なもの

  1. Power Automate for Desktop
  2. VOICEPEAK

VOICEPEAK は体験版もあるので、持ってない人はひとまず体験版でよいと思います。

1. まずは PAD から VOICEPEAK を起動してなんかしゃべってもらおう!

何はともあれ、PAD から VOICEPEAK を起動してしゃべらせられないと始まりませんよね。

フローの全体像

こんな感じ。

アクションの配置

1-1. VOICEPEAKを起動

アクション一覧の「システム」から「アプリケーションの実行」を配置します。
パラメーターの選択の「アプリケーション パス」に、VOICEPEAK の実行ファイルのパスを指定します。今回、「アプリケーション起動後」は「アプリケーションの読み込みを待機」にしてあります。

1-2. 入力待機状態にする

アクション一覧の「UIオートメーション」から「ウィンドウのUI要素をクリック」を配置します。「UI要素」は「UI要素の追加」で、VOICEPEAK のこの部分 ↓ を指定しましょう。

1-3. 読み上げ用テキストを入力

読み上げてもらいたいテキストを設定しましょう。
アクション一覧の「UIオートメーション」の「フォーム入力」から「ウィンドウ内のテキストフィールドに入力する」を配置します。
パラメータの選択の「テキストボックス」は「UI要素の追加」で、VOICEPEAK のこの部分 ↓ を指定しましょう。「入力するテキスト」には適当なテキストを入れておきます。今回は「読み上げテストです。」としています。

1-4. 読み上げ

アクション一覧の「UIオートメーション」から「ウィンドウのUI要素をクリック」を配置します。「UI要素」は「UI要素の追加」で、VOICEPEAK の再生ボタンを指定しましょう。

1-5.読み上げ終了まで待機

アクション一覧の「フローコントロール」から「Wait」を配置します。「期間」は数秒でよいでしょう。今回は3秒にしています。この後のアクションで VOICEPEAK を終了させるのですが、すぐに(しゃべっている間に)終了してしまわないように待機時間を設けました。

1-6. VOICEPEAKを終了

アクション一覧の「システム」から「プロセスを終了する」を配置します。パラメーターの選択の「プロセスの指定方法」を「プロセスID」に、「プロセスID」は 1-1. アプリケーションの実行 で生成されたプロセスIDを指定します。今回は「%AppProcessId%」としています。

動作確認

ここまでできたら動作確認をしてきちんと動くか確かめてみましょう!ちゃんと何かしゃべって自動的に終了しましたね。

2. クリップボードからテキストを取得して読み上げてもらおう!

いまはまだ決まったテキストしかしゃべらないので、次はクリップボードから取得したテキストを読み上げてもらえるようにしてみましょう!

フローの全体像

こんな感じ。注目個所を囲んでいますー。

アクションの配置と変更

2-1. クリップボードからテキストを取得する

アクション一覧の「クリップボード」から「クリップボードテキストを取得」を配置します。配置する場所は 1-3. ウィンドウ内のテキストフィールドに入力する の上です。

2-2. 読み上げ用テキストをクリップボードから取得したテキストにする

1-3. ウィンドウ内のテキストフィールドに入力する のアクションを開いて「入力するテキスト」に入力されているテキストを、2-1. クリップボードからテキストを取得する で生成された変数に置き換えます。今回は「%ClipboardText%」としています。

2-3. VOICEPEAKを終了させないようにする

読み上げの途中で終了してしまわないよう、今回は VOICEPEAK を終了させないようにしましょう。1-5.1-6. で配置したアクション(Waitプロセスを終了する)を無効にしておきます。

動作確認

では、適当なテキストをコピーしてからフローを実行してみましょう。ちゃんと読み上げてくれましたね!

3. 連続で読み上げてもらおう!

いよいよです。ちょっと手順が増えますが、要は上で作った処理をループできればよいのですよ。

フローの全体像

こんな感じ。注目個所を囲んでいますー。

アクションの配置

だんだん複雑になってくるので、各アクションは全体像を参考にしながら配置していってくださいね。

3-1. ループ終了判定用変数

何らかの条件でループを終わらせたいので、フラグ用の変数を作っておきましょう。
アクション一覧の「変数」から「変数の設定」を配置します。配置場所は 1-2. で配置した「ウィンドウのUI要素をクリック」の下あたりでよいでしょう。変数名は「isLoop」とし、値は「true」にしておきます。

3-2. ループを作成

アクション一覧の「ループ」から「ループ条件」を配置します。配置場所は 3-1. で配置した変数の下あたりでよいでしょう。パラメータの選択で「最初のオペランド」を上で作った「%isLoop%」、「演算子」を「と等しい(=)」、「2番目のオペランド」を「true」としておきます。これで、isLooptrue の間はループすることになりますね。逆に言えば、isLoopfalse にすればループから抜けられます。

3-3. 終了条件を追加

何かの条件でループから抜けるようにしたいので、終了条件を追加します。今回は、「おわり」というテキストがコピーされたら(クリップボードから取得されたら)ループを抜けるようにします。
アクション一覧の「条件」から「If」を配置しましょう。配置場所はループの中ですね。パラメータの選択で「最初のオペランド」を「%ClipboardText%」、「演算子」を「と等しい(=)」、「2番目のオペランド」を「おわり」としておきます。

3-4. 終了判定

クリップボードから取得したテキストが「おわり」だったらループを抜けたいので、isLoopfalse にしましょう。
アクション一覧の「変数」から「変数の設定」を配置します。配置場所は If の直下です。「変数」を「isLoop」として「値」を「false」にすればOKです。

3-5. 終了しないとき

クリップボードから取得したテキストが「おわり」でなかった場合は読み上げてもらいたいので、Else句が必要ですね。
アクション一覧の「条件」から「Else」を配置しましょう。配置場所は 3-4. で配置した「変数の設定」の下です。

3-6. 読み上げてもらう

2-2. で修正したアクション(ウィンドウ内のテキストフィールドに入力する)と 1-4. で配置したアクション(ウィンドウのUI要素をクリック)を ElseEnd の間に配置しなおしましょう。「お前は何を言っているんだ?」という気分になったら全体像で確認しましょう。

3-7. クリップボードをクリアする

クリップボードにテキストがコピーされたままだと、読み上げを開始した瞬間にまたクリップボードからテキストを取得して読み上げを開始してその瞬間にまたクリップボードからテキストを取得して…とおかしなことになってしまうので、読み上げたらクリップボードをクリアしましょう。
アクション一覧の「クリップボード」から「クリップボードの内容をクリア」を配置します。配置場所は読み上げの直後でよいでしょう。

3-8. 最初にもクリップボードをクリアしておく

クリップボードにテキストがコピーされた状態でフローを開始すると、その内容を読み上げちゃいます。まかり間違って「ザリアトナトミクス・ジャンナ・エティトナムス・ファイラス・ハベレロン・フベントロンティー・ブラゾー・タブラソル・ニーサ…」なんて読み上げ始められた日には SAN値 は下がるわ 森の大いなる黒山羊 さんが召喚されそうになっちゃうわで大変なことになるので、そんなことにならないようにしておきましょう。具体的にはループの開始前にも「クリップボードの内容をクリア」を配置しておけばよいです。

動作確認

…実はこのままだと動きがおかしいので動作確認はしない方がよいです。。

4. まともに動くようにしましょう!

「動作確認はしない方がよい」と書いたので、してないと思いますが、実際に動かしてみるとなんか変な感じがします。なんか…このままだと使いものにならないので、まともに動くようにしましょう。

フローの全体像

こんな感じ。注目個所を囲んでいますー。

アクションの配置

各アクションの配置場所はフローの全体像を参考にしてくださいね。

4-1. クリップボードが空でないときだけ処理をする

3. までの状態だと、クリップボードが空でも Else句が実行されてしまい、ループのたびにテキストフィールドに入力して(空文字でも)読み上げをしようとしてしまいます。クリップボードが空の場合は、読み上げ処理は不要ですよね。
アクション一覧の「条件」から「Else if」を配置しましょう。配置場所はいまある「Else」の直下あたりでよいでしょう。パラメータの選択で「最初のオペランド」を「%ClipboardText%」、「演算子」を「空でない」にします。配置したら「Else」はいらなくなるので削除しちゃいましょう。

4-2. 終了することを知らせる

「おわり」がコピーされるとループを抜けて処理を終了しますが、それだけだと味気がないので、何か言ってから終了するようにしましょう。
すでに配置されている「ウィンドウ内のテキストフィールドに入力する」と「ウィンドウのUI要素をクリック」をコピーして、「If」直下の「変数の設定」の下あたりに貼り付けます。貼り付けたら、「ウィンドウ内のテキストフィールドに入力する」の「入力するテキスト」の内容を「処理を終了します。」に書き換えましょう。

4-3. 終了したら VOICEPEAK も終了する

ループを終了したら VOICEPEAK も終了したいので、2-3. で無効にしていたアクション(Waitプロセスを終了する)を有効に戻しておきます。Waitの秒数はいい感じに調整してくださいね。

動作確認

動作確認をして問題なく動くことを確認しましょう。
いろいろなテキストをコピーしてどんどん読み上げてもらっちゃいましょう!
お疲れさまでした!

さいごに

今回紹介したループでクリップボードのテキストを取得して処理をする方法ですが、いろいろな使い方ができます。参考までに、DeepL を使って英文を連続で翻訳するフローの動画も置いておきますね。
https://youtu.be/w_KigRwWmAo

他にも、音声入力と組み合わせて音声で操作したりというのもできたりします。特に、音声入力はマウスやキーボードを触らないので、RPAの処理への割り込み方法としてはけっこういいんじゃないかな?と思ったりします。
https://youtu.be/Nj9hw-v2Kb4

ではでは。

Discussion