/Bert-VITS2-ext

基于Bert-VITS2做的表情、动画测试. Animation testing based on Bert-VITS2.

Primary LanguagePythonGNU Affero General Public License v3.0AGPL-3.0

简介

扩展到GPT-SoVITS

  • GPT-SoVITS 表情测试
    • 直接在 GPT-SoVITS上重新训练,实测结果比较糟糕
    • 暂时使用的方法是从Bert-VITS2-ext里直接把后验部分以及表情生成部分模型复制到GPT-SoVITS里测试。
    • 这会导致一次重复的计算,以及更多的预测变差

TTS

TTS同步输出表情

思路

  • 参考VITS论文的网络结构图(非bert-vits2,但大体结构是一样的),获取文本编码及变换后、解码前的隐变量z,从旁路输出表情值(Live Link Face数值)
    • 冻结原网络的参数,单独增加一路LSTM和MLP处理,完成z到表情的seq2seq生成与映射
    • 当然如果有高质量的表情数据,也可以把表情也加入原始TTS网络训练,应该能提高音频质量

网络结构

数据采集

  • 设置Live Link Face 的Targets 为本机IP,端口默认11111
  • 同步采集语音和对应的Live Link输出的表情值,分别存入到records文件夹
    • 执行一下脚本采集,每次20秒
    • 音频默认为44100 Hz
    • 音频、表情的采集可能有偏移
    • 可对比验证集的损失找到同一数据源的最佳偏移位置
python ./motion/record.py
  • 查看数据是否正常

  • 测试数据

    • 将录下的bs数据通过live link发给UE中的MetaHuman,同步播放语音,检查是否匹配
python ./motion/tts2ue.py --bs_npy_file  ./records/2023-12-23-17-19-54.npy --wav_file ./records/2023-12-23-17-19-54.wav  --fps 60

数据预处理

  • 读取records中的所有音频文件,利用后验编码器,把音频编码后的隐变量z存入 *.z.npy
  • 写入训练和验证用的文件列表
    • filelists/val_visemes.list
    • filelists/train_visemes.list
python ./motion/prepare_visemes.py

训练

  • 在train_ms.py 后加上--visemes来区别和主网的训练
python train_ms.py  -m OUTPUT_MODEL --config ./configs/config.json --visemes

推理

  • 在webui.py执行时,将输出的音频、隐变量、动画数据写入当前目录,可用tts2ue.py来查看生成效果
  • 生成的动画默认的fps是和隐变量一样的86.1328125
    • 44100/86.1328125 = 512,刚好整除,这是Bert-VITS2音频采样频率、网络结构和hidden_channels决定的
python ./motion/tts2ue.py --bs_npy_file ./tmp.npy --wav_file ./tmp.wav --delay_ms 700

声音到表情

  • 利用后验编码器,把声音转换成z,然后再把z转成表情
    • 音频需转成44100hz的wav文件,并只保留一个通道(ffmpeg)
# 音频截取转换
ffmpeg -i input_file -ss 00:00:00 -t 00:00:10 -ar 44100 -f wav test.wav

# 保留通道1
ffmpeg -i test.wav -map_channel 0.0.0 output.wav

python  ./motion/wav_to_visemes.py output.wav

身体动画

MotionGPT

  • 有了语音和表情后,还可以在LLM驱动下产生与之匹配的动作描述,然后用text to motion模型生成与说话内容匹配的身体动画,甚至和场景、他人进行交互。
  • text to motion测试采用的项目是 MotionGPT
    • 暂未做动画过度处理,看介绍模型是支持的 motion in-between
    • MotionGPT用的flan-t5-base,不能理解中文,所以无法用说话的文本产生同步度很高的动画(翻译成英文后语序多少有些变化)
      • 是否可以用说话的文本或隐变量z来指导动作生成暂未可知
  • MotionGPT输出的是骨骼位置,与UE的骨骼动画不能直接对接
    • 目前用了简化方法估算运动数值,会有不小的位置损失
      • 计算出骨骼相对父节点的旋转变化量(四元数)
      • 通过OSC协议发送给 VMCtoMOP程序,可预览动画,并做协议转换
      • 借助Mop插件将MOP数据映射给MetaHuman
        • 测试版本是UE5.3

audio2photoreal

Bert-VITS2 原版声明

LOGO

VITS2 Backbone with multilingual bert

For quick guide, please refer to webui_preprocess.py.

简易教程请参见 webui_preprocess.py

请注意,本项目核心思路来源于anyvoiceai/MassTTS 一个非常好的tts项目

成熟的旅行者/开拓者/舰长/博士/sensei/猎魔人/喵喵露/V应当参阅代码自己学习如何训练。

严禁将此项目用于一切违反《中华人民共和国宪法》,《中华人民共和国刑法》,《中华人民共和国治安管理处罚法》和《中华人民共和国民法典》之用途。

严禁用于任何政治相关用途。

References

感谢所有贡献者作出的努力