因參加「挑戰杯」專案需整合語音功能,經調研發現微軟 SAPI (Speech API) 是成熟且易用的選擇。本文整理從 MSDN 學習的核心程式碼,示範如何在 C# Windows Forms 專案中實現「即時朗讀」與「匯出 WAV 檔」雙重功能,並支援中英文語音切換。
SAPI 為 COM 元件,需在專案中加入參考:
SpeechLib 互通組件)。tlbimp.exe 手動產生 DotNetSpeech.dll。using DotNetSpeech; // 或 using SpeechLib;
GroupBox:包含多行 TextBox (textBox1) 輸入待合成文字。RadioButton:radioButtonChina (預設勾選)、radioButtonEnglish 切換語言。Button:buttonSynthes (朗讀)、buttonTTStoWave (存成 WAV)。private void buttonSynthes_Click(object sender, System.EventArgs e)
{
try
{
SpeechVoiceSpeakFlags SpFlags = SpeechVoiceSpeakFlags.SVSFlagsAsync; // 非同步播放
SpVoice voice = new SpVoiceClass();
// 依語言選擇語音引擎
if (radioButtonEnglish.Checked)
voice.Voice = voice.GetVoices("language=409", "").Item(0); // 英文 (en-US)
else
voice.Voice = voice.GetVoices("language=804", "").Item(0); // 中文 (zh-CN)
voice.Speak(this.textBox1.Text, SpFlags);
}
catch (Exception ex)
{
MessageBox.Show("發生錯誤!", "SpeechApp", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void buttonTTStoWave_Click(object sender, System.EventArgs e)
{
try
{
SpeechVoiceSpeakFlags SpFlags = SpeechVoiceSpeakFlags.SVSFlagsAsync;
SpVoice Voice = new SpVoiceClass();
SaveFileDialog sfd = new SaveFileDialog();
sfd.Filter = "所有檔案 (*.*)|*.*|WAV 檔案 (*.wav)|*.wav";
sfd.Title = "儲存為語音檔";
sfd.FilterIndex = 2;
if (sfd.ShowDialog() == DialogResult.OK)
{
SpeechStreamFileMode SpFileMode = SpeechStreamFileMode.SSFMCreateForWrite;
SpFileStream SpFileStream = new SpFileStreamClass();
SpFileStream.Open(sfd.FileName, SpFileMode, false);
// 將音訊輸出導向檔案串流
Voice.AudioOutputStream = SpFileStream;
// 同樣依語言選擇引擎
if (radioButtonEnglish.Checked)
Voice.Voice = Voice.GetVoices("language=409", "").Item(0);
else
Voice.Voice = Voice.GetVoices("language=804", "").Item(0);
Voice.Speak(this.textBox1.Text, SpFlags);
Voice.WaitUntilDone(Timeout.Infinite); // 等待合成完成
SpFileStream.Close();
}
}
catch (Exception ex)
{
MessageBox.Show("發生錯誤!", "SpeechApp", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
| 項目 | 說明 |
|---|---|
SVSFlagsAsync | 非同步旗標,呼叫 Speak 後立即返回,不阻塞 UI 執行緒。 |
GetVoices("language=XXXX") | 依語言代碼 (LCID) 篩選已安裝的語音引擎。409 = 英文(美國),804 = 中文(簡體)。繁體中文通常為 1028 (0x0404),若系統安裝繁中引擎可改用 language=1028。 |
AudioOutputStream | 將預設喇叭輸出重導向至 SpFileStream,實現語音存檔。 |
WaitUntilDone | 區塊式等待非同步合成完成,確保檔案寫入完整後再關閉串流。 |
Main() 必須標記 [STAThread]。voice.Rate (-10~10) 與 voice.Volume (0~100) 調整。Speak 多載接受 XML 格式 SSML,可精細控制停頓、音調、重音。SpeakStarted、SpeakProgress、SpeakCompleted 事件實現進度列與高亮同步。System.Speech.Synthesis (僅限 Windows) 或第三方雲端 TTS 服務 (Azure Cognitive Services, Google Cloud TTS)。透過 Microsoft SAPI,我們以不到 50 行核心程式碼完成了功能完整的中英雙語 TTS 工具。無論是輔助閱讀、無障礙應用,還是自動化語音通知系統,這都是極具性價比的起手式。建議進一步探索 SSML 與事件驅動模型,釋放 SAPI 更強大的表現力。