前言
使用PaddlePaddle轻松实现语音合成,提供了简单的示例代码,GUI界面操作,还有Flask的Web接口,可以给Android调用。
源码地址:点击下载
视频教程地址:哔哩哔哩
- 首先来写一个简单的程序,通过下面的代码就可以实现语音合成。
import os
import warnings
import wave
import paddle
import pyaudio
import soundfile as sf
warnings.filterwarnings("ignore")
from paddlespeech.t2s.frontend.zh_frontend import Frontend
# 声学模型路径
am_model_path = 'models/fastspeech2/model'
# 模型的发声字典
phones_dict_path = 'models/fastspeech2/phone_id_map.txt'
# 声码器模型路径
voc_model_path = 'models/wavegan/model'
# 要合成的文本
text = '我是夜雨飘零,我爱深度学习!'
# 输出文件的保持路径
output_path = 'output/1.wav'
# 获取文本前端
frontend = Frontend(g2p_model='g2pM', phone_vocab_path=phones_dict_path)
# 声学模型
am_inference = paddle.jit.load(am_model_path)
# 声码器模型
voc_inference = paddle.jit.load(voc_model_path)
# 文本转模型输入
input_ids = frontend.get_input_ids(text, merge_sentences=False)
phone_ids = input_ids['phone_ids']
print(phone_ids)
# 模型输出结果拼接
wav_all = None
for i in range(len(phone_ids)):
part_phone_ids = phone_ids[i]
# 获取声学模型的输出
mel = am_inference(part_phone_ids)
# 获取声码器模型输出
wav = voc_inference(mel)
if wav_all is None:
wav_all = wav
else:
wav_all = paddle.concat([wav_all, wav])
# Tensor转numpy
wav = wav_all.numpy()
os.makedirs(os.path.dirname(output_path), exist_ok=True)
sf.write(output_path, wav, samplerate=24000)
print(f'音频已保存:{output_path}')
chunk = 1024
wf = wave.open(output_path, 'rb')
p = pyaudio.PyAudio()
stream = p.open(format=p.get_format_from_width(width=wf.getsampwidth()),
channels=wf.getnchannels(),
rate=wf.getframerate(),
output=True)
# 读取音频
data = wf.readframes(chunk)
# 循环读取音频
while len(data) > 0:
stream.write(data)
data = wf.readframes(chunk)
stream.stop_stream()
stream.close()
p.terminate()
- 提供了
gui.py
界面程序,可以通过界面进行语音合成。
- 另外还提供了
server.py
,该程序使用Flask提供了Web接口,可以提供给Android应用或者小程序调用,实现语音合成。