eGuideDog
free software for the blind

eSpeak开发指南

(Cameron,2007年9月10日)

目录

Window操作系统下:
  一步步来
  安装eSpeak
  安装espeakedit
  espeakedit用法1
  修改并编译praat
  espeakedit用法2
  把新元音加入词典

Linux操作系统下:
  安装eSpeak
  安装espeakedit
  添加/改善粤语支持
  espeakedit用法1
  修改并安装praat
  espeakedit用法2
  把新元音加入词典
  添加词的读音

粤语相关文件说明:

参考资料

Windows操作系统下

一步步来

我只简单大概讲讲,每一步都需要探索怎样实现,有哪一步不懂可直接邮件问我。
  1. http://espeak.sourceforge.net/test/latest.html下载最新的espeak和espeakedit,在本网站的下载区下载粤语版eSpeak和带espeakedit插件的praat
  2. 大概了解各软件包的文件结构,查看粤语相关的文件
  3. 试录制一个wav格式的元音,用praat读入,导出成espeakedit格式
  4. 用espeakedit打开上面导出的文件,根据波形添加参数。参数不容易调,可打开现有的类似的元音进行模仿。espeakedit的用法可参阅eSpeak的官方文档。没有语言音韵学的基础,可能不太明白参数的意思(我也不太明白……),需要参考Wikipedia的。
  5. 调好以后保存,修改该元音的相关文件,编译,听效果。
  6. 粤语词典zhy_list中有很多错漏,修改它可以更正字词的读音

安装eSpeak

  1. 下载最新的测试版espeak,下载网址http://espeak.sourceforge.net/test/latest.html
  2. 程序默认安装在\Program Files\eSpeak,运行文件为TTSApp.exe

安装espeakedit

  1. 下载最新的测试版espeak,下载网址http://espeak.sourceforge.net/test/latest.html
  2. 程序默认安装在\Program Files\eSpeak,运行文件为espeakedit.exe

espeakedit用法1

  1. 运行espeakedit.exe
  2. File->Open->phsource/vwl_zh/ong
  3. 此时会看到[ong]这个音的波形,此波形分成很多frame,每个frame刻画了当前时间的声音波形。波形是可以调整的, [ong]的音就是通过phsource/vowel/oo的波形调整而成。
  4. 按F1可以听到当前frame的声音。
  5. 按F2可以听到所有frame合起来的效果。
  6. 打开phsource下其它文件,可以看到各种元音辅音波形的特点。

