下面是今天源創會的主要演講內容,裏面還包含了一些因爲時間限制未能分享的內容。
你們好!我是黃冠能。很高興接受開源中國的邀請,有機會和你們分享一下我過去六年作開源軟件的一些經歷。我要講的主題是Ekho TTS,TTS是text-to-speech的縮寫,就是把文本轉換成語音。
先作一個簡單的自我介紹。我82年廣州出生,10歲的時候開始學電腦,當時使用的是中華學習機,語言是LOGO語言寫的第一行代碼是FD 50,代碼的含義是向前畫50像素的直線。中大畢業之後,在北電和UC工做過,就在旁邊的大樓。北電前兩年已經被愛立信收購。去年末,開始出來跟朋友作些創業的嘗試,目前在家辦公。
在開始介紹Ekho以前,先介紹整個eGuideDog項目。eGuideDog項目創立於2006年,它的使命是編寫給盲人用的自由軟件。除了這個使命意外,還有兩個沒有正式公佈過的使命。一個是促進漢語方言的保育,我相信一種有詞典和真人發聲軟件的方言能夠比單純的口耳相傳要容易流傳,至少不會失傳。另外一個非正式的使命是讓世界開源軟件舞臺上多一箇中國人的名字。
在2011年2月,eGuideDog被評爲SourceForge的Project of the Month。
接下來說一下eGuideDog項目的組成。第一部分是一本開源的粵語發音詞典,首先在Unicode的數據庫中獲得每一個字可能讀音,這是最簡單的一個版本。而後,把多音字找出來,找出出現這些多音字的經常使用詞彙列表,爲其註音,我大概給4-5萬個詞注了音。有了這個基本的多音字數據庫之後,我能夠統計多音字中出現頻率最高的音做爲默認讀音,在生成TTS用的詞典的時候能夠把默認讀音的詞條忽略,以減少詞典大小。去年和一個國外的中文學習網站合做,推出了開源的粵語英語、粵語德語、粵語法語詞典。這些詞典都還在不斷的修訂中。
第二個組成部分是eSpeak-Chinese。eSpeak是一個小巧的但能支持幾十種語言的TTS,我作的主要的工做是讓其支持粵語和普通話。
第三個組成部分就是Ekho TTS了,我稍後會詳細介紹。
第四個組成部分是WebSpeech,它是一個可讓網站使用語音朗讀功能的Javascript庫,稍後也會再介紹。
WebAnywhere,這是一個美國華盛頓大學的研究項目,可讓盲人在普通的電腦上上網,而不須要預先安裝讀屏軟件。它若是應用在公共場所(好比圖書館)的電腦上會頗有用。我做爲一名開發者加入了他們的團隊,設計了多語言支持的框架,把這種技術擴展到英語之外的語言,目前可支持簡、繁體中文、德語和印度語。我稍後會演示一下這種技術。
NVDA是一個在Windows平臺普遍應用的供盲人用的開源讀屏軟件,讀屏軟件顧名思義就是把屏幕內容讀出來,是盲人使用電腦的必要工具。NVDA在eGuideDog得到SourceForge Project of the Month的第二個月得到一樣的獎項。不過坦白說,NVDA的實際影響力至少要10倍於eGuideDog。NVDA做爲一個讀屏軟件後面須要TTS引擎的支持,eGuideDog項目會爲其提供中文TTS的支持。
Vinux是一個基於Ubuntu的專門給盲人用的Linux發行版,本身作一個Linux發行版一直是個人美好願望,因爲精力有限,目前還只是一個美好願望。
eGuideDog Browser是一個用Perl語言編寫的基於文本界面的瀏覽器,是eGuideDog的第一個產品,幾年前已經中止研發。Windchime是一個幫助識別驗證碼的軟件,也中止了研發。
好了,終於把整個eGuideDog的組成理了一遍。下面是WebAnywhere的演示時間,演示過程請你們保持安靜並高度集中精神。當一個盲人坐在一臺沒有裝讀屏軟件的電腦前想上網,第一件事是打開瀏覽器。
1. 首先按<WIN> + R快捷鍵運行程序
2. 輸入chrome打開chrome瀏覽器,Firefox和IE也是支持的。
3. 輸入WebAnywhere中國區服務器網址:wa.eguidedog.net
4. 網頁提示選擇語言。請容許我使用粵語,由於這是個人聲音。
5. 我先按一下CTRL鍵暫停聲音,插入一點說明。這個網站上面是一個地址欄,下面是網頁內容,它就好像一個網頁代理,全部經過該網站代理訪問的網頁都有聲音。
6. 我如今按一下CTRL+L快捷鍵跳到網站地址欄,輸入oschina.net
7. 再按一下CTRL暫停插入說明。當打開一個網站的時候,WebAnywhere會告訴用戶網站有多少標題、多少連接,而後把網頁內容讀出來。
8. 若是這時候我想跳到下一個標題能夠按CTRL+H,再按一下CTRL+H再跳到下一標題。WebAnywhere還有其它快捷鍵能夠幫助快速瀏覽和查找網頁內容,這裏就不一一演示了。
9. 演示完畢,咱們按ALT+F4關閉瀏覽器
這個演示同時也說明了oschina網站的可訪問性(accessibility)不錯,由於WebAnywhere同時也是一個被推薦用於檢測網站可訪問性的工具。
終於到Ekho的部分了,先說一下發展歷史。Ekho是在開發eSpeak中文支持的基礎上開發出來的,它們共用同一套中文詞典。07年的時候eSpeak開始支持粵語,以後再香港的盲人羣體中小範圍的使用。以後再王相成和Silas S. Brown的幫助下支持普通話。王相成同窗當時是清華大學的一名學生。Silas S. Brown中文名賽樂思,是劍橋大學的一位計算機科學家。eSpeak的普通話曾經被Google翻譯使用過一段時間。受eSpeak的原理限制,它說中文就像一個外國人在說中文同樣,質量很難改善,因而我開始研發Ekho TTS。08年3月出了初版本,當時僅支持粵語。後來賽樂思先生幫忙在劍橋找了程亞麗女士製做了普通話。以後又找了一位博士錄製了韓國語,不過因爲韓國語的語言特色,Ekho支持得並不完整,後來也沒有維護和改善。
2009年11月,Ekho 2.0發佈,實現了Windows平臺的標準語音接口SAPI5,供其它應用程序調用。2010年2月,聲網寶(WebAnywhere)上線,背後的語音引擎由Ekho和eSpeak驅動。2010年12月,Ekho 4.0發佈,開始支持Android,這個版本並無實現Android的標準語音接口,也就是說其它應用還不能調用。2011年11月份,來自臺灣的廖偉成先生貢獻了一套詔安客家話的聲音。2012年3月,Ekho在Google Play上發佈,這一版本正式支持Android 2.x的標準語音接口,可供其它應用調用。遺憾的是,我如今尚未時間去實現Android 4.x的API。作這個應用跟作普通的Android應用不一樣,它調用的不是Java API,也不是NDK的API,相關的API並無正式公佈,須要經過閱讀編譯Android的源代碼來實現,把編出來的so文件打包到apk中去。對於Android 4.x,我還要爲兼容Android 2.x額外作些工做。
今年3月份,Ekho還發布了一個漢語-西班牙語特別版。這裏有一段故事,一位來自南美智利的盲人,他說西班牙語,正在學中文,他須要一個支持西班牙語和中文的TTS。他以前用的是支持英文和中文的TTS,結果就是,軟件會把西班牙語文字以英語的發音發出來。因而,他找到我,問我可不能夠幫他作一個支持西班牙語和中文的TTS。由於Ekho的英語部分是經過調用Festival實現的,Festival自己也是一個支持多國語言的開源TTS引擎,因而,我就英語的聲音換成了西班牙語。次日就把這個特別版發給了他。我想這多是惟一一個支持西班牙語和中文的TTS,他也多是這個特別版的惟一用戶。這種故事估計也只能在開源的世界裏面發生。
今年5月份,Ekho 4.12發佈,開始支持Linux的標準語音接口speech-dispatcher,也就是說Ekho能夠更方便被Linux系統的語音輔助功能調用。
說完了Ekho的歷史,下面作個demo,這個demo是基於Web的:http://www.eguidedog.net/ekho_cn.php
下面開始簡單介紹一下Ekho的技術。首先咱們要安裝這個軟件,Windows平臺是exe文件安裝,沒有什麼好說明的。Linux則比較困難一些,有一堆軟件依賴,你們configure的時候要看清楚提示,缺什麼就裝什麼。我偶爾會發布deb和rpm包來下降安裝難度,但這個一般是看我我的心情。若是須要支持英語的朗讀,那麼須要把Festival選項打開,必要時須要替換相關靜態庫。什麼是必要時呢?就是使用Ekho自帶的靜態庫編譯出錯的時候。爲何不使用源代碼呢?由於編譯Festival用到的源代碼很龐大,編譯時間也很長,須要解決的編譯問題更多。你們應該直接找適用於所在平臺的靜態庫。Ekho有幾個編譯開關,好比是否支持MP三、OGG等,能夠經過命令configure -h來查看。
調用Ekho的代碼是簡單的,構造一個對象,而後speak一段文本就能夠了,例子中用了blockSpeak,含義是折行代碼要等聲音說完才返回。若是直接用speak,這個程序會在話還沒說完的時候就退出了。
編譯這段程序須要連接不少庫,你們能夠參考這一頁最下面的文檔。
接下來說一下Ekho的架構。Ekho的上層是實現各類調用的接口,下層是各類音頻相關的庫。Dict就是詞典,utfcpp是一個UTF8編解碼的庫,Festival是用來間接朗讀英語的第三方開源庫,sr-convert是一個轉換音頻採樣率的庫,SoundTouch和Sonic是改變音頻播放速度和音高的庫,Sndfile是音頻文件編解碼的庫,GSM是一種針對人聲的音頻壓縮編碼,Lame是MP3的編解碼庫,Vorbis是OGG的編解碼庫,Pulseaudio是Linux下的音頻服務程序。
到了最關鍵又多是最使人失望的一部分了,Ekho的原理。原理很簡單,把漢字轉換成拼音,每一個拼對應一個音頻文件,把音頻文件拼接起來就能夠了。音頻拼接過程沒有使用任何特別的技術來增長流暢度或韻律感。很坦白地說,Ekho是一個不怎麼專業的TTS,它缺少比較先進的理論支持。我曾經嘗試看一些論文,但水平有限,沒有想到可以把相關理論快速實現的方法。在Ekho最初的版本中,我使用了一些基於統計的方式來改變聲音效果的算法,可是後來發現搞來搞去還不如在錄音的時候認認真真錄好。原始的方法不見得就很糟糕。
下面講一下怎樣錄製一套新的聲音。
首先,找一個質量過得去的麥克風,一個安靜的房間
獲取拼音列表:a1, a2, a3, a4, a5, ai1, ai2, ai3, ai4, ai5 …(拼音列表能夠在參考的連接中找到)
使用Audacity軟件錄製(Audacity是一個開源的音頻錄製軟件)。按正常語速讀每個音,中間可插入一些額外的字(如「的」)以加強連貫性。可能沒有人能夠一次高質量的把全部拼音錄完,也許不到一半就聲音就有點嘶啞或者舌頭打結了。在分次錄音的時候要注意把全部條件都儘可能恢復到上一次的錄音的狀態,包括麥克風音量、語音語調。
使用Audacity剪切提取每個拼音的音頻,文件名依次爲:a1.wav, a2.wav … (善用Audacity的快捷鍵,可編寫腳本幫助修改文件名)我當時的作法是寫一個守護進程,把固定路徑的文件按拼音列表順序更名。我每次剪切出來的音頻都保存到同一個文件,這個文件立刻就會被自動更名了。
剪切完之後把音頻文件替換Ekho軟件中的相應文件就能夠用了。
熟練的狀況下,錄音大概須要5個小時,剪切的時間大概須要30個小時。
若是想添加新的方言該怎麼作呢?首先是肯定音標系統,而後找詞典,找詞典的時候須要謹慎的處理版權問題。而後就是爲每個拼音錄製音頻文件,就像以前介紹的製做新的聲音同樣。最後把全部資料都發給我,以GPL v2+的許可發佈。增長新的方言和增長新的聲音不一樣,是須要我修改代碼的,我不會爲版權私有的方言作無償的支持。但若是僅僅是添加新的聲音,這是不須要修改代碼的,你們能夠把新的聲音以私有許可證發佈。
講完了Ekho,最後講一下WebSpeech。作網頁的朋友要留意了,這是一個JS庫,可讓你寫的網頁發聲,而且這個網頁用Android設備的瀏覽器訪問也能發聲(理論上iOS 4以上的設備也支持,但我沒有測試過)。能夠認爲這是一種雲的語言服務,後面的語言服務器能夠本身搭建,也能夠用eGuideDog的免費服務。用WebSpeech能夠編寫不少有趣的網頁,一些小遊戲、在線的發聲詞典、網頁導讀的功能。有人用它來編寫基於Web的機器人網站,有點相似於Siri的東西。
下面演示一下一個我本身比較喜歡的應用例子——粵語詞典。在Google或者Bing上搜索Cantonese Dictionary,前幾條結果能夠找到我編寫的粵語詞典網頁。打開之後在表單中輸入漢字,點擊「Show Phonetic Symbols」能夠看到音標,點擊「Speak」能夠聽到發音。我喜歡用它的緣由主要是它能在個人Andriod手機的瀏覽器上正常的使用,讓我能夠隨時查一些不會讀的字。
另一個我想演示的功能是頁面導讀的功能。只須要在頁面上添加幾行代碼就可使用這個導讀功能。
這裏是一個使用的例子,只須要include一個JS文件就可使用。
在將來的一段日子,Ekho會作下面的改進,一個是支持Android 4.x,一個是爲Windows版提供命令行接口,一個是支持藏語。關於藏語,這個有個小故事。某天,我收到一封郵件,問我Ekho可不能夠跟Linux的讀屏軟件一塊兒用,我說還不行(當時4.12還沒出來)。我問他爲何不先讓用戶在Windows上使用呢?(我我的認爲教會盲人使用Linux是一件普通人比較難理解的事情,儘管很合理,比使用Windows更合理)他說,在Ubuntu 11.10以前,還有一個操做系統可以完整地支持藏語。我當時感觸比較深,Linux做爲桌面操做系統,還有這個不可取代之處。固然,支持藏語是有困難的,第一個困難就是我辛辛苦苦找了一套藏語的教材問他能不能做爲了解藏語的入門資料,他說裏面一半是錯誤的,而且他也不可以給我提供好的教材。
最後是問答環節。