TTS就是Text To Speech,文本轉語音,文本朗讀,差不多是壹個意思。在語音系統開發中經常要用到。
目前市場上的TTS很多,實現方式也各式各樣,有的很昂貴,如科大訊飛,據說當初得到863計劃的資助,有很高的技術;有的相對便宜,如捷通華聲, InfoTalk;也有免費的,如微軟的TTS產品。
相對於ASR(Automatic Speech Recognition,自動語音識別)來說,實現壹個TTS產品所需要的技術難度不算大,在我看來也就是個力氣活。
要是讓我們來做壹個能夠把漢語句子朗讀出來的TTS,我們會怎麽做呢?
有壹種最簡單的TTS,就是把每個字都念出來,妳會問,豈不要錄制6千多個漢字的語音?幸運的是,漢語的音節很少,很多同音字。我們最多只是需要錄制: 聲母數×韻母數×4,(其實不是每個讀音都有4聲),這樣算來,最多只需要錄制幾百個語音就可以了。
在合成的時候需要壹張漢字對應拼音的對照表,漢字拼音輸入法也依賴這張表,可以在網上找到,不過通常沒有4聲音調,大不了自己加上,呵呵,要不怎麽說是力氣活呢。
這樣做出來的TTS效果也還可以,特別是朗讀壹些沒有特別含義的如姓名,家庭住址,股票代碼等漢語句子,聽起來足夠清晰。這要歸功於我們偉大的母語通常都是單音節,從古代的時候開始,每個漢字就有壹個詞,表達壹個意思。而且漢字不同於英語,英語裏面很多連讀,音調節奏變化很大,漢字就簡單多了。
當然,妳仍然要處理壹些細節,比如多音字,把“銀行”讀成“yin xing”就不對了;再比如,標點符號的處理,數字、字母的處理,這些問題對於寫過很多程序的妳,當然不難了。
國內的壹些語音板卡帶的TTS,不管是賣錢的還是免費的,大體都是這樣做出來的,也就是這樣的效果。
如果要把TTS的效果弄好壹點,再來點力氣活,把基本的詞錄制成語音,如常見的兩字詞,四字成語等,再做個詞庫和語音庫的對照表,每次需要合成時到詞庫裏面找。這樣以詞為單位,比以字為單位,效果自然是好多了。當然,這裏面還是有個技術,就是分詞的技術,要把復雜的句子斷成合理的詞序列,也有點技術。這也要怪新文化那些先驅們,當初倡導白話文,引進西文的橫排格式、標點符號的時候,沒有引進西文中的空格分詞。不過即使分詞算法那麽不高效,不那麽準確,也問題不大,如前面所說,漢字是單音節詞,把聲音合起來,大體上不會有錯。
當然,科大訊飛的力氣活又幹的多了些,據說已經進化到以常用句子為單位來錄音了,大家可以想像,這要耗費更多的力氣,換來更好的效果。
至於增加壹些銜接處的“詞料”,弄壹些修飾性的音調,我認為是無關緊要的,對整體的效果改進不是太大。
市面上商品化TTS壹般還支持粵語,請個粵語播音員錄音,把上面的力氣活重做壹遍就是了。
再說句題外話,很多人覺得錄音最好找電臺、電視臺的播音員,其實找個妳周圍的女同事來錄制,只要吐字清晰就可以了。在某種情況下,尋常聲音比字正腔圓的新聞聯播來得可愛。
再來說說文本的標識,對於復雜文本,某些內容程序沒有辦法處理,需要標識出來。比如,單純的數字“128”,是應該念成“壹百二十八”還是“壹二八”?解決辦法通常是加入XML標註,如微軟的TTS:<context ID = number_cardinal>128</context>念成“壹百二十八”,<context ID = number_digit>128</context>將念成“壹二八”。TTS引擎可以去解釋這些標註。遺憾的是,語音XML標註並沒有形成大家都完全認可的標準,基本上是各自壹套。
再說說TTS應用編程,微軟的TTS編程接口叫SAPI,是COM接口,開發起來還是有點麻煩,還好MSDN的網站上資料很全面。微軟的TTS雖然免費,但其中文角色目前是個男聲,聲音略嫌混濁,感覺不爽。
國內壹般的廠家提供API調用接口,相對比較簡單,可以方便地嵌入應用程序中去。
商品化的TTS還有個並發許可限制,就是限制同時合成的並發線程數,我覺得這個限制用處不大。無論哪種TTS,都可以將文本文件轉換成語音文件,供語音卡播放。大部分應用句子比較短小,壹般不會超過100個漢字,合成的時間是非常短的,弄個線程專門負責合成,其它應用向該線程請求就是了,萬壹句子很長,把它分解成多個短句子就是了,播放的速度總是比合成的速度慢。
也很多應用是脫機合成,沒有實時性要求,就更不必買多個許可了。
更多情況下,我們甚至沒有必要購買TTS,比如語音開發中常見的費用催繳,撥通後播放:“尊敬的客戶,您本月的費用是:212元”,前面部分對所有客戶都壹樣,錄壹個語音文件就是了,而數字的合成是很簡單的,妳只要錄制好10個數字語音,再加上十,百,千,萬,再加上金錢的單位“元”。