1. 环境准备搭建你的AI语音实验室第一次接触语音合成模型时我被那些能模仿真人说话的AI惊艳到了。后来发现用Python和Bert-VITS2框架自己也能打造专属语音模型。下面我就把踩过的坑和验证过的方案完整分享给你。1.1 Conda环境配置我强烈建议使用Conda管理环境它能完美解决依赖冲突问题。先到Bert-VITS2的GitHub仓库https://github.com/fishaudio/Bert-VITS2下载代码国内访问慢的话可以直接下载ZIP包。conda create -n vits2 python3.9 -y conda activate vits2 pip install torch2.0.1 torchvision0.15.2 torchaudio2.0.2 pip install -r requirements.txt安装Whisper语音识别时有个小技巧如果下载速度慢可以加上清华源pip install openai-whisper -i https://pypi.tuna.tsinghua.edu.cn/simple我测试过这套环境在RTX 3060到A100显卡上都能稳定运行。特别注意torch版本必须匹配你的CUDA驱动否则训练时会报各种奇怪的错误。1.2 获取预训练模型Bert-VITS2需要三类基础模型BERT文本编码器处理输入文本预训练语音模型作为训练起点Whisper模型用于音频转录中文BERT推荐使用chinese-roberta-wwm-ext-large下载后放到bert/chinese-roberta-wwm-ext-large/目录。英文和日文模型根据需求选择我训练中文语音时只用了中文BERT就足够了。预训练语音模型建议从官方提供的链接下载中日双语底模解压后放在data/models目录。这个模型相当于语音界的地基后续训练都是在它基础上微调。2. 数据准备打造专属语音数据集去年我给《西游记》孙悟空配音演员训练模型时发现数据质量直接影响最终效果。优质的训练数据应该满足纯净无背景噪音发音清晰稳定时长5-15秒为佳总时长不少于30分钟2.1 音频预处理实战假设你收集了角色长音频需要先用Whisper切割成片段。我写了个自动化脚本import whisper model whisper.load_model(medium) def process_audio(person_name): # 清空旧数据 if os.path.exists(f./data/short/{person_name}): shutil.rmtree(f./data/short/{person_name}) # 切割长音频 split_long_audio( model, f./data/long/{person_name}, f./data/short/{person_name}, person_name ) # 生成文本标注 files sorted(os.listdir(f./data/short/{person_name})) for file in files: if file.endswith(.wav): text transcribe_one(f./data/short/{person_name}/{file}) with open(f./data/short/{person_name}/{file.replace(.wav,.lab)}, w) as f: f.write(text)运行后会得到切割后的.wav音频文件对应的.lab文本标注文件自动过滤静音片段2.2 生成训练清单需要创建filelist告诉模型去哪找训练数据def generate_filelist(): persons [swk] # 改成你的角色名 with open(filelists/full.txt, w, encodingutf-8) as f: for person in persons: files os.listdir(f./data/short/{person}) for file in files: if file.endswith(.lab): with open(f./data/short/{person}/{file}, r) as lab_file: text lab_file.read().strip() wav_path f./data/short/{person}/{file.replace(.lab,.wav)} f.write(f{wav_path}|{person}|ZH|{text}\n)这个脚本会生成形如路径|角色名|语言|文本的训练清单是模型理解数据结构的桥梁。3. 模型配置调参的艺术Bert-VITS2的配置文件像汽车的控制面板合理设置才能跑出最佳效果。关键参数我都加了注释train_ms: batch_size: 16 # 显存小于12G建议调小 epoch: 1000 # 500-2000之间 learning_rate: 0.0002 save_every: 100 # 每100轮保存检查点 # 重要控制语音风格的关键 speaker_embedding_dim: 256 text_embedding_dim: 768特别提醒几个易错点batch_size太大导致OOM时要等比例减小学习率中文训练务必设置languageZH单人模型可以关闭use_speaker_embedding加速训练4. 训练实战从菜鸟到专家启动训练的命令很简单nohup python train_ms.py train.log 21 但有几个隐藏技巧用tail -f train.log实时查看loss变化当validation loss连续3轮不下降时可以提前终止训练中断后修改config中resume_from即可继续训练我常用的监控手段watch -n 1 nvidia-smi | grep python gpustat -i 1 # 查看显存占用训练过程中会生成多个检查点建议保留最后3个。800轮后生成的语音通常就比较自然了。5. 效果优化让AI更像人第一次训练结果不满意试试这些优化方案问题语音机械感重解决方案增加prosody_weight参数调整variance_predictor层数添加更多情感丰富的训练数据问题发音不准检查.lab文件是否准确增大phoneme_loss_weight在config中启用use_gt_duration有个取巧的方法用已有模型生成语音筛选优质样本加入训练集这样迭代提升效果很明显。6. 模型部署让AI开口说话训练完成的模型使用方法from vits.utils import load_model model, config load_model(path/to/G_1000.pth, configs/config.json) text 师傅俺老孙来也 audio model.generate( text, speaker_id0, # 单人模型固定为0 languageZH, speed1.0 # 0.5-2.0调整语速 )如果想做成Web服务可以搭配Gradio快速搭建界面import gradio as gr def tts(text): audio model.generate(text) return audio gr.Interface( fntts, inputstext, outputsaudio ).launch()我在实际项目中发现适当加入3-5ms的静音头尾能让生成的语音更自然。这个技巧在直播等实时场景特别有用。