.Net平臺下開發中文語音應用程式
摘要:
語音是人類最自然的互動方式,也是現階段軟體使用者介面發展的最高目標。微軟公司一直積極推動語音技術的發展,並且公佈了語音開發平臺Speech SDK幫助開發人員實現語音應用。
隨著.net技術深入人心,越來越多的程式設計師開始轉到.net平臺上進行開發。然而,在新發布的.net speech SDK裡面並沒有對中文語音進行支援,目前支援中文的Speech SDK最高版本為Windows平臺下的SAPI 5.1(),本文介紹如何在.net平臺下利用SAPI5.1開發中文語音應用程式。
目錄:
1. SAPI.51 SDK淺析以及安裝
2. 匯入COM物件到.Net
3. 用C#開發中文TTS應用程式示例
4. 結論
5. 參考文獻
1. SAPI.51 SDK淺析以及安裝
SAPI SDK是微軟公司免費提供的語音應用開發工具包,這個SDK中包含了語音應用設計介面(SAPI)、微軟的連續語音識別引擎(MCSR)以及微軟的語音合成(TTS)引擎等等。目前的5.1版本一共可以支援3種語言的識別 (英語,漢語和日語)以及2種語言的合成(英語和漢語)。SAPI中還包括對於低層控制和高度適應性的直接語音管理、訓練嚮導、事件、語法編譯、資源、語音識別(SR)管理以及TTS管理等強大的設計介面。其結構如圖(1):
圖(1)
語音引擎則通過DDI層(裝置驅動介面)和SAPI(SpeechAPI)進行互動,應用程式通過API層和SAPI通訊。通過使用這些API,使用者可以快速開發在語音識別或語音合成方面應用程式。
SAPI5.1 SDK可以從微軟網站下載:http://www.microsoft.com/speech/download/sdk51/ 需要安裝程式的有Speech SDK 5.1(68M)和5.1 Language Pack (81.5M)。
2. 匯入COM物件到.Net
SAPI5.1的基於Windows平臺的,通過COM介面進行呼叫。在.Net平臺下要應用SAPI5.1,我們可以利用.Net Framework自帶的強大工具TlbImp.exe來把SAPI SDK的COM物件匯入到.Net中。TlbImp.exe產生一個管制的包裝類,管理客戶端可以使用它。包裝類管理實際的COM物件的參考數。當包裝類當作收集的垃圾時,包裝類釋放掉它包裝的COM物件。當然,你也可以在VS.NET環境中通過從專案參考對話方塊選擇COM物件,實現COM物件的匯入,這個過程也是通過TlbImp.exe來完成的。
下面演示如何匯入SAPI的COM物件:
D:/Program Files/Common Files/Microsoft Shared/Speech>Tlbimp sapi.dll /out: DotNetSpeech.dll
在安轉SDK以後,可以在D:/Program Files/Common Files/Microsoft Shared/Speech/目錄下面找到SAPI.dll,這裡面定義了SAPI的COM物件,用Tlbimp.exe工具將該dll轉換成.net平臺下的Assembly---DotNetSpeech.dll,轉換的過程會提示不少的警告(warning),但這部影響我們的開發,可以忽略。最後,我們可以用ildasm檢視DotnetSpeech.dll裡面的物件。
3. 用C#開發中文TTS應用程式示例
下面通過一個例項來介紹如何利用C# 進行開發語音應用程式,開發環境為:
作業系統: Windows 2000 中文版+ SP3
.Net Framework: 1.0.3705(英文版)
Visual Studio.Net 7.0.9466(英文版)
首先,新建一個C#的Windows Application工程SpeechApp,在開發環境的右邊的解決方案管理器(Solution Explorer)中,新增DotNetSpeech物件庫。右鍵點選"Reference"(參考),選擇"Add Reference"(新增參考),在彈出的檔案選擇對話方塊中找到剛才生成的DotNetSpeech.dll。
圖(2)
開啟Form1.cs程式碼檔案,在程式碼開頭新增名字空間(注意大小寫)。
using DotNetSpeech;
這樣就實現了SAPI SDK的匯入,下面我們就可以開始編寫應用程式碼了。本示例演示如何把文字通過喇叭朗讀出來以及把文字轉化成語音訊號(Wave聲音檔案),程式介面如圖(3):
//朗讀 private void buttonSynthesis_Click(object sender, System.EventArgs e) { try { SpeechVoiceSpeakFlags SpFlags = SpeechVoiceSpeakFlags.SVSFlagsAsync; SpVoice Voice = new SpVoice(); Voice.Speak(this.textBoxText.Text, SpFlags); } catch(Exception er) { MessageBox.Show("An Error Occured!","SpeechApp", MessageBoxButtons.OK, MessageBoxIcon.Error); } } //生成聲音檔案(Wav) private void buttonTTStoWave_Click(object sender, System.EventArgs e) { try { SpeechVoiceSpeakFlags SpFlags = SpeechVoiceSpeakFlags.SVSFlagsAsync; SpVoice Voice = new SpVoice(); SaveFileDialog sfd = new SaveFileDialog(); sfd.Filter = "All files (*.*)|*.*|wav files (*.wav)|*.wav"; sfd.Title = "Save to a wave file"; sfd.FilterIndex = 2; sfd.RestoreDirectory = true; if (sfd.ShowDialog()== DialogResult.OK) { SpeechStreamFileMode SpFileMode = SpeechStreamFileMode.SSFMCreateForWrite; SpFileStream SpFileStream = new SpFileStream(); SpFileStream.Open(sfd.FileName, SpFileMode, false); Voice.AudioOutputStream = SpFileStream; Voice.Speak(txtSpeakText.Text, SpFlags); Voice.WaitUntilDone(Timeout.Infinite); SpFileStream.Close(); } } catch(Exception er) { MessageBox.Show("An Error Occured!","SpeechApp", MessageBoxButtons.OK, MessageBoxIcon.Error); } }
接下來,還要去控制面板配置Speech SDK引擎當前所處理語言。開啟"控制面板",開啟"語音"配置專案,可以看到在這裡我們可以指定當前可以對何種語言進行識別或者合成,還可以配置相關的硬體裝置以及控制語速。(如圖4)
在"文字-語音轉換"的"語音選擇"組合框中選擇簡體中文(Microsoft Simplified Chinese)。這樣就可以合成漢語文字了。
回到VS.Net,F5編譯執行剛才的應用程式,在文字框裡輸入漢字,戴上耳機,點選"朗讀"按鈕,開始體驗新一代的智慧人機介面吧,呵呵:)
4. 結論
微軟為語音人機介面提供了強大的平臺,.net環境更使這種開發方便快捷。趕快去下載SAPI5.1 SDK,讓你的應用程式"繪聲繪色",體現Nature UI,Let’s GO!!!
5. 參考文獻
[1] Speech SDK自帶的說明文件(SAPI.chm)
[2] MSDN (msdn.microsoft.com)
本文作者:陳本峰