コンテンツにスキップ

Windowsに英語でしゃべらせる

[質問]

PowerShellで、SpeechSynthesizer を利用して、合成音声をしゃべらせています。デフォルトでは日本語音声がしゃべるのですが、これを英語音声に変えられますか。なお、当方の環境には"Zira" が入っているので、SelectVoice("Microsoft Zira Desktop")とすれば問題ありませんが、環境依存ですよね? どんな環境でも、日本語音声ではなく英語音声がしゃべってほしいのです。

[回答] Gemini

ご指摘の通り、SelectVoice で特定の名前を直接指定すると、その音声がインストールされていない環境ではエラーになってしまいます。

「どんな環境でも(英語音声が入っていれば)確実に英語で喋らせる」ためには、音声の名前ではなく、音声の属性(Culture/言語設定)でフィルタリングして選択するのがスマートで確実な方法です。

英語音声を動的に選択する方法

GetInstalledVoices() メソッドでシステム内の音声一覧を取得し、その中から Cultureen-US(または en から始まるもの)を探して選択するスクリプトがこちらです。

Add-Type -AssemblyName System.Speech
$say = New-Object System.Speech.Synthesis.SpeechSynthesizer

# インストールされている音声の中から、言語が英語("en")のものを探す
$englishVoice = $say.GetInstalledVoices() | Where-Object { 
    $_.VoiceInfo.Culture.Name.StartsWith("en") -and $_.Enabled 
} | Select-Object -First 1

if ($englishVoice) {
    $say.SelectVoice($englishVoice.VoiceInfo.Name)
    $say.Speak("Hello, this is an English voice selected dynamically.")
} else {
    Write-Warning "英語の音声エンジンが見つかりませんでした。"
    $say.Speak("英語の音声が見つかりません。")
}

解説とポイント

  1. GetInstalledVoices() の活用: 環境に依存する「名前」ではなく、OSに登録されている音声リストをプログラム側で一度スキャンします。
  2. Culture プロパティでの判定: $_.VoiceInfo.Culture.Name を見ることで、その音声が日本語(ja-JP)か英語(en-US / en-GB)かを判別できます。.StartsWith("en") とすることで、アメリカ英語やイギリス英語など、広く英語系音声をヒットさせることができます。
  3. フォールバック(予備動作): 万が一、英語音声が一つもインストールされていない環境でもスクリプトがクラッシュしないよう、if ($englishVoice) でチェックを入れるのがお作法として安心です。

補足:Windows 10/11 の設定

このスクリプトは、Windowsの「設定」→「時刻と言語」→「音声認識」にある「音声管理」で追加されている音声を利用します。標準的なWindows環境であれば大抵 ZiraDavid が入っていますが、もしヒットしない場合はOS側に英語の音声パックが追加されているかを確認してください。

次は、この英語音声を使ってテキストファイルの内容を読み上げるようなスクリプトの作成をお手伝いしましょうか?