PowerShell で自然な声の音声読み上げ
PowerShell は何も入れなくても話せます。Windows には System.Speech の合成エンジンがあり、数行でバックアップの完了やビルドの失敗をスクリプトに知らせてもらえます。ただ、その声は Windows に何年も前からあるロボットのような声で、マシンごとに違います。
無料の SuperClonica エンジンは、自然なニューラル音声を自分のPCやサーバーで動かし、PowerShell からは Invoke-RestMethod 1回で呼び出せます。このガイドでは両方の方法と、使い分けを紹介します。
PowerShell から話す2つの方法
ちょっとした通知なら System.Speech で十分ですが、人が聞くものには自然な声を使いましょう。
- System.Speech:Windows に組み込み。Add-Type -AssemblyName System.Speech で読み込み、SpeechSynthesizer クラスを使います。
- オフラインで動き追加のものは不要ですが、声はロボット的で、インストールされている Windows の音声に左右されます。
- SuperClonica:自然な声、キャラクターの声、学習させた自分の声を使えるローカルの HTTP サーバー。
- 31言語を話します。中国語にはまだ対応していません。
声を無料で聞く
どの声のページでも、スクリプトに言わせたい文を30〜100文字で入力し、言語を選んで生成ボタンを押します。数秒で違いが分かります。アカウントは不要です。
ローカルの SuperClonica サーバーを呼ぶ
Windows PowerShell 5.1 は文字列の本文を誤ったエンコードで送るので、上のように UTF-8 のバイト列を渡します。また BOM のない .ps1 を ANSI として読むため、日本語を含むスクリプトは BOM 付き UTF-8 で保存しましょう。
- サーバーを一度起動。Windows なら Docker Desktop で:docker run -d -p 8000:8000 -v superclonica-models:/models superclonica/superclonica:cpu。
- PowerShell から読み上げ:$json = @{text='夜間バックアップが完了しました'; voice='F1'; lang='ja'} | ConvertTo-Json; Invoke-RestMethod -Method Post -Uri http://localhost:8000/synthesize -ContentType 'application/json' -Body ([Text.Encoding]::UTF8.GetBytes($json)) -OutFile hello.wav。
- ファイルは16ビット・モノラルの WAV で、どのプレーヤー、動画編集ソフト、スクリプトでも使えます。
- ほかのマシンから接続できるなら、サーバーに SUPERCLONICA_API_KEY を設定し、-Headers @{Authorization="Bearer あなたのキー"} を加えます。
話すスクリプト
(New-Object Media.SoundPlayer "hello.wav").PlaySync() で WAV をすぐ再生するか、お知らせを保存して後で使います。タスクスケジューラーで朝の要約を読み上げたり、CI ジョブでビルドの失敗をオフィスのスピーカーで知らせたり、CSV をループして数百のガイダンスを一度に作ったりできます。短い文ならふつうのCPUで1秒を大きく下回ります。
System.Speech で十分なとき
声が「楽しむもの」ではなく「伝わればよいもの」なら System.Speech で十分です。席にいるときの手早い通知、アクセシビリティのテスト、Docker のないマシンなど。動画、ガイダンス、アナウンス、製品など、音声が自分の机の外に出るとき、あるいはどのマシンでも同じ声で聞こえる必要があるときは SuperClonica を使いましょう。