由于本人需要对录入文本进行校验,所以决定使用TTS语音合成系统(看自己写的东西很难发现错误)。首先尝试在Linux系统下自带的festival和espeak,但使用后总觉得效果不理想。作为Linux用户还是喜欢用Linux原生程序,所以第二步尝试非系统自带,但对中文特别对待的ekho(余音),然而效果依然令人乍舌,在使用了半天后便决定更换为确实可用的文本朗读系统。这便不得不使用Wine来模拟运行Windows程序,经过一番不懈的努力,终于成功在Linux平台上实现了高质量的文本朗读效果。现在将安装方法记录下来,方便自己也方便大家。
此次进行安装的Linux系统为Ubuntu 16.04 Mate版本(其它发行版应该也没有问题)。因为需要和别人交换文档,所以不得不使用Word 2010(正版),因此系统里早已安装好了Wine,版本为1.8。
Wine的安装:
如果你还没有安装Wine,可通过
sudo apt-get install wine sudo apt-get install winetricks
进行安装。
英文语音引擎所需软件下载:
安装微软TTS引擎分为两部分,一部分为平台接口,一部分为语音包,注意下载时全部选择32位版本。
下载微软TTS语音平台SpeechPlatformRuntime:
下载地址为:https://www.microsoft.com/en-us/download/details.aspx?id=27225
本地下载:SpeechPlatformRuntime.msi
微软TTS语音包下载(有多种语言可供选择,下载你需要的,如英语ZiraPro和中文Huihui。)
首先安装英文语音包(MSSpeech_TTS_en-US_ZiraPro.msi),中文语音包(MSSpeech_TTS_zh-CN_HuiHui.msi)在按英文语音包的安装方法安装后并不能正常工作,需要额外的修复步骤。
下载语音包:
https://www.microsoft.com/en-us/download/details.aspx?id=27224
本地下载:
MSSpeech_TTS_en-US_ZiraPro.msi
MSSpeech_TTS_zh-CN_HuiHui.msi
下载语音播放软件:
当然下载了引擎后我们还需要语音播放软件balabolka:
本地直接下载地址:balcon
直接下载地址为命令行版本,文件名为balcon.exe,本软件体积很小,不对Windows其它组件产生依赖。我没有对GUI版本测试。
以下的步骤必须在同一个终端窗口中进行,否则会出错。
Wine的设定:
接下来我们需要对Wine进行设定,因为balcon和TTS平台使用32位系统(64位系统我未测试),所以设定模拟构架为32位Windows,并指明Wine虚拟Windows的工作目录。
$export WINEARCH=win32 $export WINEPREFIX=~/.wine32tts
因对wine运行环境变量进行了设定,所以后续操作均需在该环境中,请勿更换命令操作窗口。
TTS引擎的安装文件为msi格式,所以需要msxml3以让wine正确处理msi文件。通过winetricks来安装msxml3。
$winetricks msxml3
安装TTS语音平台和英文语音包:
$wine msiexec /i SpeechPlatformRuntime.msi $wine msiexec /i MSSpeech_TTS_en-US_ZiraPro.msi
安装过程中会看到有错误提示,不必理会。此时的英文TTS引擎应该已经可以正常工作了。为测试TTS是否工作正常,我们可建立一个englishText.txt的文本文件,里面随意写入一些英文句子。然后通过以下命令进行测试:
$wine balcon.exe -n en-US -f englishText.txt
此时应该已可以听见高质量的英文语音合成。参数-n指明balcon.exe所需调用的声音,-f指明需要进行语音合成的文本文件名。关于balcon.exe的其它参数,可直接wine balcon.exe查看说明。
以上信息感谢来自reddit的dazoe。
中文语音引擎的安装
接下来是关键的中文语音。通过以下命名安装微软Huihui中文语音包。
$wine msiexec /i MSSpeech_TTS_zh-CN_HuiHui.msi
准备一段包含中文文本的txt文件进行测试
$wine balcon.exe -n zh-CN -f chineseText.txt
结果却提示Error: OLE error 80004005错误,无声音输出。中文在计算机世界里总是多一层麻烦。
这是因为缺少了chsbrkr.dll (本地下载:chsbrkr.dll)和chtbrkr.dll(本地下载:chtbrkr.dll)两个文件,看文件名是用于简体中文和传统/繁体中文文本分割的。下载这两个文件并拷贝至
~/.wine32tts/drive_c/Program Files/Common Files/Microsoft Shared/Speech/TTS/v11.0
从网上下载时请注意版本,这里使用的是XP 32bit版本。
再次尝试运行,依然无法播放语音,错误信息更改为Error: OLE error 80040111。此时需要将Wine虚拟的Windows环境转换为Windows 8即可。输入命令
$winecfg
然后在“Application”选项卡下将“Windows Version”改为“Windows 8”,确定。
再次运行测试命令应该就可以听到清晰的中文了。如果听到内容与文本内容不相符,则可能是文件编码的问题,请转换文件编码。我主要是选择文本然后播放,所以需要通过快捷键来迅速播放被选中的文本。这需要让balcon读取剪贴板内容并生成语音,可以通过-c参数来实现。
创建朗读快捷键:
可以创建两个简单的脚本文件,一个用于播放英文文本,一个用于播放中文文本,脚本中注意加入wine运行环境的变量即可。
英文文本朗读脚本speakEn.sh:
#!/bin/sh export WINEARCH=win32 export WINEPREFIX=~/.wine32tts wine /usr/local/bin/balcon.exe -n en-US -k -c
其中-k参数是杀死其它正在运行的balcon进程,这样作可以通过选择一个汉字,然后使用快捷键迅速结束朗读。
中文文本朗读的脚本speakCN.sh:
#!/bin/sh export WINEARCH=win32 export WINEPREFIX=~/.wine32tts wine /usr/local/bin/balcon.exe -n zh-CN -k -c
最后利用的X桌面环境设定自己的快捷键来运行以上两个脚本。
小提示:如果你选择了文本,但balcon不播放声音,这是因为Linux下有三个剪贴板,鼠标选取内容存储到了Primary剪贴板中,而balcon调用的是Second剪贴板,因此可以用类似Diodon的剪贴板管理软件来自动同步三个剪贴板的内容。
好了,享受Linux下的高质量TTS朗读吧。
在此强烈谴责一下国内的百度、腾讯等IT厂商,中文TTS本已不错,你们不愿开源,至少发布一个Linux下闭源的免费个人版本吧!
我合成失败,出现的问题如下
litong@litong-CW65S:Downloads$ wine balcon.exe -n en-US -f englishText.txt
0009:err:ole:CoGetClassObject class {d941651c-44e6-4c17-badf-c36826fc3424} not registered
0009:err:ole:create_server class {d941651c-44e6-4c17-badf-c36826fc3424} not registered
0009:err:ole:CoGetClassObject no class object {d941651c-44e6-4c17-badf-c36826fc3424} could be created for context 0x5
0009:err:ole:CoGetClassObject class {cb96b400-c743-11cd-80e5-00aa003e4b50} not registered
0009:err:ole:CoGetClassObject class {cb96b400-c743-11cd-80e5-00aa003e4b50} not registered
0009:err:ole:create_server class {cb96b400-c743-11cd-80e5-00aa003e4b50} not registered
0009:err:ole:CoGetClassObject no class object {cb96b400-c743-11cd-80e5-00aa003e4b50} could be created for context 0x7
Error: voice not selected
litong@litong-CW65S:Downloads$ wine balcon.exe -l
0009:err:ole:CoGetClassObject class {d941651c-44e6-4c17-badf-c36826fc3424} not registered
0009:err:ole:create_server class {d941651c-44e6-4c17-badf-c36826fc3424} not registered
0009:err:ole:CoGetClassObject no class object {d941651c-44e6-4c17-badf-c36826fc3424} could be created for context 0x5
0009:err:ole:CoGetClassObject class {cb96b400-c743-11cd-80e5-00aa003e4b50} not registered
0009:err:ole:CoGetClassObject class {cb96b400-c743-11cd-80e5-00aa003e4b50} not registered
0009:err:ole:create_server class {cb96b400-c743-11cd-80e5-00aa003e4b50} not registered
0009:err:ole:CoGetClassObject no class object {cb96b400-c743-11cd-80e5-00aa003e4b50} could be created for context 0x7
文件也不存在
litong@litong-CW65S:Microsoft Shared$ cd ~/.wine32tts/drive_c/Program\ Files/Common\ Files/Microsoft\ Shared
litong@litong-CW65S:Microsoft Shared$ ls
dasetup ‘SFPCA Cache’ TextConv
litong@litong-CW65S:Microsoft Shared$ tree
.
├── dasetup
│ └── msxmlx.inf
├── SFPCA Cache
│ ├── mdacxmlx.inf
│ ├── msxml3.dll
│ ├── msxml3r.dll
│ ├── msxmlx.cat
│ └── msxmlx.inf
└── TextConv
您好我也遇到同样的问题,请问您解决了吗?
export WINEARCH=win32
export WINEPREFIX=/home/litong/.wine32
这两部执行了吗?
文件也不存在
litong@litong-CW65S:Microsoft Shared$ cd ~/.wine32tts/drive_c/Program\ Files/Common\ Files/Microsoft\ Shared
litong@litong-CW65S:Microsoft Shared$ ls
dasetup ‘SFPCA Cache’ TextConv
litong@litong-CW65S:Microsoft Shared$ tree
.
├── dasetup
│ └── msxmlx.inf
├── SFPCA Cache
│ ├── mdacxmlx.inf
│ ├── msxml3.dll
│ ├── msxml3r.dll
│ ├── msxmlx.cat
│ └── msxmlx.inf
└── TextConv
什么文件不存在?我这里没有问题。
username@userPC:~/.wine32/drive_c/Program Files/Common Files/Microsoft Shared$ tree
.
└── Speech
├── Platform
│ └── v11.0
│ ├── License.rtf
│ └── mssps.dll
├── SR
│ └── v11.0
│ ├── spsreng.dll
│ ├── spsrx.dll
│ └── srloc.dll
├── Tokens
│ ├── SR_MS_zh-CN_TELE_11.0
│ │ ├── AF042052.am
│ │ ├── AI042052.am
│ │ ├── AM042052.am
│ │ ├── c2052.fe
│ │ ├── grph2052.lxa
│ │ ├── l2052.cw
│ │ ├── l2052.ini
│ │ ├── l2052.phn
│ │ ├── l2052.smp
│ │ ├── l2052.wwd
│ │ ├── License.rtf
│ │ ├── lsr2052.lxa
│ │ └── tn2052.bin
│ ├── SR_MS_ZXX_Lightweight_v11.0
│ │ ├── clwtelfe.dat
│ │ └── lwsreng.dll
│ ├── TTS_MS_en-US_ZiraPro_11.0
│ │ ├── enUS.Address.dat
│ │ ├── enUS.Name.dat
│ │ ├── License.rtf
│ │ ├── MSTTSLocenUS.dat
│ │ ├── ZiraProT.APM
│ │ ├── ZiraProT.BR2
│ │ ├── ZiraProT.BR3
│ │ ├── ZiraProT.CMP
│ │ ├── ZiraProT.INI
│ │ ├── ZiraProT.TON
│ │ └── ZiraProT.UDT
│ └── TTS_MS_zh-CN_HuiHui_11.0
│ ├── HuiHuiT.APM
│ ├── HuiHuiT.BR0
│ ├── HuiHuiT.BR2
│ ├── HuiHuiT.EnUS.APM
│ ├── HuiHuiT.EnUS.UDT
│ ├── HuiHuiT.INI
│ ├── HuiHuiT.UDT
│ ├── License.rtf
│ ├── MSTTSLocenUS.dat
│ └── MSTTSLoczhCN.dat
└── TTS
└── v11.0
├── chsbrkr.dll
├── chtbrkr.dll
├── msttsengine.dll
└── msttsloc.dll
最后一步报错
[root@VM_0_10_centos appsoft]# wine balcon.exe -n en-US -f 1.txt
0009:err:winediag:nodrv_CreateWindow Application tried to create a window, but no driver could be loaded.
0009:err:winediag:nodrv_CreateWindow Make sure that your X server is running and that $DISPLAY is set correctly.
ALSA lib dlmisc.c:287:(snd1_dlobj_cache_get) Cannot open shared library /usr/lib/alsa-lib/libasound_module_pcm_pulse.so ((null): /usr/lib/alsa-lib/libasound_module_pcm_pulse.so: cannot open shared object file: No such file or directory)
ALSA lib dlmisc.c:287:(snd1_dlobj_cache_get) Cannot open shared library /usr/lib/alsa-lib/libasound_module_pcm_pulse.so ((null): /usr/lib/alsa-lib/libasound_module_pcm_pulse.so: cannot open shared object file: No such file or directory)
0009:err:ole:CoGetClassObject class {d941651c-44e6-4c17-badf-c36826fc3424} not registered
0009:err:ole:create_server class {d941651c-44e6-4c17-badf-c36826fc3424} not registered
0009:err:ole:CoGetClassObject no class object {d941651c-44e6-4c17-badf-c36826fc3424} could be created for context 0x5
0009:err:ole:CoGetClassObject class {cb96b400-c743-11cd-80e5-00aa003e4b50} not registered
0009:err:ole:CoGetClassObject class {cb96b400-c743-11cd-80e5-00aa003e4b50} not registered
0009:err:ole:create_server class {cb96b400-c743-11cd-80e5-00aa003e4b50} not registered
0009:err:ole:CoGetClassObject no class object {cb96b400-c743-11cd-80e5-00aa003e4b50} could be created for context 0x7
可能是centos的包太老了,可能的话用适合做桌面的发行版试试。
[root@CCall:/home/mstts]$wine msiexec /i SpeechPlatformRuntime.msi
fixme:msi:MSI_OpenDatabaseW open failed r = 80030050 for L”C:\\windows\\temp\\msi41.tmp”
生成不了语音,可能跟这个错误有关,我看~/.wine32tts/drive_c/Program Files/Common Files/Microsoft Shared 没有这个目录,希望得到您的帮助啊
我不知道你的问题出在哪里,看样子好像是Wine不太对,试一试Wine的不同版本。我用的是wine-1.8在Ubuntu 16.04 with MATE。
看看这个页面,步骤有没有问题:
https://www.reddit.com/r/linux/comments/6z41qb/my_text_to_speech_tts_solution_wine_microsoft/
按照这个方法英文可以朗读,但是中文不行
知道原因了,那个测试文件要utf16(unicode)才能正常朗读,而一般系统默认的编码是utf8