使用sambert-hifigan微调实现个性化声音定制

使用sambert-hifigan微调实现个性化声音定制

基本概念

TTS(text-to-speech): 文本到语音。输入:文本 输出:音频

Voice Cloning: 在模仿特定人物的声音。输入:文本信息+音频,输出:文本信息对应的音频。

Voice Conversion: 改变已有的语音录音,使其听起来像另一个人或以不同的情感或风格说话。输入:音频1+音频2,输出:内容和音频1一致,音色类似于音频2(例如:变声器)

相关开源项目调研

年份项目名称链接地址描述其他特性
2023coqui TTSTTS支持中文等多重语言,支持多种模型支持voice cloning,voice conversion
2021Real-Time-Voice-CloningReal-Time-Voice-Cloning功能较多,众多开源项目都参考了这一个项目支持voice cloning,只支持英文
2023LocalAILocalAI包含LLM,TTS,文生图以及向量数据库不支持voice cloning
2023tortoise-ttstortoise-tts包含TTS,中文效果不理想不支持voice cloning,支持prompt engineering,如:[I am really sad,] Please feed me. -> Please feed me.
2020TTS (Mozilla)TTS不支持中文,只支持German,French,English支持微调,不支持voice cloning
2023TTS (JAVA)TTS纯JAVA,文档不全
2022tts-vuetts-vue基于微软的语音合成,支持中文只支持基础的tts,不支持voiceclone和voiceconversion
2019WaveRNNWaveRNN纯pytorch的开源项目仅支持训练自己的模型
2021TensorFlowTTSTensorFlowTTS纯tensorflow支持中文等多种语言,支持多种模型不支持voiceclone和voiceconversation
2022PaddleSpeechPaddleSpeech支持中英,资料文档最全,国产paddle框架支持voice cloning,voice conversion
2023Sambert-hifiganspeech_sambert-hifigan_tts_zh-cn_16k阿里的模型,提供多个发音人,支持中英不支持voice cloning,支持多发音人这个系列还有其他的语言模型:粤语,上海话,四川话,俄语等。
2023SoftVC VITS Singing Voice Conversionso-vits-svc偏向于歌声Voice Conversion ,而不是TTS支持voice conversion
2021espnetespnet端到端的语音理解, 支持中文,支持多种语言支持voice conversion,不支持voice cloning,
2023Retrieval-based-Voice-Conversion-WebUIRetrieval-based-Voice-Conversion-WebUIvoice conversion支持voice conversion
2023VALL-E-X VALL-E-X基于微软的语音合成,支持中文,支持voiceclone支持voiceclone

sambert-hifigan整体框架

在这里插入图片描述

参考自:https://www.modelscope.cn/models/damo/speech_personal_sambert-hifigan_nsf_tts_zh-cn_pretrain_16k/summary

输入: 文本

输出: 音频

实验过程

数据集

以下为所用的数据集的时长

NameDataset_time
A<5min
B1hour
C1hour
D1hour
E3-5hour
F3-5hour

长音频切片

主要使用whisper进行长音频切片,whisper采用的模型可以进行修改为large,small等,可根据机器的配置进行决定

import subprocess
from pathlib import Path
import librosa
from scipy.io import wavfile
import numpy as np
import torch
import csv
import whisper

def split_long_audio(model, filepaths, character_name, save_dir="data_dir", out_sr=44100):
    if isinstance(filepaths, str):
        filepaths = [filepaths]

    for file_idx, filepath in enumerate(filepaths):

        save_path = Path(save_dir) / character_name
        save_path.mkdir(exist_ok=True, parents=True)

        print(f"Transcribing file {file_idx}: '{filepath}' to segments...")
        result = model.transcribe(filepath, word_timestamps=True, task="transcribe", beam_size=5, best_of=5)
        segments = result['segments']

        wav, sr = librosa.load(filepath, sr=None, offset=0, duration=None, mono=True)
        wav, _ = librosa.effects.trim(wav, top_db=20)
        peak = np.abs(wav).max()
        if peak > 1.0:
            wav = 0.98 * wav / peak
        wav2 = librosa.resample(wav, orig_sr=sr, target_sr=out_sr)
        wav2 /= max(wav2.max(), -wav2.min())

        for i, seg in enumerate(segments):
            start_time = seg['start']
            end_time = seg['end']
            wav_seg = wav2[int(start_time * out_sr):int(end_time * out_sr)]
            wav_seg_name = f"{character_name}_{file_idx}_{i}.wav"
            out_fpath = save_path / wav_seg_name
            wavfile.write(out_fpath, rate=out_sr, data=(wav_seg * np.iinfo(np.int16).max).astype(np.int16))
            
whisper_size = "medium"
whisper_model = whisper.load_model(whisper_size)
split_long_audio(whisper_model, "filename.wav", "test", "dataset_raw") # 请在{filename}处填写您上传的wav文件名

音频标注

input_wav = "./test_wavs/"
output_data = "./output_training_data/"

ret, report = run_auto_label(input_wav=input_wav, work_dir=output_data, resource_revision="v1.0.5")

声学模型配置修改

train_max_steps: 1002000

linguistic_unit: {cleaners: english_cleaners, lfeat_type_list: 'sy,tone,syllable_flag,word_segment,emo_category,speaker_category',

  speaker_list: 'A,F74,FBYN,FRXL,M7,xiaoyu'}   #这个speak list中需要包含训练的说话人名称,例如:此处用A的声音做训练

声码器配置修改

save_interval_steps: 2000

train_max_steps: 2500000

微调

# 特征提取
python kantts/preprocess/data_process.py --voice_input_dir /data/software/anchor_voice/zhubo_output_training_data --voice_output_dir training_stage/zhubo_feats --audio_config kantts/configs/audio_config_16k.yaml --speaker A

