1 离线合成 pytts

配置环境

1
2
3
4
5
$ apt-get update
$ apt-get install espeak
$ pip install pyttsx3
$ apt-get install ffmpeg
$ apt-get install alsa-utils

运行程序

1
2
3
4
5
6
7
8
9
10
11
12
import pyttsx3

engine = pyttsx3.init()
engine.setProperty('rate', 150)
engine.setProperty('volume', 0.7)

text = "你好,欢迎使用 pyttsx3 中文语音合成!"
engine.say(text)
engine.runAndWait()

engine.save_to_file(text, 'output.wav')
engine.runAndWait()

描述:十几年前的老工具,用规则实现,虽然能用但效果不好

优点:可以离线使用

缺点:塑料声太严重,反正我接受不了

2 google 语音合成

配置环境

1
$ pip install gtts

运行程序

1
2
3
4
5
6
7
8
from gtts import gTTS
import os

os.environ['HTTP_PROXY']='http://192.168.10.106:12346'
os.environ['HTTPS_PROXY']='http://192.168.10.106:12346'

tts = gTTS('你好,世界', lang='zh-cn')
tts.save('hello_world.mp3')

描述:google 提供的 tts 服务,虽然免费但限制比较严重;当然也可以附加一些工具,来解决这个问题;如果用直接删帧的方法会明显影响音质。

优点:调用简单合成速度快,不需要申请帐号可直接使用

缺点:无法调节速度,只有正常和慢,无法精调;需要科学上网

文档:https://github.com/pndurette/gTTS

3 openai 语音合成

配置环境

1
$ pip install openai

运行程序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
from pathlib import Path
from openai import OpenAI

def generate_speech(api_key, text, model, voice, file_path):

client = OpenAI(api_key=api_key)
response = client.audio.speech.create(
model=model,
voice=voice,
input=text
)

path = Path(file_path)
with open(path, 'wb') as file:
file.write(response.content)
return f'save to: {path}'

api_key = 'sk-xxx'
text = "测试一下openai的语音合成"
model="tts-1" # tts-1、tts-1-hd、tts-1、tts-1-hd
voice = "shimmer" # alloy、echo、fable、onyx、nova、shimmer
file_path = r"openai.mp3"

print(generate_speech(api_key, text, model, voice, file_path))

描述:openai 提供的基于大模型的语言合成,效果好

优点:流畅自然,合成速度也能接受

缺点:需要 openai 帐号,需要付费,需要科学上网

文档:https://platform.openai.com/docs/guides/text-to-speech

4 百度 tts

配置环境

1
$ pip install aip-baidu

运行程序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
from aip import AipSpeech 

APP_ID = 'xxx'
API_KEY = 'xxx'
SECRET_KEY = 'xxx'

client = AipSpeech(APP_ID, API_KEY, SECRET_KEY)
manual = r'测试百度tts'

if __name__ == '__main__':
print('start voice process')
#语速spd: 5, 语调pit: 5, 播音per: 1
result = client.synthesis(manual, 'zh', 1, {
'vol': 5, 'per':1,
})

if not isinstance(result, dict):
with open('baidu.mp3', 'wb') as f:
f.write(result)
else:
print(result)
print('process end')

描述:中规中举,在国内网络环境下可用

优点:一般手机提供的 tts 效果差不多,不需要科学上网

缺点:需要付费

文档:https://console.bce.baidu.com/ai/#/ai/speech/overview/resource/getFree

5 讯飞

例程:使用官方的 Python Demo 很长,依赖库也多;还且会随着 API 更新会切换接口,就不粘在这里了。

描述:几乎是中文合成效果最好的语音合成引擎

优点:字正腔圆,效果很好;新人礼包,第一年最高 50 万次免费,每天可用几百次

缺点:这 Demo, API, 和文档真是一言难尽…… 使用方式与百度类似,但调用方式不够友好

平台:https://www.xfyun.cn/services/online_tts

文档:https://www.xfyun.cn/doc/tts/online_tts/API.html

参数说明文档:找了半天才找到

6 总结

论合成速度,讯飞和百度都很快;而深度学习模型在转换内容多时会比较慢,此问题可以通过工程化方法优化。如果读技术文档,讯文最为字正腔圆;如果读小说 openai 真的可以听到情感输出,很上头,嘿嘿,反正这是个声控没办法。最终我做了设置界面,方便切换,主要用讯飞和 openai。当然,如果有资源也可以自已搭建深度学习的合成服务,训练你喜欢的声音。不过我觉得如果用得少,也没必要。

7 参考

【小沐学Python】Python实现TTS文本转语音(speech、pyttsx3、百度AI)