Microsoft Speech SDK 5.1 提供 SAPI (Speech API),核心介面 ISpVoice 讓開發者以極少程式碼實現文字轉語音 (TTS)。本文涵蓋環境建置、基本語音輸出、語速/音量/聲音選擇、XML 標籤精細控制 (音調、停頓、逐字拼讀)、將語音存檔為 WAV 完整範例。
Include 路徑。Lib 路徑。Tools → Options → Directories 全域設定。
#include
#pragma comment(lib, "ole32.lib")
#pragma comment(lib, "sapi.lib")
int main() {
ISpVoice* pVoice = NULL;
if (FAILED(::CoInitialize(NULL))) return -1;
HRESULT hr = CoCreateInstance(CLSID_SpVoice, NULL, CLSCTX_ALL,
IID_ISpVoice, (void**)&pVoice);
if (SUCCEEDED(hr)) {
hr = pVoice->Speak(L"Hello world", 0, NULL);
pVoice->Release();
}
::CoUninitialize();
return 0;
}
| 方法 | 功能 | 關鍵參數 |
|---|---|---|
Speak(pwcs, dwFlags, pulStreamNumber) | 語音輸出 | pwcs: Unicode 字串; dwFlags: SPF_IS_XML (解析 XML), SPF_ASYNC (非同步) |
Pause() / Resume() | 暫停/繼續 | |
SetRate(-10~10) / GetRate() | 語速調整 | 0=正常, 負=較慢, 正=較快 |
SetVolume(0~100) / GetVolume() | 音量調整 | |
SetSyncSpeakTimeout(ms) | 同步模式逾時 | 避免 Speak 卡死 |
SetOutput(pUnk, fAllowFormatChanges) | 設定輸出目標 | 可導向檔案串流、音訊裝置 |
SPF_IS_XML)
pVoice->Speak(L" "
L"Volume Max Normal",
SPF_IS_XML, NULL);
| 標籤 | 功能 | 範例 |
|---|---|---|
<VOICE REQUIRED='Name=...'/> | 選擇聲音引擎 | Microsoft Sam / Mary / Mike (英文版) |
<VOLUME LEVEL='0~100'>...</VOLUME> | 區段音量 | <VOLUME LEVEL='50'>安靜</VOLUME> |
<PITCH MIDDLE='-10~10'>...</PITCH> | 音調 | |
<RATE SPEED='-10~10'>...</RATE> | 語速 | |
<SPELL>...</SPELL> | 逐字母拼讀 | <SPELL>ABC</SPELL> |
<EMPH>...</EMPH> | 強調 | |
<SILENCE MSEC='ms'/> | 靜音停頓 | <SILENCE MSEC='500'/> |
<PRON SYM='phoneme'/> | 指定音素發音 | <PRON SYM='h eh - l ow 1'/> (hello) |
<CONTEXT ID='date_ymd'>...</CONTEXT> | 日期/時間/數字讀法 | <CONTEXT ID='date_ymd'>1999.12.21</CONTEXT> |
XML 標籤可巢狀,但手工撰寫大量標籤極其繁瑣,實務上建議開發「所見即所得」編輯器自動產生標記文本。
#include // SDK 範例工具標頭
ISpVoice* pVoice = NULL;
CoCreateInstance(CLSID_SpVoice, NULL, CLSCTX_ALL, IID_ISpVoice, (void**)&pVoice);
CComPtr cpWavStream;
CComPtr cpOldStream;
CSpStreamFormat origFmt;
pVoice->GetOutputStream(&cpOldStream);
origFmt.AssignFormat(cpOldStream);
// 綁定檔案串流
HRESULT hr = SPBindToFile(L"D:\\output.wav", SPFM_CREATE_ALWAYS,
&cpWavStream, &origFmt.FormatId(),
origFmt.WaveFormatExPtr());
if (SUCCEEDED(hr)) {
pVoice->SetOutput(cpWavStream, TRUE);
pVoice->Speak(L" Text to wave", SPF_IS_XML, NULL);
}
pVoice->Release();
::CoUninitialize();
MSSpeech_TTS_zh-CN_HuiHui.msi / MSSpeech_TTS_zh-TW_HanHan.msi)。HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Speech\Voices\Tokens 查詢。SAPI 5.1 以 COM 介面封裝強大 TTS 功能,ISpVoice 入門門檻極低,XML 標籤提供專業級韻律控制。語音辨識 (SR) 同屬 SAPI 範疇,有興趣可進一步探索 ISpRecoContext、ISpRecoGrammar 等介面。