1 科大讯飞TTS SDK
PS:只能生成.wav文件,无法直接播报
-
科大讯飞官网下载离线语音合成(普通版)SDK
-
新建目录Demo,将SDK中bin、include、libs文件夹和sample里的64bit_make.sh、Makefile、tts_offline_sample.c复制到新建工程“Demo”文件夹下
-
修改libmsc.so库搜索路径
- 修改.sh文件:
export LD_LIBRARY_PATH=$(pwd)/libs/x64/
b. 修改makefile文件:
DIR_INC = ./include DIR_BIN = ./bin DIR_LIB = ./libs
c. 修改.c文件:
#include "./include/qtts.h" #include "./include/msp_cmn.h" #include "./include/msp_errors.h"
-
cd到demo目录下,执行“source 64bit_make.sh”完成编译
-
cd到bin目录下运行目标文件,SDK启动后,bin/msc目录下会生成日志(注意:msc文件夹下需有msc.cfg文件)
-
如果第4步出现问题
(ros) jun@jun:~/catkin_ws/src/tts/bin$ ./tts_offline_sample
./tts_offline_sample: symbol lookup error: /lib/libmsc.so: undefined symbol: _ZTVN10__cxxabiv117__class_type_infoE
解决:sudo cp /home/jun/catkin_ws/src/tts/libs/x64/libmsc.so /usr/lib
2 espeak安装使用
- sudo apt install espeak
- 直接命令行使用:
- 中文播报:espeak -vzh "你好”
- 英文播报:espeak "hello”
- 代码调用
import os
# cmdline = 'espeak ' + "hello"
# 程序中说中文(注意格式,espeak与-vzh有空格, 中文:你好之前也有空格)
cmdline = 'espeak -vzh ' + "你好"
os.system(cmdline)
- 在命令行使用时发现
espeak -vzh 你好 #报错:Full dictionary is not installed for ‘zh’
espeak -vzhy 你好 #粤语,但说的不是人话
解决:
git clone https://github.com/caixxiong/espeak-data.git
解压后直接替换 /usr/lib/x86_64-linux-gnu/espeak-data 这个目录即可
cd /usr/lib/x86_64-linux-gnu
sudo cp -r ~/XXX/espeak-data/* espeak-data
cd espeak-data
sudo espeak --compile=zh
sudo espeak --compile=zhy # 成功,但是是蹩脚粤语
- 优缺点:
- 优点:支持中英文
- 缺点:只能命令行使用,机械音较重,不流畅
3 pyttsx3安装使用
我在使用过程中发现无法播报中文
-
安装中文TTS引擎,例如Festival或Flite。使用以下命令安装:
sudo apt update sudo apt install festival # 或者 sudo apt-get install flite
-
安装中文语音包,例如Mandarin。使用以下命令安装:
sudo apt-get install festvox-ellpc11k # 或者 sudo apt-get install festvox-cmu_us_slt_arctic_hts
-
安装pyttsx3库,使用以下命令:
pip3 install pyttsx3
-
在Python脚本中使用pyttsx3库,可以按照以下示例代码编写一个简单的脚本:
import pyttsx3 engine = pyttsx3.init() engine.setProperty('voice', 'english+f3') # 设置英文发音 engine.say('Hello, World!') # 播放英文语音 engine.setProperty('voice', 'default') # 设置中文发音 engine.say('你好,世界!') # 播放中文语音 engine.runAndWait()
-
使用中发现无法播报中文,列举尝试解决的方法之一,如下:(其他方法大同小异,均失败)
把系统里的可用语音包的信息print出来
import pyttsx3 engine = pyttsx3.init() voices = engine.getProperty('voices') for voice in voices: print("Voice:") print(" - ID: %s" % [voice.id](http://voice.id/)) print(" - Name: %s" % [voice.name](http://voice.name/)) print(" - Languages: %s" % voice.languages) print(" - Gender: %s" % voice.gender) print(" - Age: %s" % voice.age)
然后把刚才代码输出的语音包ID信息储存起来
zh_voice_id = "Mandarin" engine.setProperty('voice', zh_voice_id) # 用语音包ID来配置engine engine.say('这回可以了吧') engine.runAndWait()
-
优缺点:
- 优点:可以直接在代码中使用该库
- 缺点:无法播报中文(可能是我电脑的原因)