# 训练声学模型(multisp)
CUDA_VISIBLE_DEVICES=0 python kantts/bin/train_sambert.py --model_config speech_sambert-hifigan_tts_zh-cn_multisp_pretrain_16k/basemodel_16k/sambert/config.yaml --resume_path speech_sambert-hifigan_tts_zh-cn_multisp_pretrain_16k/basemodel_16k/sambert/ckpt/checkpoint_980000.pth --root_dir training_stage/zhubo_feats --stage_dir training_stage/zhubo_sambert_ckpt


# 训练声码器
CUDA_VISIBLE_DEVICES=0 python kantts/bin/train_hifigan.py --model_config speech_sambert-hifigan_tts_zh-cn_multisp_pretrain_16k/basemodel_16k/hifigan/config.yaml --resume_path speech_sambert-hifigan_tts_zh-cn_multisp_pretrain_16k/basemodel_16k/hifigan/ckpt/checkpoint_2000000.pth --root_dir training_stage/zhubo_feats --stage_dir training_stage/zhubo_hifigan_ckpt

# 推理
CUDA_VISIBLE_DEVICES=0 python kantts/bin/text_to_wav.py --txt test.txt --output_dir res/zhubo_syn --res_zip speech_sambert-hifigan_tts_zh-cn_multisp_pretrain_16k/resource.zip --am_ckpt training_stage/zhubo_sambert_ckpt/ckpt/checkpoint_1000000.pth --voc_ckpt training_stage/zhubo_hifigan_ckpt/ckpt/checkpoint-3473.pth --speaker A

微调经验

  1. 高质量的数据集 >> 低质量的数量集

  2. 数据集的时长最好大于30min

  3. 低质量数据集即使时间很长,对于训练的产生的效果也不会有很大的改进

  4. hifigan可以不进行微调,进行微调的时候,也可以无需进行很多轮次的迭代,因为它的loss值下降的很慢

  5. 声音存在颤音 电流音,且loss值较高的时候增加epoch次数可以提高生成的质量,或者进行声码器训练

  6. 数据集越大,每个epoch耗时越长

  7. 提高效果的三种方法:1. 制作高质量数据集 2. 增加声学模型的epoch次数 3.微调声码器

微调sambert loss统计

微调了好几个模型,本机环境:RTX4090,time_consume为实际所采取的epoch和消耗的时间(发现epoch持续增加,并没有提高效果所以停了)

modelNameTime_consumeLossmel_lossdur_losspitch_lossenergy_lossx_band_widthh_band_widthBatch_size
sambertA377 epoch/5 min0.56640.15090.04510.10400.093517.931017.93103.6250
sambertB200 epoch/12min0.58600.15110.06090.09550.105320.187020.18704
sambertC168 epoch/17 min0.67470.15870.08220.10880.140121.950021.95003.993
sambertD252 epoch/19min0.71720.16610.08350.11010.158420.80720.8073.964
sambertE75 epoch/17min0.89200.17860.12690.14160.228415.606015.60603.9960
SambertF500epoch/163min0.63490.14360.08050.10400.133121.113021.11303.9940

微调hifigan统计

ModelNameTime_consumemel_lossadversarial_lossfeature_matching_lossgenerator_lossreal_lossfake_lossdiscriminator_loss
HifiganA100 epoch/9min0.21296.12587.070227.58391.61581.58223.1981
HifiganB137 epoch/10 min0.21256.29787.348028.38071.58311.57713.1602
HifiganC207 epoch/23 min0.19435.90186.366125.13791.66051.63453.2950
HifiganD190 epoch/15min0.21176.47517.537928.83361.54941.55203.1014
HifiganE53epoch/18min0.20505.55537.113126.96721.7102.1.65163.3617.
HifiganF292epoch/103min0.19616.92378.889931.06191.45391.50542.9716

优化方向

  1. 数据集标注,高质量数据集
  2. 多人物 共同推理一段文本
  • 6
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 7
    评论
mpnet-base-v2是一种自然语言处理模型,它是PaddlePaddle的基础模型之一。微调指的是在已经预训练好的mpnet-base-v2模型上进行模型参数的调整和优化,以适应特定任务的需求。 进行mpnet-base-v2微调的主要目的是通过在特定任务上进行训练,使模型具有更好的性能和适应能力。微调可以通过在特定任务上进行更多的训练来提高模型的准确性和泛化能力。 在进行mpnet-base-v2微调之前,我们需要准备好特定任务的训练数据集。这个数据集需要与我们的任务目标相关,并且标注好相应的标签或答案。 微调的过程主要分为两个步骤:冻结层和微调训练。 首先,我们冻结mpnet-base-v2模型中的一些底层网络层,这些层经过预训练已经具备较好的特征提取能力,通常可以复用。冻结这些层可以减少我们需要调整的参数量,以提高训练效率和避免过拟合。 然后,我们对剩余的层进行微调训练。微调训练的过程就是在特定任务的数据集上对模型进行训练,通过调整模型参数来适应任务的需求。训练过程中,我们可以使用一些优化算法和技巧,如学习率衰减、正则化等,来进一步提高模型的性能。 为了得到一个较好的微调效果,我们还可以进行调参和验证,通过调整超参数来达到更好的模型性能。例如,我们可以调整微调训练的迭代次数、学习率等参数。同时,我们也需要使用验证数据集来评估模型在未见过的数据上的性能,以便进行调整和优化。 总的来说,mpnet-base-v2微调通过在特定任务上进行训练,使其更好地适应任务需求,从而达到提高模型性能的目的。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Saber_Alpha

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

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

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

打赏作者

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

抵扣说明:

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

余额充值