Speech Application Programming Interface(Speech API、SAPI)は、Windowsアプリケーションで音声認識や音声合成を使うためにマイクロソフトが開発したAPI。このAPIには様々なバージョンがあり、Speech SDK の一部として出荷されたものもあれば、Windows OS 自体の一部としてリリースされたものもある。SAPI を使ったアプリケーションとしては、Microsoft Office、Microsoft Agent、Microsoft Speech Server などがある。

一般にどのバージョンのAPIであっても、様々な言語で音声合成/認識機能を使ったアプリケーションを書くための標準インタフェースを提供している。また、サードパーティがSAPI対応の音声認識エンジンや音声合成エンジンを開発することも可能となっている。原則として、それらエンジンが定義されたインタフェースに準拠している限り、マイクロソフト提供のエンジンの代替として使うことが可能である。

Speech API は自由に再配布可能なコンポーネントであり、それを使っているアプリケーションと同梱させることが可能である。音声認識/合成エンジンの多くも自由に再配布可能である。

SAPI には2つのファミリがある。バージョン1から4までは互いによく似ていて、新しいバージョンほど新機能が追加されている。しかし2000年にリリースされた SAPI 5 のインタフェースは従来とは全く異なる。その後、SAPI 5 のマイナーチェンジ版がいくつかリリースされている。

## 基本アーキテクチャ

SAPIは言わば、アプリケーションと音声(合成/認識)エンジンの間のインタフェースあるいはミドルウェアである。SAPIバージョン1から4では、アプリケーションは直接エンジンとやり取りできる。APIには、アプリケーションとエンジンが準拠すべき抽象「インタフェース定義」も含まれる。アプリケーションはエンジンのメソッドを直接呼び出す代わりに、単純化された高レベルのオブジェクトを使うこともできる。

一方、SAPI 5 ではアプリケーションとエンジンは直接やり取りできない。その代わり、両者が1つのランタイムコンポーネント(sapi.dll)とやり取りする。このコンポーネントにアプリケーション向けAPIとエンジン向けインタフェースが実装されている。

SAPI 5 アプリケーションは、認識文法のロード、認識開始、合成すべき文を提供するなどといった作業にこのAPIを使う。sapi.dll はそのコマンドを解釈して処理し、必要に応じてエンジンインタフェースを通してエンジンを呼び出す(例えば、ファイルからの文法のロードは sapi.dll で行われるが、文法データは実際に認識を行う認識エンジンに渡される)。処理中、認識エンジンや合成エンジンもイベントを生成することがある(例えば、発声を認識したことを示す場合や、合成音声内の単語境界を示す場合など)。そのような逆方向の経路で、エンジンから dll を経由してアプリケーションにイベントが通知される。

実際のAPIと sapi.dll に加えて、Speech SDK を構成する他のコンポーネントが SAPI の一部としてリリースされている。ほとんどのバージョンの Speech SDK に以下のコンポーネントが含まれている。

- API定義ファイル - MIDL(Microsoft Interface Definition Language)とC/C++用ヘッダファイル
- ランタイムコンポーネント - sapi.dll
- コントロールパネル・アプレット - デフォルトの音声認識/音声合成エンジンを選択/設定するのに使う。
- 音声合成エンジン - 各種言語用がある。
- 音声認識エンジン - 各種言語用がある。
- 再配布可能コンポーネント - アプリケーションに同梱可能なエンジンとランタイム。
- サンプルコード - アプリケーションとエンジンのサンプルコード。エンジンの方はインタフェースが定義されているだけで中身はなく、既存のエンジンのSAPIへの移植サンプルとなっている。
- 文書

## バージョン

### SAPI 1-4 API ファミリ

SAPI 4 API(C++、COM、ActiveX)の主なコンポーネントは以下の通り。

