SAPI(Speech Application Programming Interface)とは、Microsoftが提供するWindows標準の音声APIです。テキストを読み上げる音声合成(TTS)と、音声を文字にする音声認識の両方を扱い、COMオブジェクトのSAPI.SpVoiceを使えばPowerShell・VBAから数行で読み上げられます。この記事では、SpVoiceの実装手順に加えて、日本語でHarukaしか選べない理由とOneCore音声の関係、WAVファイルへの書き出し、PowerShell 7での扱い、そして「SAPIは非推奨なのか」という疑問への線引きを、Microsoftの公式ドキュメントと配布物の実測で確認できる範囲に絞って整理します。
まとめ:SAPIの要点
- SAPIとは:Windowsに標準搭載された音声API。読み上げ(TTS)と音声認識の2機能を持ち、追加インストールなしで使える。
- 版の現状:公開されている最後のリファレンスはSAPI 5.4で、アーカイブ扱い(最終更新2012年)。5.4より後のメジャー版は出ていない。
- 非推奨の範囲:2023年12月に非推奨になったのはOS機能の「Windows音声認識」。SAPI本体や読み上げは非推奨一覧に載っていない。
- 音声の数:SAPIが列挙するのは従来の音声カテゴリだけ。ナレーターで選べるAyumi・Ichiroや自然な音声のNanami・Keitaは、SAPIの一覧に出ないことがある。Ayumi・IchiroなどOneCore側の音声はWinRTのAPIで列挙する。
- PowerShell:COMの
SAPI.SpVoiceは5.1でも7でも使える。PowerShell 7.6.7のWindows版にはSystem.Speech.dllも同梱されている。WinRTの型は、PowerShell 7.1以降では掲載の書き方で読み込めない。 - 使い分け:オフライン・無料・その場の読み上げならSAPI。音質・多言語・大量のナレーション制作ならクラウドのAzure Speechなどを選ぶ。
SAPIとは何か:Windows標準の音声API
MicrosoftのSpeech API Overview (SAPI 5.4)は、SAPIを「アプリケーションと音声エンジンの間に立つ高水準のインターフェイス」と説明し、エンジンのリアルタイム動作の制御・管理という低レベルの処理をSAPI側が実装するとしています。開発者は、エンジンごとの実装差を意識せずに読み上げや認識を組み込めます。
なお、SAPIという略称は軍用の防弾プレート(Small Arms Protective Insert)、Sapeet社の営業ロープレサービス、SAPIXの学習サービスなどにも使われています。この記事が扱うのはMicrosoftの音声APIです。
読み上げと音声認識の2つのエンジン
SAPIのエンジンはTTS(テキストを合成音声にする)と音声認識(発話を文字列にする)の2種類です。TTS側の中心はCOMインターフェイスのISpVoiceで、オブジェクトを生成してISpVoice::Speakを呼べば読み上げが始まります。話速はSetRate、音量はSetVolume、音声はSetVoiceで切り替えます。読み上げ中の単語境界や口の形(viseme)をイベントで受け取れるため、字幕の同期やキャラクターの口パクにも使えます。
音声認識側の中心はISpRecoContextです。複数アプリで共有する共有認識エンジン(CLSID_SpSharedRecoContext)と、インプロセス認識エンジン(CLSID_SpInprocRecoInstance)があり、公式概要は大半のアプリに共有認識エンジンを推奨しています。インプロセス側は、単独で動かし性能を最優先する大規模サーバー向けという位置づけです。
SAPI 5.4が最後の版という現状
Microsoft Learnで読めるSAPIのリファレンスは5.3と5.4の2系統で、どちらもprevious-versions配下のアーカイブ記事です。5.4の概要ページは最終更新が2012年12月で、それより新しい版のリファレンスはありません。SAPIが動かなくなったという意味ではなく、Windowsに載ったAPIとして引き続き呼び出せます。ただ「SAPIは今も進化している」という説明には公式の裏づけがありません。新規に採用するなら、仕様が固定された枯れたAPIとして評価するのが実態に合います。
Microsoftの音声APIの系統:SAPI・System.Speech・WinRT・Azure Speechの違い
「Microsoft Speech API」「Windows Speech API」で検索すると、名前の似た別物が混ざって出てきます。SAPIはそのうちのひとつにすぎません。どれを指しているかで、使えるOS・音声・費用が変わります。
| 名称 | 形態 | 主な入口 | 現状 |
|---|---|---|---|
| SAPI 5.x | Windows標準のCOM API | SAPI.SpVoice / ISpVoice | 5.4が最後のリファレンス |
| System.Speech | .NETのラッパー | SpeechSynthesizer | .NET Framework 3.0〜4.8.1、モダン.NETはNuGet |
| Speech Platform 11 | サーバー向けランタイム | Microsoft.Speech | 言語パックを別途導入 |
| Windows.Media.SpeechSynthesis | WinRT API | SpeechSynthesizer.AllVoices | Windows 10以降 |
| Azure Speech | クラウドサービス | Speech SDK / REST | Foundry Toolsの一部 |
Speech Platform 11とBing Speech APIは別物
名前で最も取り違えやすいのがMicrosoft Speech Platform 11です。名前空間はSystem.SpeechではなくMicrosoft.Speechで、Runtime 11とSDK 11だけでは合成用の言語が入っておらず、言語ごとのRuntime Languageを追加でインストールする必要があります。Skype for Business Server向けSDK(UCMA 5.0)の前提コンポーネントにも挙がるサーバー寄りの部品ですが、MSDN Magazineの解説(2014年12月号)のようにコンソールやWindows Formsのアプリからも呼べます。OSの一部であるSystem.Speechと違い、配布先ごとにランタイムと言語を入れる手間がかかる点が最大の違いです。
「Bing Speech API」はクラウドの旧サービスです。MicrosoftのドキュメントはBing Speech APIはAzure Speech Serviceに置き換えられて非推奨と記載しており、現在の後継はAzure Speech in Foundry Toolsです。古いサンプルにBing Speechのエンドポイントが出てきたら、Azure Speechへ書き換える前提で読んでください。Azureの音声サービスと生成AI系サービスの守備範囲はAzure AI ServicesとAzure OpenAI Serviceの違い|守備範囲とリソース種別で選ぶ基準で整理しています。
SAPIの現状:読み上げは現役、Windows音声認識は非推奨
2026年時点で押さえるべき変化は、音声認識側の扱いです。読み上げ側とは分けて読みます。
Windows音声認識は2023年12月に非推奨
MicrosoftのDeprecated features in the Windows client(2026年9月23日更新の版)には、Windows音声認識が「非推奨で、開発は終了している」と掲載され、voice accessへ置き換えると書かれています。告知は2023年12月です。MicrosoftサポートのWindows音声認識のページによれば、置き換えは2024年9月にWindows 11 バージョン22H2以降で実施済みで、Windows音声認識が残るのはそれより前のWindowsです。
なお、非推奨一覧の該当行は対応ロケールを英語だけと書いたままですが、voice accessの設定ガイドでは日本語・中国語・イタリア語などを含む15の言語・方言に対応しています。日本語のWindows 11でも、音声でのPC操作や文字入力はvoice accessで行えます。
非推奨の対象範囲:OS機能とSAPI本体の区別
非推奨として載っているのは「Windows音声認識」というOSの機能です。同じ一覧に、SAPIそのものや音声合成(TTS)の項目はありません。公式情報に沿って切り分けると次のとおりです。
- 読み上げ(TTS):非推奨一覧に該当する告知はない。
SAPI.SpVoiceによる読み上げは引き続き使える。 - 音声認識:OS機能のWindows音声認識が非推奨。SAPIの認識系インターフェイスの廃止が告知されたわけではないが、新規開発の認識機能をSAPIに依存させる設計は避ける。
同じ一覧には、VBScriptも2023年10月付で非推奨として載っています。移行の案内によれば、VBScriptは機能オンデマンドに移したうえで将来のリリースで削除され、当面は機能オンデマンドがプリインストールされた状態で使えます。SpVoiceをVBScriptから呼んでいる既存スクリプトは、PowerShellかVBAへの移し替えを計画してください。日本語の音声認識を新しく組むなら、クラウドの音声認識かローカルの音声認識モデルが候補になります。方式の選び方は音声認識とは?AIの仕組み・精度の考え方・業務導入の判断基準を解説で、業務システムへの組み込みはAI音声認識システム開発で扱っています。
SAPIで使える音声:デスクトップ音声とOneCore音声
「SAPIで日本語の声がHarukaしか出ない」「ナレーターで選べる声がSpVoiceに出てこない」という相談は、SAPIの不具合ではなく音声の登録先の違いで起きます。
日本語でHarukaしか出ない理由
SAPI 5.4のドキュメントは、SAPIの音声の登録先をレジストリのHKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Speech\Voices\Tokensと記載しています。SpVoice.GetVoicesが返すのは、このカテゴリに登録された音声トークンです。
一方、Windowsのナレーターの対応音声一覧(Appendix A)では、日本語の従来音声は男性がIchiro、女性がAyumiとHarukaです。Windows 11 バージョン22H2以降の自然な音声(natural voices)として、男性Keita・女性Nanamiも別に用意されています。英語(米国)の従来音声はDavid・Mark・Ziraです。
Windows 10以降の新しい音声は、従来のカテゴリとは別の枠(OneCore)で管理されています。Qiitaで公開されている実行例では、System.Speechで列挙した日本語の音声は「Microsoft Haruka Desktop – Japanese」の1つだけで、WinRTで列挙するとAyumi・Haruka・Ichiro・Sayakaの4つが出ています。この実行例では、従来のカテゴリに登録されたMicrosoftの音声の名前に「Desktop」が付いています。どちらのカテゴリの音声かは、後述の列挙コードで表示するId(トークンのレジストリ上の場所)で確かめるのが確実です。
WinRTによるOneCore音声の列挙
OneCore側の音声は、WinRTのWindows.Media.SpeechSynthesis.SpeechSynthesizer.AllVoicesで列挙します。Windows PowerShell 5.1なら、WinRTの型を次の書き方で読み込めます。
# Windows PowerShell 5.1 専用(PowerShell 7.1 以降はこの型指定を解決できない)
$null = [Windows.Media.SpeechSynthesis.SpeechSynthesizer, Windows.Media.SpeechSynthesis, ContentType = WindowsRuntime]
[Windows.Media.SpeechSynthesis.SpeechSynthesizer]::AllVoices |
Select-Object DisplayName, Language, Gender, Id
AllVoicesのリファレンスは、このAPIで合成に使えるのは「システムにインストールされたMicrosoft署名の音声だけ」と明記しています。他社製のSAPI 5音声を入れても、WinRT側では使えません。逆に、他社製の音声を使う業務アプリはSAPI側に残すのが筋です。
OneCore音声のレジストリコピーを勧めない理由
OneCoreの音声トークンを従来のカテゴリへコピーしてSAPIから使う方法がネットで紹介されていますが、Microsoftが案内している手順ではありません。HKLMへの書き込みには管理者権限が要り、Windowsの更新で音声データの場所が変わればトークンだけが残って壊れます。配布するツールでは採用せず、Ayumi・Ichiroが必要ならWinRTを使ってください。ナレーターの自然な音声(Nanami・Keita)をWinRTやSAPIから呼べるとする公式の記載は見当たらないので、より自然な声が要件ならクラウドのTTSを検討します。
SAPIの呼び出し方:COM・System.Speech・WinRTとPowerShellの版
同じ「Windowsで読み上げる」でも、経路によって動くPowerShellの版が違います。PowerShell 7の扱いは誤解が多いので、配布物を実測して確認しました。
| 経路 | Windows PowerShell 5.1 | PowerShell 7(Windows) | 列挙される音声 |
|---|---|---|---|
| COM SAPI.SpVoice | 使える | 使える | 従来のSAPI音声 |
| System.Speech | 使える | 7.6.7は同梱 | GetInstalledVoicesで確認 |
| WinRT SpeechSynthesis | 使える | 掲載の型指定では不可 | OneCore音声を含む |
PowerShell 7.6.7(Windows版)のSystem.Speech同梱
2026年10月13日公開のPowerShell 7.6.7のWindows版zip(PowerShell-7.6.7-win-x64.zip)を展開すると、ルートにSystem.Speech.dllがあり、pwsh.deps.jsonにはWindows用ランタイム(runtimes/win/lib/net10.0)のSystem.Speech 10.0.5が登録されています。Windows互換パッケージ(Microsoft.Windows.Compatibility 10.0.5)経由で入っているもので、PowerShell 7でもAdd-Type -AssemblyName System.Speechの参照先は存在します。
ただし、Add-Typeが通ることは読み上げが動く証拠になりません。macOS版のPowerShell 7.6.6で試すと、Add-Type -AssemblyName System.Speechは成功し、SpeechSynthesizerを生成した時点でPlatformNotSupportedException(Speech is not supported on this platform.)になりました。New-Object -ComObjectはWindows以外ではパラメーター自体がありません。どちらもWindows専用の経路です。
PowerShell 7.1以降でのWinRT型指定の非対応
前掲のWinRTの列挙コードはWindows PowerShell 5.1専用です。.NETの破壊的変更の告知のとおり、.NET 5からWinRTの組み込みサポートが削除され、WinMDファイルを直接読み込めなくなりました。PowerShell 7.1以降は.NET 5以降で動くため、ContentType = WindowsRuntimeによる型指定が解決できません(7.0は.NET Core 3.1ベースで、すでにサポートが終わっています)。C#/WinRTで生成した相互運用アセンブリを読み込む方法はあるものの、スクリプト1本で済ませたい用途には手間が見合いません。OneCore音声をスクリプトから扱うなら、Windows PowerShell 5.1で実行してください。
Windows上でVBA・Windows PowerShell 5.1・PowerShell 7のどれからも同じAPIを呼びたいなら、COMのSAPI.SpVoiceに統一するのが最も確実です。言語ごとに構文は違いますが、プロパティとメソッドは共通です。以降の実装例はCOMで書きます。
PowerShellによるSAPI.SpVoiceの実装
以降のコードは、Microsoftの公式リファレンスに記載されたメソッドとプロパティの仕様に沿って書いたものです。Windows実機での実行結果を記録したものではないため、業務に組み込む前に対象のWindowsで動作を確かめてください。
SpVoiceによる最小の読み上げコード
$voice = New-Object -ComObject SAPI.SpVoice
$voice.Speak("SAPIによる読み上げのテストです。") | Out-Null
[System.Runtime.InteropServices.Marshal]::ReleaseComObject($voice) | Out-Null
Speakはストリーム番号を返すため、Out-Nullで受け流さないとコンソールに数値が出ます。最後の行はCOMオブジェクトの解放です。単発のスクリプトなら省略しても終了時に解放されますが、ループで繰り返し生成する処理では入れておきます。
インストール済み音声の列挙と名前による選択
$voice = New-Object -ComObject SAPI.SpVoice
foreach ($token in $voice.GetVoices()) {
"{0} [{1}]" -f $token.GetDescription(), $token.Id
}
Idには音声トークンのレジストリ上の場所が入るので、前章の「どのカテゴリの音声か」もここで確認できます。GetVoicesのリファレンスによれば、選択条件を付けない場合の並び順は音声名のアルファベット順です。順序は決まっていても、入っている音声の顔ぶれがPCごとに違うので、同じ番号が別のPCでは別の音声を指したり範囲外になったりします。音声は番号ではなく名前で選びます。
$voice = New-Object -ComObject SAPI.SpVoice
$found = $false
foreach ($token in $voice.GetVoices()) {
if ($token.GetDescription() -like "*Haruka*") {
$voice.Voice = $token
$found = $true
break
}
}
if (-not $found) { throw "Harukaの音声が見つかりません。音声の一覧を確認してください。" }
$voice.Speak("日本語の音声で読み上げます。") | Out-Null
話速Rateと音量Volumeの設定値と注意点
Rateの範囲は-10(最も遅い)から10(最も速い)、Volumeは0から100です。誤解しやすいのはRateの0で、これは「調整なし」であって絶対的な標準速度ではありません(Volumeの0は最小の音量です)。ISpVoice::SetRateのリファレンスは、既定の話速はコントロールパネルの音声プロパティで決まり、すべての音声が同じ既定の話速を持つわけではないと書いています。同じRate = -2でも、音声を変えれば体感速度は変わります。範囲外の値は切り捨てられることがあります。
$voice = New-Object -ComObject SAPI.SpVoice
$voice.Rate = -2 # -10(最も遅い) 〜 10(最も速い)。0は調整なし
$voice.Volume = 80 # 0 〜 100
$voice.Speak("話速と音量を調整しています。") | Out-Null
Rateはいつでも変更できますが、反映されるのは次の読み上げが始まったときです。読み上げ中に書き換えても、その途中から速度は変わりません。
非同期実行と割り込みのフラグ指定
Speakは既定では読み上げが終わるまで戻りません。オートメーションのフラグはSpeechVoiceSpeakFlags列挙体で、既定のSVSFDefaultが0、非同期のSVSFlagsAsyncが1、待ち行列の読み上げを破棄するSVSFPurgeBeforeSpeakが2です。組み合わせるときは値を足して渡します。
$voice = New-Object -ComObject SAPI.SpVoice
$voice.Speak("長いテキストを非同期で読み上げます。", 1) | Out-Null # SVSFlagsAsync
Start-Sleep -Seconds 1
$voice.Speak("割り込んで差し替えました。", 3) | Out-Null # SVSFlagsAsync + SVSFPurgeBeforeSpeak
$voice.WaitUntilDone(-1) | Out-Null
非同期で呼んだままスクリプトが終わると、読み上げも途中で止まります。最後のWaitUntilDone(-1)で読み上げの完了を待ってから終了させます(WaitUntilDoneのリファレンスでは、-1は時間制限なしで読み終わるまで待つ指定です)。C++からISpVoice::Speakを呼ぶ場合の定数はSPF_ASYNC・SPF_PURGEBEFORESPEAKという別系統の名前です。ネット上のサンプルは両者が混在しているので、コピーする前にどちらの経路の記事かを確かめてください。
SpFileStreamによるWAVファイル出力
SAPIはスピーカーへの再生だけでなく、ファイルへの書き出しもできます。SAPI.SpFileStreamを書き込みモードで開き、SpVoiceのAudioOutputStreamに設定してからSpeakを呼びます。
$voice = New-Object -ComObject SAPI.SpVoice
$stream = New-Object -ComObject SAPI.SpFileStream
$stream.Open("C:\temp\sapi_test.wav", 3, $false) # 3 = SSFMCreateForWrite(既存ファイルは上書き)
try {
$voice.AudioOutputStream = $stream
$voice.Speak("音声ファイルに書き出しています。") | Out-Null
}
finally {
$stream.Close() # 失敗してもファイルを閉じる
}
モードの値はSpeechStreamFileModeで、読み取りのSSFMOpenForReadが0、書き込みのSSFMCreateForWriteが3です。3は同名のファイルがあっても作り直して上書きします。読み書き両用の1と2はWAVファイルに対応していません。Openメソッドのリファレンスの公式サンプルも同じ手順です。C:\tempフォルダは事前に作っておいてください。
VBA・ExcelでのSAPI.SpVoiceの実装
VBAからも同じCOMオブジェクトを使います。参照設定を追加せずCreateObjectで遅延バインディングすれば、配布先の参照設定に依存しません。
Excelのセル範囲の読み上げ
入力値を読み上げて目視と突き合わせる用途では、話速を少し落とすと聞き取りやすくなります。#N/Aなどのエラー値はIsErrorで、空セルはLen(Trim(...))で飛ばします。SpeechVoiceSpeakFlagsの既定では、先頭が「<」の文字列をXMLとして解析するため、任意のセル値や引数を読むときは第2引数に16(SVSFIsNotXML)を渡してただの文字列として扱わせます。
Sub SpeakRange()
Dim voice As Object
Dim cell As Range
Set voice = CreateObject("SAPI.SpVoice")
voice.Rate = -2
For Each cell In Range("A1:A10")
If Not IsError(cell.Value) Then
If Len(Trim(CStr(cell.Value))) > 0 Then
voice.Speak CStr(cell.Value), 16 ' 16 = SVSFIsNotXML
End If
End If
Next cell
Set voice = Nothing
End Sub
SAPI不在時のエラートラップ
SAPIが使えない環境では、オブジェクト生成の時点で実行時エラーになります。読み上げが主機能でないツールでは、失敗しても本体の処理を止めない作りにします。
Sub SpeakSafely(ByVal text As String)
Dim voice As Object
On Error GoTo NoSapi
Set voice = CreateObject("SAPI.SpVoice")
voice.Speak text, 16
Set voice = Nothing
Exit Sub
NoSapi:
Debug.Print "音声読み上げを利用できません: " & Err.Description
End Sub
VBAからWindowsの画面操作そのものを自動化したい場合は、SAPIではなく別のAPIの担当です。UIAutomationとは|Windows UI自動化の仕組みとC#・Python・VBA実装を参照してください。
SAPIのバージョン:SAPI 4とSAPI 5の違い、5.3と5.4の位置づけ
SAPI 4とSAPI 5の非互換
SAPI 4系と5系は設計が異なる別系統で、SAPI 4向けのコードを5系へそのまま持ち込めません。Microsoftがエンジンベンダー向けにSAPI 4から5への移植ガイドを別に用意していることが、両者が置き換え可能でないことを示しています。現在のWindowsで扱うのは実質5系だけで、公式ドキュメントはSAPIオートメーションを使うアプリの動作要件をSAPI 5.1以降としています。
SAPI 5.3で入ったSSMLとSRGSへの対応
SAPI 5.3で、W3Cの音声合成マークアップ言語SSML 1.0に対応しました。SSMLを受け取ったSAPIは内部で独自のSAPITTSマークアップへ変換するので、既存のTTSエンジンが個別にSSML対応する必要はありません。オートメーションではSVSFIsXML(値8)でXMLとして解釈させ、SVSFParseSsmlでSSMLとして解析させます。読みの指定や間の調整は、クラウドでなくローカルのSAPIでも書けます。
音声認識側では、W3CのSRGS(音声認識文法仕様)で文脈自由文法を定義できるようになりました。ただし、SRGSによるDTMF(プッシュ信号)文法には対応せず、表現形式もXMLだけでABNF形式は使えません。電話系のシステムを設計するときに効いてくる制約です。
SAPIとクラウド音声APIの使い分け
SAPIとクラウドTTSは優劣ではなく要件で選びます。判断が分かれるのは次の3点です。
判断軸1:オフライン完結と機密性
Windows標準の音声エンジンを使う限り、SAPIの読み上げはPC内で完結し、ネット接続もAPIキーも要りません。読み上げるテキストが外部へ送られないため、機密情報を扱う業務端末や外部接続を制限した環境では、選択肢がSAPIに絞られることがあります。
判断軸2:音質と対応言語
Windows標準の日本語の従来音声はIchiro・Ayumi・Harukaの3つで、そのうちSAPIから見える音声は限られます(前述のQiitaの実行例ではHarukaだけ)。何が使えるかは対象のPCで列挙して確かめます。声の種類や話し方を選びたい、多言語のナレーションをそろえたい、配信前に複数の声を試聴して決めたいという要件なら、クラウドのTTSを候補にします。各サービスの日本語音声と料金はAmazon Pollyとは?日本語音声の制約と4エンジンの料金・実装手順【2026年版】で比較しています。
判断軸3:その場の再生とファイルの量産
処理完了の通知、画面内容の確認、業務スクリプトのアラートといった「その場で鳴らす」用途はSAPIが最も手軽です。前述のSpFileStreamでWAVも作れるので、社内マニュアルの短い音声程度ならSAPIで足ります。大量のナレーションを作る場合は、声の選択肢、読みの修正のしやすさ、1文字あたりの料金を比べてクラウドのバッチ合成と見比べます。方式全体の選び方は音声合成AIの作り方|OSS TTS・クラウドAPI・受託開発の方式選定と実装手順、製品の比較は音声合成ソフト比較|法人向けの選び方・商用利用ライセンス・費用相場を解説にまとめています。
SAPIが動かないときの確認順序
音が出ないときの再生デバイスと単体実行の確認
最初にSAPI以外の要因を確認します。音量ミキサーで対象アプリがミュートになっていないか、既定の再生デバイスが使用中のスピーカーになっているかを確認します。そのうえで最小の読み上げコードを単体で実行し、SAPI自体が動くかを切り分けます。単体で鳴るのにアプリから鳴らないなら、両者の実行ユーザー、ログオンセッション、音声の出力先の設定を比べます。非同期で呼んでいる場合は、読み上げ前にスクリプトが終了していないかも確認します。
日本語が不自然なときの音声選択の確認
最初に、選択中の音声が英語音声になっていないかを確かめます。英語音声に日本語を渡すとまともに読めません。列挙コードでGetDescription()を確認し、日本語の音声を明示的に選びます。日本語音声が一覧に出ない場合は、Windowsの設定の「音声」から日本語の音声パッケージを追加します。
スクリプトが止まるときの実行ポリシーの確認
読み上げ以前に、実行ポリシーでスクリプトが止められている場合があります。about_Execution_Policiesのとおり、グループポリシーで設定されたポリシーはSet-ExecutionPolicyより優先されるので、会社のPCでは変更できないことがあります。変更できる場合も、影響範囲を現在のユーザーに限定します。RemoteSignedでは、インターネットから取得した印の付いたスクリプトに署名が必要です。内容を確認した自作スクリプトなら、Unblock-Fileで印を外すと実行できます。
Get-ExecutionPolicy -List
Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy RemoteSigned
よくある質問
SAPIとは何ですか?
SAPIとは、Microsoftが提供するWindows標準の音声API(Speech Application Programming Interface)です。音声合成(読み上げ)と音声認識の両方を扱い、エンジン制御の細部をSAPIが引き受けるため、少ないコードで音声機能を組み込めます。Windowsに標準で入っており、追加インストールは要りません。
SAPI.SpVoiceとは何ですか?
SAPI.SpVoiceは、SAPIの音声合成を扱うCOMオブジェクトのProgIDです。PowerShellではNew-Object -ComObject SAPI.SpVoice、VBAではCreateObject("SAPI.SpVoice")で生成し、Speakメソッドで読み上げます。話速のRate、音量のVolume、音声のVoice、出力先のAudioOutputStreamといったプロパティを持ちます。
SAPIの最新バージョンはいくつですか?
公開されている最後のリファレンスはSAPI 5.4で、それより後のメジャー版のドキュメントはありません。5.4の概要ページはアーカイブ扱いで、最終更新は2012年です。Windows 10・Windows 11でもSAPI 5系のインターフェイスは動きます。
SAPIは非推奨になったのですか?
非推奨として告知されているのは、OS機能の「Windows音声認識」(2023年12月)です。Microsoftの非推奨機能一覧に、SAPIそのものや音声合成の項目はありません。SpVoiceによる読み上げは引き続き使えますが、新規開発で音声認識をSAPIに依存させる設計は避けてください。
Microsoft Zira Desktopとは何ですか?
Windowsに入っている英語(米国)の女性の音声です。ナレーターの対応音声一覧では、英語(米国)の従来音声は男性David・Mark、女性Ziraです。SpVoiceやSystem.Speechで従来のカテゴリの音声を列挙すると「Microsoft Zira Desktop – English (United States)」のように表示され、WinRTで列挙すると「Microsoft Zira – English (United States)」のように「Desktop」の付かない名前で表示されます。
PowerShell 7でもSAPIは使えますか?
Windows版のPowerShell 7なら、COMのSAPI.SpVoiceをそのまま使えます。PowerShell 7.6.7のWindows版にはSystem.Speech.dllも同梱されています。使えないのは、WinRTのWindows.Media.SpeechSynthesisをContentType = WindowsRuntimeで直接読み込む書き方です。.NET 5でWinRTの組み込みサポートが削除されたため、PowerShell 7.1以降ではこの書き方が通りません。OneCore音声の列挙はWindows PowerShell 5.1で行います。