在 Python 中实现语音合成的四种方法

发布时间:2024年01月20日

1 离线合成 pytts

配置环境

$ apt-get update
$ apt-get install espeak
$ pip install pyttsx3
$ apt-get install ffmpeg
$ apt-get install alsa-utils

运行程序

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 语音合成

配置环境

$ pip install gtts

运行程序

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 语音合成

配置环境

$ pip install openai

运行程序

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

配置环境

$ pip install aip-baidu

运行程序

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)

文章来源:https://blog.csdn.net/xieyan0811/article/details/135718729
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。