in Uncategorized

Linux系统下高质量(微软)中、英文语音合成TTS的安装

由于本人需要对录入文本进行校验,所以决定使用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下闭源的免费个人版本吧!

Write a Comment

Comment

13 Comments

  1. 我合成失败,出现的问题如下
    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

  2. 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

  3. 文件也不存在
    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

  4. 最后一步报错
    [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

  5. [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 没有这个目录,希望得到您的帮助啊