---
title: "SAPIとは？Windows標準のMicrosoft音声APIの使い方｜SpVoice・音声一覧・非推奨の範囲"
url: "https://www.issoh.co.jp/column/details/7657/"
published: 2025-07-11
updated: 2026-10-15
categories: ["自動化"]
publisher: "株式会社一創"
---

# SAPIとは？Windows標準のMicrosoft音声APIの使い方｜SpVoice・音声一覧・非推奨の範囲

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)](https://learn.microsoft.com/en-us/previous-versions/windows/desktop/ee125077%28v=vs.85%29)は、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](https://learn.microsoft.com/en-us/previous-versions/office/developer/speech-technologies/dd146963%28v=office.14%29)です。名前空間は`System.Speech`ではなく`Microsoft.Speech`で、Runtime 11とSDK 11だけでは合成用の言語が入っておらず、言語ごとのRuntime Languageを追加でインストールする必要があります。Skype for Business Server向けSDK（UCMA 5.0）の前提コンポーネントにも挙がるサーバー寄りの部品ですが、[MSDN Magazineの解説（2014年12月号）](https://learn.microsoft.com/en-us/archive/msdn-magazine/2014/december/voice-recognition-speech-recognition-with-net-desktop-applications)のようにコンソールやWindows Formsのアプリからも呼べます。OSの一部であるSystem.Speechと違い、配布先ごとにランタイムと言語を入れる手間がかかる点が最大の違いです。

「Bing Speech API」はクラウドの旧サービスです。Microsoftのドキュメントは[Bing Speech APIはAzure Speech Serviceに置き換えられて非推奨](https://learn.microsoft.com/en-us/previous-versions/xamarin/xamarin-forms/data-cloud/azure-cognitive-services/introduction)と記載しており、現在の後継は[Azure Speech in Foundry Tools](https://learn.microsoft.com/en-us/azure/ai-services/speech-service/overview)です。古いサンプルにBing Speechのエンドポイントが出てきたら、Azure Speechへ書き換える前提で読んでください。Azureの音声サービスと生成AI系サービスの守備範囲は[Azure AI ServicesとAzure OpenAI Serviceの違い｜守備範囲とリソース種別で選ぶ基準](/tech/details/16635/)で整理しています。

## SAPIの現状：読み上げは現役、Windows音声認識は非推奨

2026年時点で押さえるべき変化は、音声認識側の扱いです。読み上げ側とは分けて読みます。

### Windows音声認識は2023年12月に非推奨

Microsoftの[Deprecated features in the Windows client](https://learn.microsoft.com/en-us/windows/whats-new/deprecated-features)（2026年9月23日更新の版）には、Windows音声認識が「非推奨で、開発は終了している」と掲載され、voice accessへ置き換えると書かれています。告知は2023年12月です。Microsoftサポートの[Windows音声認識のページ](https://support.microsoft.com/en-us/windows/use-voice-recognition-in-windows-83ff75bd-63eb-0b6c-18d4-6fae94050571)によれば、置き換えは2024年9月にWindows 11 バージョン22H2以降で実施済みで、Windows音声認識が残るのはそれより前のWindowsです。

なお、非推奨一覧の該当行は対応ロケールを英語だけと書いたままですが、[voice accessの設定ガイド](https://support.microsoft.com/en-us/accessibility/windows/voice-access/set-up-voice-access)では日本語・中国語・イタリア語などを含む15の言語・方言に対応しています。日本語のWindows 11でも、音声でのPC操作や文字入力はvoice accessで行えます。

### 非推奨の対象範囲：OS機能とSAPI本体の区別

非推奨として載っているのは「Windows音声認識」というOSの機能です。同じ一覧に、SAPIそのものや音声合成（TTS）の項目はありません。公式情報に沿って切り分けると次のとおりです。

- **読み上げ（TTS）**：非推奨一覧に該当する告知はない。`SAPI.SpVoice`による読み上げは引き続き使える。
- **音声認識**：OS機能のWindows音声認識が非推奨。SAPIの認識系インターフェイスの廃止が告知されたわけではないが、新規開発の認識機能をSAPIに依存させる設計は避ける。

同じ一覧には、VBScriptも2023年10月付で非推奨として載っています。[移行の案内](https://learn.microsoft.com/en-us/windows/whats-new/deprecated-features-resources)によれば、VBScriptは機能オンデマンドに移したうえで将来のリリースで削除され、当面は機能オンデマンドがプリインストールされた状態で使えます。SpVoiceをVBScriptから呼んでいる既存スクリプトは、PowerShellかVBAへの移し替えを計画してください。日本語の音声認識を新しく組むなら、クラウドの音声認識かローカルの音声認識モデルが候補になります。方式の選び方は[音声認識とは？AIの仕組み・精度の考え方・業務導入の判断基準を解説](/column/details/12929/)で、業務システムへの組み込みは[AI音声認識システム開発](/service/ai/speech%5Frec/)で扱っています。

## SAPIで使える音声：デスクトップ音声とOneCore音声

「SAPIで日本語の声がHarukaしか出ない」「ナレーターで選べる声がSpVoiceに出てこない」という相談は、SAPIの不具合ではなく音声の登録先の違いで起きます。

### 日本語でHarukaしか出ない理由

[SAPI 5.4のドキュメント](https://learn.microsoft.com/en-us/previous-versions/windows/desktop/ee125675%28v=vs.85%29)は、SAPIの音声の登録先をレジストリの`HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Speech\Voices\Tokens`と記載しています。`SpVoice.GetVoices`が返すのは、このカテゴリに登録された音声トークンです。

一方、Windowsのナレーターの[対応音声一覧（Appendix A）](https://support.microsoft.com/en-us/accessibility/windows/narrator/appendix-a-supported-languages-and-voices)では、日本語の従来音声は男性がIchiro、女性がAyumiとHarukaです。Windows 11 バージョン22H2以降の自然な音声（natural voices）として、男性Keita・女性Nanamiも別に用意されています。英語（米国）の従来音声はDavid・Mark・Ziraです。

Windows 10以降の新しい音声は、従来のカテゴリとは別の枠（OneCore）で管理されています。[Qiitaで公開されている実行例](https://qiita.com/7shi/items/dc21a3be8b7c69fbc11b)では、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のリファレンス](https://learn.microsoft.com/en-us/uwp/api/windows.media.speechsynthesis.speechsynthesizer.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](https://github.com/PowerShell/PowerShell/releases/tag/v7.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の[破壊的変更の告知](https://learn.microsoft.com/en-us/dotnet/core/compatibility/interop/5.0/built-in-support-for-winrt-removed)のとおり、.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のリファレンス](https://learn.microsoft.com/en-us/previous-versions/windows/desktop/ee125639%28v=vs.85%29)によれば、選択条件を付けない場合の並び順は音声名のアルファベット順です。順序は決まっていても、入っている音声の顔ぶれが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のリファレンス](https://learn.microsoft.com/en-us/previous-versions/windows/desktop/ee125019%28v=vs.85%29)は、既定の話速はコントロールパネルの音声プロパティで決まり、すべての音声が同じ既定の話速を持つわけではないと書いています。同じ`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のリファレンス](https://learn.microsoft.com/en-us/previous-versions/windows/desktop/ee125654%28v=vs.85%29)では、-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](https://learn.microsoft.com/en-us/previous-versions/windows/desktop/ms720858%28v=vs.85%29)で、読み取りの`SSFMOpenForRead`が0、書き込みの`SSFMCreateForWrite`が3です。3は同名のファイルがあっても作り直して上書きします。読み書き両用の1と2はWAVファイルに対応していません。[Openメソッドのリファレンス](https://learn.microsoft.com/en-us/previous-versions/windows/desktop/ms722562%28v=vs.85%29)の公式サンプルも同じ手順です。`C:\temp`フォルダは事前に作っておいてください。

## VBA・ExcelでのSAPI.SpVoiceの実装

VBAからも同じCOMオブジェクトを使います。参照設定を追加せず`CreateObject`で遅延バインディングすれば、配布先の参照設定に依存しません。

### Excelのセル範囲の読み上げ

入力値を読み上げて目視と突き合わせる用途では、話速を少し落とすと聞き取りやすくなります。`#N/A`などのエラー値は`IsError`で、空セルは`Len(Trim(...))`で飛ばします。[SpeechVoiceSpeakFlags](https://learn.microsoft.com/en-us/previous-versions/windows/desktop/ee125223%28v=vs.85%29)の既定では、先頭が「<」の文字列を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実装](/tech/details/3395/)を参照してください。

## 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年版】](/tech/details/15911/)で比較しています。

### 判断軸3：その場の再生とファイルの量産

処理完了の通知、画面内容の確認、業務スクリプトのアラートといった「その場で鳴らす」用途はSAPIが最も手軽です。前述のSpFileStreamでWAVも作れるので、社内マニュアルの短い音声程度ならSAPIで足ります。大量のナレーションを作る場合は、声の選択肢、読みの修正のしやすさ、1文字あたりの料金を比べてクラウドのバッチ合成と見比べます。方式全体の選び方は[音声合成AIの作り方｜OSS TTS・クラウドAPI・受託開発の方式選定と実装手順](/tech/details/15361/)、製品の比較は[音声合成ソフト比較｜法人向けの選び方・商用利用ライセンス・費用相場を解説](/column/details/15356/)にまとめています。

## SAPIが動かないときの確認順序

### 音が出ないときの再生デバイスと単体実行の確認

最初にSAPI以外の要因を確認します。音量ミキサーで対象アプリがミュートになっていないか、既定の再生デバイスが使用中のスピーカーになっているかを確認します。そのうえで最小の読み上げコードを単体で実行し、SAPI自体が動くかを切り分けます。単体で鳴るのにアプリから鳴らないなら、両者の実行ユーザー、ログオンセッション、音声の出力先の設定を比べます。非同期で呼んでいる場合は、読み上げ前にスクリプトが終了していないかも確認します。

### 日本語が不自然なときの音声選択の確認

最初に、選択中の音声が英語音声になっていないかを確かめます。英語音声に日本語を渡すとまともに読めません。列挙コードで`GetDescription()`を確認し、日本語の音声を明示的に選びます。日本語音声が一覧に出ない場合は、Windowsの設定の「音声」から日本語の音声パッケージを追加します。

### スクリプトが止まるときの実行ポリシーの確認

読み上げ以前に、実行ポリシーでスクリプトが止められている場合があります。[about\_Execution\_Policies](https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about%5Fexecution%5Fpolicies)のとおり、グループポリシーで設定されたポリシーは`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で行います。

## 関連記事

- [Amazon Pollyとは？日本語音声の制約と4エンジンの料金・実装手順【2026年版】](/tech/details/15911/)
- [音声合成AIの作り方｜OSS TTS・クラウドAPI・受託開発の方式選定と実装手順](/tech/details/15361/)
- [音声合成AIとは？仕組み・音声認識との違い・業務での使いどころと導入判断](/column/details/16421/)
- [音声認識とは？AIの仕組み・精度の考え方・業務導入の判断基準を解説](/column/details/12929/)
- [UIAutomationとは｜Windows UI自動化の仕組みとC#・Python・VBA実装](/tech/details/3395/)

---

出典: [SAPIとは？Windows標準のMicrosoft音声APIの使い方｜SpVoice・音声一覧・非推奨の範囲](<https://www.issoh.co.jp/column/details/7657/>)（株式会社一創）
