目前的语音合成技术方案都会随组件自带一系列男女老少的音色作为模板,合成的结果自然而且流畅,已经十分接近普通人正常的说话和表达的水平了。这里想介绍一种采用用户自己或他人的声音样本,经过训练以后能够以极低的成本并快速得到个性化音色模型的实现过程。
这里用到的个性化音色训练模型是指语音合成模型是专门为个人定制的个性化语音合成模型;模型中使用了 sambert 算法和组件,这是一种特定的语音合成算法和语音处理技术;此外它还用到了 HiFi-GAN 对抗网络(GAN)模型,用于生成高质量的语音;NSF 指的是 "non-silent frames",它在语音处理中表示非静音的音频帧;模型训练支持中文、英文和中英文混排,在大量数据上经过预训练,支持采用 16kHz 采样率的高质量语音输出。
首先导入依赖包,download 包用于从远程下载用户的声音训练样本文件,modelscope 为个性化音色训练所用到的第三方依赖包。
import os
import time
from utils.download import download
from modelscope.metainfo import Trainers
from modelscope.tools import run_auto_label
from modelscope.trainers import build_trainer
from modelscope.utils.audio.audio_utils import TtsTrainType
接下来需要创建一系列目录,用于保存用户的声音训练样本文件,以及个性化音色模型存储路径。用户的存储路径为用户 ID 加时间戳,以确保路径的唯一性。
user_path = uid + '_' + str(int(time.time())) + "/"
user_temp = '/tmp/user_temp/' + user_path
user_data = '/tmp/user_data/' + user_path
user_work = '/tmp/user_work/' + user_path
user_temp_dir = os.path.dirname(user_temp)
user_data_dir = os.path.dirname(user_data)
user_work_dir = os.path.dirname(user_work)
os.makedirs(user_temp_dir, exist_ok=True)
os.makedirs(user_data_dir, exist_ok=True)
os.makedirs(user_work_dir, exist_ok=True)
然后是下载用户的声音训练样本文件,其中 samples 参数为远程文件地址列表,下载后的文件保存到 user_temp_dir 路径下。
for sample in samples:
download(sample, user_temp_dir)
声音训练样本文件下载完毕以后就可以开始启动训练过程了。input_wav 参数为用户临时目录的路径,即包含待处理音频文件的目录,下面包含多个 wav 格式的音频文件,这些文件将作为输入进行自动标签处理;work_dir 参数为工作目录,表示处理过程中产生的中间文件或结果文件的存储位置,用于存放与用户相关的所有数据;resource_revision 参数为资源的修订版本号,指定了使用的资源(比如模型、库或者配置文件)的具体版本。
run_auto_label(input_wav=user_temp_dir, work_dir=user_data_dir, resource_revision="v1.0.7")
接下来调用 build_trainer 函数来初始化一个训练器对象,它负责准备和执行模型训练任务。其中 Trainers.speech_kantts_trainer 参数指定了训练器的类型,要求接下来的训练将会针对语音合成任务进行配置和执行;default_args 参数是一个字典类型,用于传递给训练器初始化的一系列配置项,包括模型路径、模型版本、工作路径及训练参数等等。
TtsTrainType.TRAIN_TYPE_SAMBERT 是一种特定的训练类型,是一个基于 SMBERT(Sentence-Modular BERT)的声学模型,它包含以下训练参数:train_steps 为训练步数,表示训练过程中,模型将进行迭代更新的次数,它决定了模型训练的总周期,它直接影响到模型对数据集的学习程度和最终收敛状态;save_interval_steps 为保存检查点,Checkpoint 是模型在训练过程中的中间状态,包括权重、优化器状态等重要信息,在训练过程中定期保存 checkpoint 可以防止因意外中断(如硬件故障、程序崩溃等)导致的训练进度丢失,便于后续恢复训练或评估不同训练阶段的模型性能;log_interval 设定了训练日志输出的频率,即在训练过程中,每10个步骤,模型的训练状态和性能指标将会被打印出来,供开发者监控训练进度。
trainer = build_trainer(
Trainers.speech_kantts_trainer,
default_args=dict(
model=model_kan_tts_path, # 指定要finetune的模型
model_revision="v1.0.6", # 模型版本
work_dir=user_work_dir, # 指定临时工作目录
train_dataset=user_data_dir, # 指定数据集id
train_type={ # 指定要训练类型及参数
TtsTrainType.TRAIN_TYPE_SAMBERT: { # 配置训练AM(sambert)模型
'train_steps': 202, # 训练多少个step
'save_interval_steps': 200, # 每训练多少个step保存一次checkpoint
'log_interval': 10 # 每训练多少个step打印一次训练日志
}
}
)
)
最后调用 trainer 对象的 train() 函数来启动训练过程,它包括以下步骤:加载模型和配置、数据预处理、开始训练循环、保存检查点、日志输出、完成训练及善后处理(评估模型、生成模型报告)。
trainer.train()
以上就是个性化语音模型训练的介绍和实现过程,补充说明一下个性化训练语音样本的格式和要求,从实践经验来看,样本为 wav 声音文件,音频长度建议不少于 10 秒,样本文件数不少于 20 个,在录制音频的时候无特殊要求,保持背景环境安静低噪音,按照平时正常说话的音量语速即可,经过上述训练过程生成的音色模板,在后续的语音再合成中,一定可以得到满意的效果。