微软的TTS
版權聲明:本文為博主原創文章,轉載時請在文章最后給出原文鏈接。
目錄(?)[-]
一、概述
? ? ? ? 項目中需要將數據庫中讀出的文本記錄通過電話播放給用戶,這就需要將文本轉換為語音,即所謂的TTS(Text To Speech)。目前TTS技術已相對比較成熟,TTS引擎也比較多,比較有名的有Microsoft Speech SDK 和IBM的ViaVoice還有開源的Festival等。本文僅對微軟的TTS進行討論。? ? ? ?軟件中的語音技術主要包括兩方面的內容,一個是語音識別(speech recognition) ,另外一個是語音合成(speech synthesis),也即是文本語音轉換系統(TTS)。TTS系統使用合成語音合成文本字符串和文件到聲音音頻流。而語音識別系統則是轉換人類的聲音語音流到可讀的文本字符串或者文件。這兩個工作,都是通過各種語音引擎來完成的。微軟所提供的SAPI (全稱The Microsoft Speech API),正是在應用程序和語音引擎之間提供一個高級別的接口,它實現了所有必需的對各種語音引擎的實時的控制和管理等低級別的細節。語音引擎通過DDI層(設備驅動接口)和SAPI進行交互,應用程序通過API層和SAPI通信。通過使用這些API,我們可以快速開發在語音識別或語音合成方面應用程序。SAPI 應用程序編程接口(API)明顯的減少了構建一個使用語音識別和文本語音轉換的應用程序所需要的高層代碼,使語音技術更加容易使用并且更加擴大了應用的范圍。雖然現在SAPI不是業界標準,但是應用非常廣泛。
SAPI包括以下組件對象(接口):
(1)Voice Commands API。對應用程序進行控制,一般用于語音識別系統中。識別某個命令后,會調用相關接口是應用程序完成對應的功能。如果程序想實現語音控制,必須使用此組對象。
(2)Voice Dictation API。聽寫輸入,即語音識別接口。
(3)Voice Text API。完成從文字到語音的轉換,即語音合成。
(4)Voice Telephone API。語音識別和語音合成綜合運用到電話系統之上,利用此接口可以建立一個電話應答系統,甚至可以通過電話控制計算機。(未見到相關資料)
(5)Audio Objects API。封裝了計算機發音系統。
其中Voice Text API,就是微軟TTS引擎的接口,通過它我們可以很容易地建立功能強大的文本語音程序。
二、如何配置
? ? ? 首先要添加SAPI.DLL文件的引用,如果安裝的VS 2010則會自帶有該com 組件。在C#程序中右鍵點擊引用,然后在COM組件里找到Microsoft Speech Object Library 5.4。我們可以從路徑中看到,其實它就是SAPI.DLL。然后在程序中加入:using SpeechLib;。然后我們就可以進行編程了。?
? ? ? ?如果你沒有該DLL,則需要去微軟的官網下載 Speech SDK安裝(免費的),需要安裝程序的有Speech SDK 5.1(68M)和5.1 Language Pack (81.5M)。網上經常會說添加DotNetSpeech.dll,而不是SAPI.DLL引用,其實前者是用Tlbimp.exe工具將該sapi.dll轉換成.net平臺下的Assembly---DotNetSpeech.dll,兩者的本質是一樣的。
注:如果你使用的是C++工程項目(VS 2010),則需要對項目屬性進行配置:
1.在項目屬性頁->配置屬性->c/c++c->常規,在附加包含目錄中,添加你的SAPI的include目錄,例如:C:\Program Files\Microsoft Speech SDK 5.1\Include
2..在項目屬性頁->配置屬性->連接器->輸入,在附加依賴項中,添加你的SAPI.lib庫的路徑,例如:C:\Program Files\Microsoft Speech SDK 5.1\Lib\i386\sapi.lib
3.在程序中添加引用:
#include <sapi.h>
#pragma comment(lib,"sapi.lib");
然后就可以進行編程了。C++的使用方法可以參考博客:http://www.cnblogs.com/eping/archive/2010/05/23/1742201.html,也可以在網上搜。
三、如何使用
? ? ??? SAPI的TTS都是通過SpVoice對象來完成的。SpVoice類是支持語音合成(TTS)的核心類。通過SpVoice對象調用TTS引擎,從而實現朗讀功能。?? ? ? SpVoice類有以下主要屬性:
? Voice: ? 表示發音類型,相當于進行朗讀的人,通常我們可以通過安裝相應的語音引擎來增加相應的語音。
? Rate: ? ? 語音朗讀速度,取值范圍為-10到+10。數值越大,速度越快。
? Volume:音量,取值范圍為0到100。數值越大,音量越大。
SpVoice有以下主要方法:
? Speak():完成將文本信息轉換為語音并按照指定的參數進行朗讀,該方法有Text和Flags兩個參數,分別指定要朗讀的文本和朗讀方式(同步或異步等)。
? Pause():暫停使用該對象的所有朗讀進程。該方法沒有參數。
? Resume():恢復該對象所對應的被暫停的朗讀進程。該方法沒有參數。?
關于SpVoice更多的內容可以參考幫助文件,安裝了Speech SDK就會有,也可以去網上下載,不過是5.1版本的。
[csharp]?view plaincopy[csharp]?view plaincopy
這里輸出文件格式除了.WAV還有別的格式,可以用
[csharp]?view plaincopy
進行更改。 [csharp]?view plaincopy
注:
? ? ? ? 這里編譯可以通過,運行時也沒有音頻輸出,按理說是輸出到內存中去了,但是不知道如何操作這個內存,比如返回一個指針什么的。SpMemoryStream 有GetData(),SetData()方法,分別是從內存中讀取數據,和寫數據。前者返回的是Object,后者沒有返回值。所以沒有辦法從內存中得到音頻流,然后用別的工具(比如語音卡的內存播發函數)進行播放。
? ? ? ? 目前有一個折中的方案,先將數據庫中的文本合成到語音文件,然后調用文件播放函數(語音卡的函數)加載后播放電話端。這樣一次播放就進行了兩次IO操作。
參考文章:
http://www.cnblogs.com/SkyD/archive/2008/08/28/1278478.html
http://www.cnblogs.com/pfs1314/archive/2011/01/11/1932870.html
http://q.cnblogs.com/q/8393/
http://tech.it168.com/a2011/0103/1145/000001145635_1.shtml
http://blog.csdn.net/callmeback/article/details/6838024
http://blog.csdn.net/yuanchunze/article/details/3850835
轉載:http://blog.csdn.net/GAMEloft9/article/details/24715501
總結
- 上一篇: 帆布指纹识别(canvas finger
- 下一篇: 看雪论坛做测试题得30Kx(附答案)