摘要:
語音是人類最自然的互動方式,也是現階段軟體使用者介面發展的最高目標。微軟公司一直積極推動語音技術的發展,並且公布了語音開發平台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)
本文作者:陳本峰