个性化语音模型合成实现

这篇博客详细介绍了如何利用已训练好的个性化语音模型,将文本合成为与训练样本声音相似的高质量语音。通过导入相关依赖包,配置模型参数,创建并执行合成任务,最后分析合成音频的详细信息,实现了高度仿真的语音合成。
摘要由CSDN通过智能技术生成

        上篇介绍了“个性化语音模型训练实现”,这里介绍如何使用已经生成好的个性化语音音色模板来将文本合成为语音。从实践的结果来看,合成的语音在语调语气、以及发音吐字方面与训练样本本人完全一致,肉耳很难分辨出来。

        首先导入依赖包,tempfile 包是 Python 标准库的一部分,提供了一组用于创建临时文件和目录的接口,建议在 with 语句中使用该对象,以确保在完成操作后能够被正确清理;mediainfo 包用于分析视频、音频和其他多媒体文件的详细信息,包括编解码器、分辨率、比特率、时长、采样率、字幕轨道等等信息;modelscope 包是阿里云开发的一个模型开放平台,提供了大量的机器学习和深度学习模型,涵盖了计算机视觉、自然语言处理、语音识别等多个领域。

import io
import os
import tempfile
from pydub.utils import mediainfo
from modelscope.pipelines import pipeline
from modelscope.outputs import OutputKeys
from modelscope.utils.constant import Tasks
from modelscope.models.audio.tts import SambertHifigan

        接下来创建一个字典类型的配置项,voice_name 为语音风格标识,F7 代表这是一个特定的音色或发音人;am_ckpt 为声学模型的 checkpoint 路径,它指向用户音色模板的工作目录;am_config 为声学模型的配置文件路径,位于 tmp_am 子目录中,定义了模型的架构和训练参数;voc_ckpt 为语音合成声码器模型路径,位于 orig_model/basemodel_16k/hifigan 子目录,Hifigan 为高质量语音合成声码器;voc_config 为语音合成声码器配置路径,同样位于 ' basemodel_16k/hifigan 目录下,包含声码器的结构和参数;audio_config 为音频处理配置路径,位于 data/audio_config.yaml,包含了音频采样率、量化位数等信息;se_file 为语音增强文件路径,是一个名为 se.npy 的 numpy 数组,用于改善音频质量和消除噪声。

custom_infer_abs = {
    'voice_name':   'F7',
    'am_ckpt':      os.path.join(user_work_dir, 'tmp_am', 'ckpt'),
    'am_config':    os.path.join(user_work_dir, 'tmp_am', 'config.yaml'),
    'voc_ckpt':     os.path.join(user_work_dir, 'orig_model', 'basemodel_16k', 'hifigan', 'ckpt'),
    'voc_config':   os.path.join(user_work_dir, 'orig_model', 'basemodel_16k', 'hifigan', 'config.yaml'),
    'audio_config': os.path.join(user_work_dir, 'data', 'audio_config.yaml'),
    'se_file':      os.path.join(user_work_dir, 'data', 'se', 'se.npy')
}

        接下来再定义一个字典类型配的配置项,键名为 custom_ckpt,键值为 custom_infer_abs,当 kwargs 被调用时,kwargs 字典中的键值对将作为单独的参数传递给调用函数,使函数能够访问和使用 custom_ckpt 中的配置来执行自定义的推断任务。

kwargs = {'custom_ckpt': custom_infer_abs}

        再接下来创建了一个 SambertHifigan 对象,它是一个结合了 SMBERT(Sentence-Modular BERT)和 Hifigan 的特定的语音合成模型。os.path.join 拼接了用户工作路径,它指向了包含模型权重、配置文件的目录;model_id 为创建的 SambertHifigan 对象,后续将通过它来调用模型的方法,执行语音合成的任务。

model_id = SambertHifigan(os.path.join(user_work_dir, "orig_model"), **kwargs)

        然后创建了一个名为 inference 的管道,用于执行文本到语音任务。task 参数指定了要执行的任务类型,Tasks.text_to_speech 表示要执行的是文本到语音的转换;model 参数为模型实例,即之前创建的 SambertHifigan 对象。

inference = pipeline(task=Tasks.text_to_speech, model=model_id)

        接下来调用管道执行语音合成任务,text 为字符串,即待转换成语音的文本;output 为返回值语音数据对象,它包含了音频文件的二进制流、文件路径等信息。

output = inference(input=text)

        然后将合成的语音数据保存到临时文件中,数据流从 output 的 OutputKeys.OUTPUT_WAV 主键中获取,flush 方法确保缓冲区中的所有数据都被写入到磁盘,seek(0) 方法将文件指针移动到文件的开头,方便重新读取文件内容,执行播放或进一步操作。

with tempfile.NamedTemporaryFile(delete=False) as temp_file:
    temp_file.write(output[OutputKeys.OUTPUT_WAV])
    temp_file.flush()
    temp_file.seek(0)

        接下来使用 mediainfo 函数来分析临时文件 temp_file 中的音频信息,通过 duration 主键提取音频的播放时长信息,单位为秒。

audio_info = mediainfo(temp_file.name)
duration_seconds = audio_info['duration']

        到这里整个个性化语音合成的逻辑就全部完成了,试听一下效果,真的还不错。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

厉力文武

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值