使用PaddlePaddle轻松实现语音合成

2022-09-07 16:56:40 浏览数 (2)

前言

使用PaddlePaddle轻松实现语音合成,提供了简单的示例代码,GUI界面操作,还有Flask的Web接口,可以给Android调用。

源码地址:点击下载

视频教程地址:哔哩哔哩

  1. 首先来写一个简单的程序,通过下面的代码就可以实现语音合成。
代码语言:javascript复制
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()
  1. 提供了gui.py界面程序,可以通过界面进行语音合成。
  1. 另外还提供了server.py,该程序使用Flask提供了Web接口,可以提供给Android应用或者小程序调用,实现语音合成。

0 人点赞