修改并编译praat

  1. 可以直接下载我制作好的安装包praat_4519_espeakedit.exe,如果不想知道制作的细节,无需阅读接下来的12条:)
  2. 下载并安装MinGW、MSYS(这是Windows下编译Unix程序的环境),下载网址:http://sourceforge.net/project/showfiles.php?group_id=10894&package_id=41063
  3. 把msys_mingw8.zip文件解压(假设解压在c:\msys\)
  4. 修改c:\msys\mingw\include\shlobj.h,使用搜索功能寻找SHGetSetSettings的定义处。把头尾条件语句注释掉,如下:
    /*#if (_WIN32_WINNT >= 0x0500) /* W2K */
    void WINAPI SHGetSetSettings(LPSHELLSTATE,DWORD,BOOL);
    /*#endif*/
    同理,寻找SHELLSTATE的定义处,把头尾条件语句注释掉。我不明白为什么这样做,但在我的系统上如果不这样做,编译过程就会因找不到这两处定义而无法继续。由于不同系统环境不同,所以以上操作并不是必需,也不一定正确。
  5. 从www.praat.org下载最新版的源代码,把源代码解压在c:\msys\,此时会出现类似sources4519的目录
  6. 到espeak测试版下载主页(http://espeak.sourceforge.net/test/latest.html)下载espeakedit的源代码。注意:这次不是下载Windows版的,是下载源代码版的。
  7. 在espeakedit软件包的praat-mod目录下有两个文件,一个是Sound_JSD.c,它是praat支持 espeak的补丁;另一个是Praat_notes,它是如何添加这个补丁的说明。
  8. 用写字板打开Praat_notes,参考Praat_notes的说明复制Sound_JSD.c到praat目录下的fon下并修改 praat_Sound_init.c
  9. 运行msys.bat,会出现一个类似Linux命令行的界面
  10. $cd sources4519
  11. $cp makefiles/makefile.defs.mingw ./makefile.defs
  12. $make
  13. 如果成功编译,会看到praat.exe。如果不成功,请到论坛http://sourceforge.net/forum/forum.php?forum_id=643788提问或直接发邮件与本文作者联系,请附上编译出错信息。

espeakedit用法2

下面介绍如何结合praat添加一个新元音
  1. 运行praat
  2. Read->Read from file...->选择一个wav文件(如ong.wav)
  3. 按Play可以听到该文件的声音
  4. Spectrum->To eSpeak ...->OK
  5. 在wav文件的目录下你会看到生成了一个新的文件spectrum.dat,这就是能为eSpeak识别的声音数据文件
  6. 打开espeakedit,open数据文件spectrum.dat,你会看到很多波形frame,但是你无法通过F1或F2 读出它们,因为还没标记。
  7. 单击随便一frame,你会看到被选中的frame有个红色的框框
  8. 按0键编辑第0个Formant,按几下上方向键
  9. 按1键编辑第1个Formant,按几下上方向键
  10. 按2键编辑第1个Formant,按几下上方向键
  11. 按F1,此时听到你编辑的Formant合成的声音。Formant根据波形手工生成,但不是完全一样,因为波形文件中有杂音, Formant是要抓住关键的发音,怎么搞这些Formant需要很多经验,我非常欠缺。

把新元音加入词典

以修改[ong]音为例,说明添加新元音的过程:
  1. 录制[ong]音(wav文件)
  2. 用praat把wav转换成espeakedit格式数据
  3. 用espeakedit编辑[ong]的Formant数据另存为ong2
  4. 把ong文件复制到phsource/vwl_zh/
  5. 编辑phsource/ph_zh_yue
  6. 找到phoneme ong那5行,其中有一行formants vwl_zh/ong,这个就是说明[ong]音对应的声音文件。把ong改成ong2
  7. 重新编译词典(在espeakedit的Data菜单下)
仿照以上方法和格式,可以添加新的元音或辅音。

Linux操作系统下

安装eSpeak

  1. 下载最新的测试版espeak,下载网址http://espeak.sourceforge.net/test/latest.html
  2. 解压软件包:
    $unzip package-name
  3. 由于软件没有安装文件,需要自己手动建立符号链接:
    $sudo ln -s /<path_to_espeak>/espeak-data /usr/share/espeak-data
    $sudo ln -s /<path_to_espeak>/speak /usr/bin/espeak
    说明:<path_to_espeak>是指espeak解压后所在路径
  4. 运行:
    $speak "hello world"
    $speak -vzhy "什么"

安装espeakedit

  1. 安装sox(a universal sound sample translator),Ubuntu Linux下可使用以下命令:
    $sudo apt-get install sox
  2. 安装libwxgtk2.6-0 (wxWidgets Cross-platform C++ GUI toolkit)。
  3. 安装portaudio0(Portaudio V18, portable audio I/O)
  4. 安装praat(to view and analyze WAV sound files),该软件的网址是www.praat.org,它是分析语音文件的一个关键软件。我不懂得怎么用,但我相信它非常有用。这个软件暂时可不装, 其安装有点复杂,后面会在介绍。
  5. 下载解压espeakedit(类似eSpeak)
  6. 把espeakedit默认的数据位置连接到 espeak的espeak-data:
    $ln -s /<path_to_espeak>/espeak-data ~/
  7. 建立符号链接方便运行(可省略):
    $sudo ln -s /<path_to_espeakedit>/espeakedit /usr/bin/
  8. 把phsource加入espeak-data目录中:
    $ln -s /<path_to_espeakedit>/phsource /<path_to_espeak>/espeak-data/
    提示:phsource下的ph_zh_yue文件和vwl_zh目录是和粤语相关的。
  9. 运行:
    $espeakedit
  10. 更详细的说明可参考后面的部分及官方文档http://espeak.sourceforge.net/editor.html

添加/改善粤语支持

  1. 测试版中已有基本粤语支持,如果需要改善支持(例如支持更多的繁体字)则需要修改一些文件。
  2. 运行:
    speak -vzhy "为什么"
    你会听到"为"的发声是不正常的,这是一个遇到不会读的字时的通用发声。
  3. zhy_listzhy_rules文 件复制到espeak目录下的dictsource目录下,覆盖原有文件。
    提示:这两个文件是粤语相关的文件。
  4. 把dictsource添加到espeak-data下:
    $ln -s ../dictsource /<path_to_espeak>/espeak-data/
  5. 重新编译发声词典
    espeakedit --compile
  6. 再次运行:
    speak -vzhy "为什么"

espeakedit用法1

  1. 运行:
    $espeakedit
  2. File->Open->(your home directory)/espeak-data/phsource/vwl_zh/ong
  3. 此时会看到[ong]这个音的波形,此波形分成很多frame,每个frame刻画了当前时间的声音波形。波形是可以调整的, [ong]的音就是通过phsource/vowel/oo的波形调整而成。
  4. 按F1可以听到当前frame的声音。
  5. 按F2可以听到所有frame合起来的效果。
  6. 打开phsource下其它文件,可以看到各种元音辅音波形的特点。

修改并安装praat

  1. 从www.praat.org下载最新版的源代码。
  2. 在espeakedit软件包的praat-mod目录下有两个文件,一个是Sound_JSD.c,它是praat支持 espeak的补丁;另一个是Praat_notes,它是如何添加这个补丁的说明。
  3. 按照Praat_notes的说明复制Sound_JSD.c到praat目录下的fon下并修改 praat_Sound_init.c
  4. 在fon/Makefile加入Sound_JSD.o即可(那里有一大堆.o文件列表,随便找个位置添加这个文件即可)
  5. $cp /<path_to_praat>/makefiles/makefile.defs.linux.dynamic /<path_to_praat>/makefile.defs
  6. 在praat目录下运行
    $make
    说明:你可能需要安装libxmu-dev软件包
  7. 运行praat
    $./praat

espeakedit用法2

下面介绍如何结合praat添加一个新元音
  1. 运行praat
  2. Read->Read from file...->选择一个wav文件(如ong.wav)
  3. 按Play可以听到该文件的声音
  4. Spectrum->To eSpeak ...->OK
  5. 在praat的目录下你会看到生成了一个新的文件spectrum.dat,这就是能为eSpeak识别的声音数据文件
  6. 打开espeakedit,open数据文件spectrum.dat,你会看到很多波形frame,但是你无法通过F1或F2 读出它们,因为还没标记。
  7. 单击随便一frame,你会看到被选中的frame有个红色的框框
  8. 按0键编辑第0个Formant,按几下上方向键
  9. 按1键编辑第1个Formant,按几下上方向键
  10. 按2键编辑第1个Formant,按几下上方向键
  11. 按F1,此时听到你编辑的Formant合成的声音。Formant根据波形手工生成,但不是完全一样,因为波形文件中有杂音, Formant是要抓住关键的发音,怎么搞这些Formant需要很多经验,我非常欠缺。

把新元音加入词典

以修改[ong]音为例,说明添加新元音的过程:
  1. 录制[ong]音(wav文件)
  2. 用praat把wav转换成espeakedit格式数据
  3. 用espeakedit编辑[ong]的Formant数据另存为ong2
  4. 把ong文件复制到~/espeak-data/phsource/vwl_zh/
  5. 编辑~/espeak-data/phsource/ph_zh_yue
  6. 找到phoneme ong那5行,其中有一行formants vwl_zh/ong,这个就是说明[ong]音对应的声音文件。把ong改成ong2
  7. 重新编译词典
    $espeakedit --compile
仿照以上方法和格式,可以添加新的元音或辅音。

添加词的读音

粤语词典在dictsource/zhy_list,它的规则很明显:字(空格若干)粤拼注音。如:
广 gwong2
由于很多字的多音用法必须与词配合在一起,所以有必要为词注音,格式如下:
(广 东) gwong2d'ung1
说明:广东之间有一空格,符号" ' "表示重读(我还没搞清楚粤语中的重读规则),词读音的定义必须紧跟第一个字的定义,即“广东”的定义必须出现在“广”的下一行。

粤语相关文件说明

下载最新版的eSpeak-Cantonese,不过这个是面向普通用户的,不包含所有开发所需的文件。不过这里的粤语词典(zhy_list)会比eSpeak的官方网站要新一些。下面提到的文件在Windows版中未必能找到,必要时需要在Linux下的eSpeak源代码中找。
  • espeak/install - 这个文件在eSpeak官方发行版中没有,是我为了方便用户安装而添加到Linux版的eSpeak-Cantonese中的,直接运行该文件就能完成软件的安装。
  • espeak/Readme.Cantonese - 关于eSpeak-Cantonese的一些说明。
  • espeak/dictsource/zhy_list - 粤语词典,格式很简单,相信看一下就明白。
  • espeak/dictsource/zhy_rules - 粤语词典的一些规则,里面的参数都是Jonathan帮我弄的,我没有动过。
  • espeak/espeak-data/zhy_dict - 通过在dictsource目录下运行`espeak --compile=zhy`生成,是经编译过的二进制格式的词典。
  • espeak/espeak-data/voices/zhy - 粤语的配置文件,比如定义全称是Cantonese,当遇到英文时按照英文的规则来读等。
  • espeak/espeak-data/voices/!v/* - 一些声音变化定义文件,比如说,在选择语言是设定为“zhy+f2“就会听到粤语女声。
  • espeakedit/phsource/ph_zh_yue - 粤语音韵定义文件,里面包含了粤语特有的音韵定义,这个文件是修改的重点之一。
  • espeakedit/phsource/phonemes - 通用的音韵定义文件,可作参考,如有不同于粤语音韵特点的可在ph_zh_yue中重新定义。
  • espeakedit/phsource/zh_vwl/* - 声音文件,目前根据英文音韵无法合成的音节定义了"aang ang eng ing ng oeng ong ung",这些是通过praat软件提取音节的波形,再通过espeakedit把波形简化成较简单而有代表性的Formant参数。研究表明,3个Formant可以基本表达出一种发音的特征。相关知识可查阅Wikipedia,本网站中的Cantonese Linguistics中有相关连接。这些文件是修改的另一个重点。要想eSpeak的粤语发音不像外国人说出的感觉,需要对这些音韵(包括声母、韵母)进行细心调试。

参考资料

  1. http://espeak.sourceforge.net/docindex.html 这个是官方的参 考文档,有各种更详细的资料,基本上足够了,应认真阅读,如果确认某些问题没有提及可到论坛问作者。
  2. http://e-guidedog.sourceforge.net/wiki/index.php?title=Cantonese 粤语语言学相关资料搜集区(欢迎为完善这个wiki),建立一套TTS,语言学的知识很重要,建议多在Wikipedia找资料。