首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> 關於VC++

Microsoft Speech SDK (SAPI 5.1) 文字轉語音 (TTS) 入門:從基本語音合成到 XML 標籤控制、WAV 輸出完整教學

     編輯:關於VC++

Microsoft Speech SDK 5.1 提供 SAPI (Speech API),核心介面 ISpVoice 讓開發者以極少程式碼實現文字轉語音 (TTS)。本文涵蓋環境建置、基本語音輸出、語速/音量/聲音選擇、XML 標籤精細控制 (音調、停頓、逐字拼讀)、將語音存檔為 WAV 完整範例。

環境建置

  1. 下載 Microsoft Speech SDK 5.1 及 Language Pack (中文/英文)。
  2. 專案屬性 → C/C++ → Additional Include Directories 加入 SDK Include 路徑。
  3. Linker → Additional Library Directories 加入 SDK Lib 路徑。
  4. 或在 Tools → Options → Directories 全域設定。

最小可行程式 (20 行)


#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;
}

ISpVoice 核心方法速查

方法功能關鍵參數
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)設定輸出目標可導向檔案串流、音訊裝置

XML 標籤精細控制 (需 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 標籤可巢狀,但手工撰寫大量標籤極其繁瑣,實務上建議開發「所見即所得」編輯器自動產生標記文本。

將語音輸出存為 WAV 檔案


#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();

中文支援注意事項

  • 必須安裝 中文 Language Pack (如 MSSpeech_TTS_zh-CN_HuiHui.msi / MSSpeech_TTS_zh-TW_HanHan.msi)。
  • 語音引擎名稱於註冊表 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Speech\Voices\Tokens 查詢。
  • 中文 TTS 引擎支援注音/拼音標記,需查閱對應 Phoneme Table。

總結

SAPI 5.1 以 COM 介面封裝強大 TTS 功能,ISpVoice 入門門檻極低,XML 標籤提供專業級韻律控制。語音辨識 (SR) 同屬 SAPI 範疇,有興趣可進一步探索 ISpRecoContext、ISpRecoGrammar 等介面。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved