Python实现语音合成的N种方法
|Word count:994|Reading time:4min|Post View:
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 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 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" voice = "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 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') 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)