eSpeak开发指南
(Cameron,2007年9月10日)
目录
Window操作系统下:
一步步来
安装eSpeak
安装espeakedit
espeakedit用法1
修改并编译praat
espeakedit用法2
把新元音加入词典
Linux操作系统下:
安装eSpeak
安装espeakedit
添加/改善粤语支持
espeakedit用法1
修改并安装praat
espeakedit用法2
把新元音加入词典
添加词的读音
粤语相关文件说明:
参考资料
Windows操作系统下
一步步来
我只简单大概讲讲,每一步都需要探索怎样实现,有哪一步不懂可直接邮件问我。
- 到http://espeak.sourceforge.net/test/latest.html下载最新的espeak和espeakedit,在本网站的下载区下载粤语版eSpeak和带espeakedit插件的praat
- 大概了解各软件包的文件结构,查看粤语相关的文件
- 试录制一个wav格式的元音,用praat读入,导出成espeakedit格式
- 用espeakedit打开上面导出的文件,根据波形添加参数。参数不容易调,可打开现有的类似的元音进行模仿。espeakedit的用法可参阅eSpeak的官方文档。没有语言音韵学的基础,可能不太明白参数的意思(我也不太明白……),需要参考Wikipedia的。
- 调好以后保存,修改该元音的相关文件,编译,听效果。
- 粤语词典zhy_list中有很多错漏,修改它可以更正字词的读音
安装eSpeak
- 下载最新的测试版espeak,下载网址http://espeak.sourceforge.net/test/latest.html
- 程序默认安装在\Program Files\eSpeak,运行文件为TTSApp.exe
安装espeakedit
- 下载最新的测试版espeak,下载网址http://espeak.sourceforge.net/test/latest.html
- 程序默认安装在\Program Files\eSpeak,运行文件为espeakedit.exe
espeakedit用法1
- 运行espeakedit.exe
- File->Open->phsource/vwl_zh/ong
- 此时会看到[ong]这个音的波形,此波形分成很多frame,每个frame刻画了当前时间的声音波形。波形是可以调整的,
[ong]的音就是通过phsource/vowel/oo的波形调整而成。
- 按F1可以听到当前frame的声音。
- 按F2可以听到所有frame合起来的效果。
- 打开phsource下其它文件,可以看到各种元音辅音波形的特点。
修改并编译praat
- 可以直接下载我制作好的安装包praat_4519_espeakedit.exe,如果不想知道制作的细节,无需阅读接下来的12条:)
- 下载并安装MinGW、MSYS(这是Windows下编译Unix程序的环境),下载网址:http://sourceforge.net/project/showfiles.php?group_id=10894&package_id=41063
- 把msys_mingw8.zip文件解压(假设解压在c:\msys\)
- 修改c:\msys\mingw\include\shlobj.h,使用搜索功能寻找SHGetSetSettings的定义处。把头尾条件语句注释掉,如下:
/*#if (_WIN32_WINNT >= 0x0500) /* W2K */
void WINAPI SHGetSetSettings(LPSHELLSTATE,DWORD,BOOL);
/*#endif*/
同理,寻找SHELLSTATE的定义处,把头尾条件语句注释掉。我不明白为什么这样做,但在我的系统上如果不这样做,编译过程就会因找不到这两处定义而无法继续。由于不同系统环境不同,所以以上操作并不是必需,也不一定正确。
- 从www.praat.org下载最新版的源代码,把源代码解压在c:\msys\,此时会出现类似sources4519的目录
- 到espeak测试版下载主页(http://espeak.sourceforge.net/test/latest.html)下载espeakedit的源代码。注意:这次不是下载Windows版的,是下载源代码版的。
- 在espeakedit软件包的praat-mod目录下有两个文件,一个是Sound_JSD.c,它是praat支持 espeak的补丁;另一个是Praat_notes,它是如何添加这个补丁的说明。
- 用写字板打开Praat_notes,参考Praat_notes的说明复制Sound_JSD.c到praat目录下的fon下并修改 praat_Sound_init.c
- 运行msys.bat,会出现一个类似Linux命令行的界面
- $cd sources4519
- $cp makefiles/makefile.defs.mingw ./makefile.defs
- $make
- 如果成功编译,会看到praat.exe。如果不成功,请到论坛http://sourceforge.net/forum/forum.php?forum_id=643788提问或直接发邮件与本文作者联系,请附上编译出错信息。
espeakedit用法2
下面介绍如何结合praat添加一个新元音
- 运行praat
- Read->Read from file...->选择一个wav文件(如ong.wav)
- 按Play可以听到该文件的声音
- Spectrum->To eSpeak ...->OK
- 在wav文件的目录下你会看到生成了一个新的文件spectrum.dat,这就是能为eSpeak识别的声音数据文件
- 打开espeakedit,open数据文件spectrum.dat,你会看到很多波形frame,但是你无法通过F1或F2
读出它们,因为还没标记。
- 单击随便一frame,你会看到被选中的frame有个红色的框框
- 按0键编辑第0个Formant,按几下上方向键
- 按1键编辑第1个Formant,按几下上方向键
- 按2键编辑第1个Formant,按几下上方向键
- 按F1,此时听到你编辑的Formant合成的声音。Formant根据波形手工生成,但不是完全一样,因为波形文件中有杂音,
Formant是要抓住关键的发音,怎么搞这些Formant需要很多经验,我非常欠缺。
把新元音加入词典
以修改[ong]音为例,说明添加新元音的过程:
- 录制[ong]音(wav文件)
- 用praat把wav转换成espeakedit格式数据
- 用espeakedit编辑[ong]的Formant数据另存为ong2
- 把ong文件复制到phsource/vwl_zh/
- 编辑phsource/ph_zh_yue
- 找到phoneme ong那5行,其中有一行formants vwl_zh/ong,这个就是说明[ong]音对应的声音文件。把ong改成ong2
- 重新编译词典(在espeakedit的Data菜单下)
仿照以上方法和格式,可以添加新的元音或辅音。
Linux操作系统下
安装eSpeak
- 下载最新的测试版espeak,下载网址http://espeak.sourceforge.net/test/latest.html
- 解压软件包:
$unzip package-name
- 由于软件没有安装文件,需要自己手动建立符号链接:
$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解压后所在路径
- 运行:
$speak "hello world"
$speak -vzhy "什么"
安装espeakedit
- 安装sox(a universal sound sample translator),Ubuntu
Linux下可使用以下命令:
$sudo apt-get install sox
- 安装libwxgtk2.6-0 (wxWidgets Cross-platform C++ GUI toolkit)。
- 安装portaudio0(Portaudio V18, portable audio I/O)
- 安装praat(to view and analyze WAV sound
files),该软件的网址是www.praat.org,它是分析语音文件的一个关键软件。我不懂得怎么用,但我相信它非常有用。这个软件暂时可不装,
其安装有点复杂,后面会在介绍。
- 下载解压espeakedit(类似eSpeak)
- 把espeakedit默认的数据位置连接到 espeak的espeak-data:
$ln -s /<path_to_espeak>/espeak-data ~/
- 建立符号链接方便运行(可省略):
$sudo ln -s /<path_to_espeakedit>/espeakedit /usr/bin/
- 把phsource加入espeak-data目录中:
$ln -s /<path_to_espeakedit>/phsource
/<path_to_espeak>/espeak-data/
提示:phsource下的ph_zh_yue文件和vwl_zh目录是和粤语相关的。
- 运行:
$espeakedit
- 更详细的说明可参考后面的部分及官方文档http://espeak.sourceforge.net/editor.html
添加/改善粤语支持
- 测试版中已有基本粤语支持,如果需要改善支持(例如支持更多的繁体字)则需要修改一些文件。
- 运行:
speak -vzhy "为什么"
你会听到"为"的发声是不正常的,这是一个遇到不会读的字时的通用发声。
- 把zhy_list和zhy_rules文
件复制到espeak目录下的dictsource目录下,覆盖原有文件。
提示:这两个文件是粤语相关的文件。
- 把dictsource添加到espeak-data下:
$ln -s ../dictsource /<path_to_espeak>/espeak-data/
- 重新编译发声词典
espeakedit --compile
- 再次运行:
speak -vzhy "为什么"
espeakedit用法1
- 运行:
$espeakedit
- File->Open->(your home
directory)/espeak-data/phsource/vwl_zh/ong
- 此时会看到[ong]这个音的波形,此波形分成很多frame,每个frame刻画了当前时间的声音波形。波形是可以调整的,
[ong]的音就是通过phsource/vowel/oo的波形调整而成。
- 按F1可以听到当前frame的声音。
- 按F2可以听到所有frame合起来的效果。
- 打开phsource下其它文件,可以看到各种元音辅音波形的特点。
修改并安装praat
- 从www.praat.org下载最新版的源代码。
- 在espeakedit软件包的praat-mod目录下有两个文件,一个是Sound_JSD.c,它是praat支持
espeak的补丁;另一个是Praat_notes,它是如何添加这个补丁的说明。
- 按照Praat_notes的说明复制Sound_JSD.c到praat目录下的fon下并修改
praat_Sound_init.c
- 在fon/Makefile加入Sound_JSD.o即可(那里有一大堆.o文件列表,随便找个位置添加这个文件即可)
- $cp
/<path_to_praat>/makefiles/makefile.defs.linux.dynamic
/<path_to_praat>/makefile.defs
- 在praat目录下运行
$make
说明:你可能需要安装libxmu-dev软件包
- 运行praat
$./praat
espeakedit用法2
下面介绍如何结合praat添加一个新元音
- 运行praat
- Read->Read from file...->选择一个wav文件(如ong.wav)
- 按Play可以听到该文件的声音
- Spectrum->To eSpeak ...->OK
- 在praat的目录下你会看到生成了一个新的文件spectrum.dat,这就是能为eSpeak识别的声音数据文件
- 打开espeakedit,open数据文件spectrum.dat,你会看到很多波形frame,但是你无法通过F1或F2
读出它们,因为还没标记。
- 单击随便一frame,你会看到被选中的frame有个红色的框框
- 按0键编辑第0个Formant,按几下上方向键
- 按1键编辑第1个Formant,按几下上方向键
- 按2键编辑第1个Formant,按几下上方向键
- 按F1,此时听到你编辑的Formant合成的声音。Formant根据波形手工生成,但不是完全一样,因为波形文件中有杂音,
Formant是要抓住关键的发音,怎么搞这些Formant需要很多经验,我非常欠缺。
把新元音加入词典
以修改[ong]音为例,说明添加新元音的过程:
- 录制[ong]音(wav文件)
- 用praat把wav转换成espeakedit格式数据
- 用espeakedit编辑[ong]的Formant数据另存为ong2
- 把ong文件复制到~/espeak-data/phsource/vwl_zh/
- 编辑~/espeak-data/phsource/ph_zh_yue
- 找到phoneme ong那5行,其中有一行formants vwl_zh/ong,这个就是说明[ong]音对应的声音文件。把ong改成ong2
- 重新编译词典
$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的粤语发音不像外国人说出的感觉,需要对这些音韵(包括声母、韵母)进行细心调试。
参考资料
- http://espeak.sourceforge.net/docindex.html 这个是官方的参
考文档,有各种更详细的资料,基本上足够了,应认真阅读,如果确认某些问题没有提及可到论坛问作者。
- http://e-guidedog.sourceforge.net/wiki/index.php?title=Cantonese 粤语语言学相关资料搜集区(欢迎为完善这个wiki),建立一套TTS,语言学的知识很重要,建议多在Wikipedia找资料。
|
|