語音系統

語音是人類最自然的交互方式,也是現階段軟件用戶界面發展的最高目標。微軟公司一直積極推動語音技術的發展,並且公佈了語音開發平臺Speech SDK幫助開發人員實現語音應用。
隨着.net技術深入人心,越來越多的程序員開始轉到.net平臺上進行開發。然而,在新發布的.net speech SDK裏面並沒有對中文語音進行支持,目前支持中文的Speech SDK最高版本爲Windows平臺下的SAPI 5.1(),本文介紹如何在.net平臺下利用SAPI5.1開發中文語音應用程序。


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。

打開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)


本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/jabby12/archive/2004/08/08/68494.aspx

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章