【源创会广州站 内容回顾】中文文本转语音开源引擎EKHO

落爺英雄遲暮 提交于 2019-12-03 03:35:46
下面是今天源创会的主要演讲内容,里面还包含了一些由于时间限制未能分享的内容。

大家好!我是黄冠能。很高兴接受开源中国的邀请,有机会和大家分享一下我过去六年做开源软件的一些经历。我要讲的主题是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有几个编译开关,比如是否支持MP3、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作为桌面操作系统,还有这个不可取代之处。当然,支持藏语是有困难的,第一个困难就是我辛辛苦苦找了一套藏语的教材问他能不能作为了解藏语的入门资料,他说里面一半是错误的,并且他也不能够给我提供好的教材。

最后是问答环节。
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!