- Voice Command - 音声認識の制御用高レベルオブジェクト
- Voice Dictation - 連続口述音声認識のための高レベルオブジェクト
- Voice Talk - 音声合成のための高レベルオブジェクト
- Voice Telephony - 電話音声アプリケーション向けオブジェクト
- Direct Speech Recognition - 認識エンジンの直接制御用オブジェクト
- Direct Text To Speech - 合成エンジンの直接制御用オブジェクト
- Audio objects - 音声デバイスや音声ファイルの読み書き用オブジェクト

### SAPI 5 API ファミリ

SAPI 5.0 ランタイムを含む Speech SDK version 5.0 は2000年にリリースされた。従来のバージョンとは完全に異なる設計で、従来の SAPI 用アプリケーションやエンジンはかなり改造しないと使えないようになっていた。

設計思想として、エンジンとアプリケーションを厳密に分離しようとしたため、全ての呼び出しはランタイムである sapi.dll を経由するようになった。これによってAPIがエンジン独立になり、アプリケーションが不用意に特定のエンジンの機能に依存してしまうようなことがなくなった。また、管理や初期化のコードがランタイムに移されたことで、音声技術を使ったアプリケーションが書きやすくなった。

新APIは当初 COM API のみであり、C/C++ からのみ使えるようになっていた。VB やスクリプト言語のサポートは後から追加された。OSとしては、Windows 98 と NT 4.0 以降でサポートされた。

主な機能は以下の通り:

- 独立したプロセス(sapisvr.exe)として動作する音声認識エンジン。複数のアプリケーションが1つの認識エンジンを共有して使うことができる。リソースが共有できるようになり(例えばマイク入力の奪い合いがエンジン側で調停される)、制御用インタフェースが共通化できる。
- 認識処理の明確な制御を必要とするアプリケーションでは、プロセス内で動作する認識エンジンを使うこともできる。
- 音声認識エンジンが単語を識別するための文法。SAPI 5 では文法をXMLマークアップで定義でき、コード内でそれを動的に生成可能である。音声認識エンジンに組み込みの口述言語モデルをロードさせるメソッドもある。
- テキストからの音声合成を行うオブジェクト。合成処理の制御にマークアップ言語(XMLに類似しているが厳密にはXMLではない)を使うことができる。
- マイクやファイルからの音声入力やスピーカー(または任意のサウンドデバイス)やファイルへの音声出力を行うオブジェクトがランタイムに含まれている。標準的でない場所と音声ストリームをやり取りするためのカスタムオブジェクトを書くこともできる。
- ユーザー定義の単語や発音を語彙として追加可能。

## Windows Vista の音声機能

Windows Vista には、以下のような音声関連の新たな機能が含まれている。

- Windows GUI とアプリケーションの完全な音声制御
- 音声認識制御用の新たなチュートリアル、ウィザード、ユーザインタフェース
- SAPI 5.3 ランタイム
- 新たな音声認識エンジン(バージョン8)
- 新たな音声合成エンジンと SAPI ボイス Microsoft Anna
- マネージコード Speech API (コード名は SpeechFX)
- リリース時点で8種類の言語の音声認識をサポート: アメリカ英語、イギリス英語、簡体字中国語、繁体字中国語、日本語、ドイツ語、フランス語、スペイン語。他の言語も順次対応予定とされている。
- Microsoft Agent を筆頭として全てのマイクロソフト製音声アプリケーションで SAPI 5 を使用

## 互換性

以下のオペレーティングシステムの SAPI は互換性がある。

- Microsoft Windows Vista
- Microsoft Windows XP
- Microsoft Windows 2000
- Microsoft Windows Millennium Edition
- Microsoft Windows 98
- Microsoft Windows NT 4.0, Service Pack 6a(英語、日本語、Simplified Chinese)

## SAPI を使っている主なアプリケーション

- Microsoft Windows XP Tablet PC Edition
- Windows Speech Recognition (Windows Vista)
- Microsoft Narrator (Windows 2000 以降)
- Microsoft Office XP と Office 2003
- Microsoft Agent
- Microsoft Speech Server
- Microsoft Voice Command
- Adobe Acrobat
- JAWS