スクリプトを作るとき、ちょっとユーザーの気を引きたくなることがある。たとえば、少し時間のかかる処理をするときに、終わったことを通知したい場合などだ。あるいは、実行後にすこし時間が経過してからエラーを通知するような場合にも、気を引きたくなることがある。
こんなとき昔のコンピューターならベル音やビープ音を鳴らすのが一般的だった。端末装置からコンピューターを使っていた頃、Ctrl+Gを出力するとベル音が鳴った。マイクロプロセッサが使われ始め、パソコンの原型ができあがった頃、BEEPと呼ばれる機能ができた。プログラムでビットをオンオフし、これをスピーカーに接続することで音を出していた。今もマザーボード上には、そのための小さなスピーカーがあるはずだ。しかしWindowsが普及するとともに、PCにサウンド機能が標準となり、簡単に音を鳴らせるようになった。
コントロールパネルの「サウンド」プロパティで開く、「サウンド」ダイアログボックスの「サウンド」タブには、Windowsがあらかじめ持っている「イベントサウンド」の定義がある。PlaySound APIなどを使うことで、こうしたシステム定義の音を鳴らすことができる。ただ、“ありもの”のサウンドは案外区別がつきにくい。しかし、独自のサウンドを鳴らすには音源ファイルを作る必要がある。それは面倒だ。
こうしたとき、Windowsの音声合成機能を使うと、音源の必要なく、適切な「音声によるメッセージ」を出すことができるようになる。
Windowsに用意されているSpeech API
Windowsには、Speach API(SAPI)があり、これを使うことで音声合成ができる。音声合成というと、なんか面倒くさそうな感じがしてしまうが、お手元のPCでPowerShell(Windows PowerShellを想定してあるが、PowerShell Coreでも確認済み)を開き、以下の2行のコマンドを実行してみてほしい。
$x=New-Object -ComObject SAPI.SpVoice
$x.Speak("早く人間に成りたい")
ちゃんと音が出るように設定されていれば、女性の声が聞こえるはずだ。これがSpeach APIの音声合成機能だ。喋らせるテキストは、普通のテキストそのままでいい。しかも、日本語の音声の場合、英単語が混じっていてもいい。
$x.Speak("ここにFile Nameを入れてEnter keyを押してください")
句読点を入れると、そこで一呼吸入れてくれる。
$x.Speak("早く,人間に,成りたい。早く人間に成りたい")
Speakメソッドを繰り返し使えば、ずっと話し続けてくれる。なおデフォルトでは、同期呼び出しなので、発声が終わるまでSpeakメソッドは戻ってこない。これだとスクリプトの実行に差し障るというのであれば、非同期呼び出しとして発声が終わる前に制御を戻すこともできる。それには、後ろにもう1つ引数を追加して1(SVSFlagsAsync)をつける。
$x.Speak("ここにFile Nameを入れてEnter keyを押してください",1)
なお、このSpeakメソッドに関しては、Microsoftの以下のページに情報がある。
●SpVoice Speak method (SAPI 5.4)
https://docs.microsoft.com/en-us/previous-versions/windows/desktop/ee125647(v=vs.85)
●SpeechVoiceSpeakFlags (SAPI 5.4) 2つ目の引数の指定
https://docs.microsoft.com/en-us/previous-versions/windows/desktop/ee125223(v=vs.85)
音量や声のキャラクターなど、ちょっと変化をつける
まずは、音量を変えてみる。
$x.Speak("お出かけですか")
$x.Volume=50
$x.Speak("お出かけですか")
$x.Volume=100
Volumeプロパティは、0~100の範囲で指定する。これは、Speech API側の出力を0~100%に設定するものなので、他の音との相対値である。最終的な音量はWindowsの設定で決まる。この値を低くすると、他のアプリよりも相対的に小さな音にすることができる。
次は、読み上げ速度だ。これは、rateプロパティで設定する。値は-10から10の範囲で、-10が最も遅く、デフォルト値は0である。
$x.rate=-10
$x.Speak("早く人間に成りたい",1)
$x.rate=0
次に声を変えてみる。日本語版Windowsでは、
Haruka(日本語、女性):0
Zira(英語、女性):1
David(英語、男性):2
の3つの声が利用できる。英語を話してほしいときには、ZiraかDavidを選ぶ。Davidなら
$x.Voice=$x.GetVoices().item(2)
$x.Speak("all works and no play makes jack a dull boy.",1)
とする。「item(2)」を「item(1)」にすればZiraが、「item(0)」にすればHarukaが選択できる。たとえば、
$x.Voice=$x.GetVoices().item(0);$x.Speak("裏に塀ができたんだってねぇ",1);$x.Voice=$x.GetVoices().item(2);$x.Speak("Hey",1)
とする。
この連載の記事
-
第449回
PC
WSLはプレビュー版でGUIでの設定が加わった! リリース2.3.xの新機能を見る -
第448回
PC
PowerShellで面倒なオブジェクトはPSCustomObjectに変換するのが早道 -
第447回
PC
この秋登場のWindows 11の新バージョン、Ver.24H2の状況を見る -
第446回
PC
Windows 11のフォトアプリがUWPからWin32アプリになったことで今更わかるUWPの問題点 -
第445回
PC
次期Windows 11ではAndroidのファイルをエクスプローラーからアクセス可能になる -
第444回
PC
外部ファイルをExcelに読み込む際の作業を効率化するPower Queryの活用 -
第443回
PC
Windows Terminalで採用されたCascadia Codeフォントを使うとプログラムを書くとき断然見やすい -
第442回
PC
Copilot+ PCで実現されるローカル推論で「対クラウド企業」を指向するMicrosoft -
第441回
PC
WSL以前から40年以上続く、Windows(Microsoft)とUNIXとの関わり -
第440回
PC
そもそも「Copilot+ PC」とは何なのか? -
第439回
PC
今更more.comを使うのか!? Windowsでのページングを考える - この連載の一覧へ