# SpeechMotion **Repository Path**: antonetwo_admin/speech-motion ## Basic Information - **Project Name**: SpeechMotion - **Description**: 结合多个项目,实现利用一段演讲视频,一句语音,一张图片,克隆生成一段假演讲视频 - **Primary Language**: Unknown - **License**: MulanPSL-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 2 - **Created**: 2024-04-07 - **Last Updated**: 2024-04-07 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # SpeechMotion ## 简介 结合多个项目,实现利用一段演讲视频,一句语音,一张图片,克隆生成一段虚拟演讲视频 ## 项目架构和流程 ### 1. 项目流程 + Mockingbrid:中文语音克隆——输入说话人的语音和需要合成的文本,克隆文本对应的语音 + Merge-Force-Align:强制音素对齐——一对音频和文字强制对齐音素 + Speech_Motion_Generation:演讲姿势生成——输入一段语音,生成带口型和手势的火柴人(Openpose) + Openpose:视频人物姿势提取——输入视频或图片提取单人(多人)姿势 + vid2vid:视频到视频动作迁移——视频中的运动迁移到另一个图片的人物上 ### 2. 数据流向(形如:文件A与文件B经过【项目or库】生成文件C) - 被克隆的语音(.wav/.mp3)+ 合成的文本(txt)——克隆出来的语音(.wav)【Mockingbird】 - 合成的文本(.txt)——音素文件(.lab) 【pypinyin】 - 克隆出来的语音(.wav) + 文本拼音(.lab)—— 音素文件(.TextGrad)【MFA】 - 克隆出来的语音(.wav) + 文本拼音(.lab)+ 音素文件(.TextGrad)—— 演讲手势关键点生成(.json)——火柴人演讲视频(.mp4)【Speech_Motion_Generation】 - 演讲人的视频(.avi)—— 演讲人的姿势关键点(.json)+ 演讲人对应帧的图像(.jpg/.png)【Openpose】 - 演讲手势关键点生成(.json)+ 演讲人对应帧的图像(.jpg/.png)+ 克隆出来的语音(.wav)—— 演讲人的视频(.mp4)【vid2vid】 ## 项目复现指导 ### MFA 1. 安装 参考官网和知乎[Montreal Forced Aligner教程——背景、安装和使用](https://zhuanlan.zhihu.com/p/386884727) 2. MFA遇到的坑 `beam too narrow` MFA仓库issue中也有解决办法:改大config中的beam ### openpose生成【Win】 由于我们只是想生成用于vid2vid训练的json数据,所以就用windows系统下的便携式演示demo。如果您只想在不编译或编写任何代码的情况下使用 OpenPose,只需使用适用于 Windows 的最新可移植版本的 OpenPose。为了获得最大速度,您应该在具有 Nvidia GPU 版本的机器中使用 OpenPose。如果是这样,您必须将您的 Nvidia 驱动程序升级到最新版本(在 Nvidia“GeForce Experience”软件或其[网站](https://www.nvidia.com/Download/index.aspx)中)。 1. 从[Releases](https://github.com/CMU-Perceptual-Computing-Lab/openpose/releases)部分下载最新的 OpenPose 版本。 补充:没有GPU的话,也可以从[Releases](https://github.com/CMU-Perceptual-Computing-Lab/openpose/releases)中下载CPU的版本,注意要下载程序,不要下载代码,我们只需要运行demo 2. 按照`Instructions.txt`下载的 zip 文件中的文件下载 OpenPose 所需的模型(约 500 Mb)。 模型:https://pan.baidu.com/share/init?surl=0fOz6GYST4_YwRiIliX1jg 密码:80my 网盘附上,替换掉原有的文件就行 3. 然后,您可以按照[doc/01_demo.md 从 PowerShell 命令行运行 OpenPose](https://github.com/CMU-Perceptual-Computing-Lab/openpose/blob/master/doc/01_demo.md)。 常用的几个命令: ```bash :: Windows - Portable Demo bin\OpenPoseDemo.exe --image_dir examples/media/ --face --hand bin\OpenPoseDemo.exe --video examples/media/video.avi --face --hand ``` ```bash bin\OpenPoseDemo.exe --image_dir examples/media/ --model_pose [BODY_25/] ``` - 如果您不使用`--write_video` or`--write_images` , 为了在使用时进一步加快 OpenPose ,`--display 0`也可以添加`--render_pose 0` (这样 OpenPose 不会用输入图像覆盖骨架)。 ```bash bin\OpenPoseDemo.exe --video examples/media/video.avi --write_images output_images/ --write_images_format jpg --face --hand ``` 可以查看更多命令帮助 ```bash bin\OpenPoseDemo.exe --help ``` **这里有需要注意的点:** 从openpose生成的点是默认调用BODY_25模型和face、hand模型,一共137个点,具体的点可以在openpose的[官方文档](https://cmu-perceptual-computing-lab.github.io/openpose/web/html/doc/md_doc_02_output.html#keypoint-format-in-datum-advanced)中查看,从Speech-Motion-Generation中提取的json文件一共135个点,除了pose的25个点以外,脸部是缺少了两个关键点的。我们已经在训练和测试代码中修改了。此外,pose的25个关键点中,有很多点是和手势生成不必要的,需要人为置0。这些点可以在仓库[这里](https://gitee.com/alasoso/speech-motion/blob/master/openpose/IMG_5202(20220513-145451).JPG)看到,置0的代码在`Speech/openpose/change_json.py`,需要自己改参数。 ### Speech_Motion_Generation ​ 此部分实现从音频转化为pose - 输入为.wav和.TextGrid文件;会生成对应的json文件 ```bash bash demo.sh [wavpath] [TextGridpath] ``` - 输入为.wav和.json文件 ```bash bash visualse.sh [jsonpath] [wavpath] ``` 最终会生成的pose以视频和图片帧的形式都保存了下来,在video文件夹中。 ### vid2vid 训练参考【Ubuntu】 以下三篇都是作为了解和参考,实际操作中只是一点点摸索出来的,谁让英伟达工程师这么爱挖坑。 + [vid2vid 代码调试+训练+测试(debug+train+test)(一)测试篇](https://blog.csdn.net/WinerChopin/article/details/89226937?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522165165268716782388066137%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=165165268716782388066137&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_ecpm_v1~rank_v31_ecpm-2-89226937.nonecase&utm_term=vid&spm=1018.2226.3001.4450) + [vid2vid 代码调试+训练+测试(debug+train+test)(二)训练篇](https://blog.csdn.net/WinerChopin/article/details/89332581?spm=1001.2014.3001.5502) + [vid2vid 代码调试+训练+测试(debug+train+test)(三)在自己的数据集上训练](https://blog.csdn.net/WinerChopin/article/details/89488499?spm=1001.2014.3001.5502) 1、 创建环境准备cudnn显卡驱动,这里需要注意vid2vid官网要版本为10的驱动,官网都是11的了 2、 准备Cmake编译,gcc 3、vgg19模型准备,FlowNet2模型准备,数据下载 ​ 网盘附上: https://pan.baidu.com/s/1rUXxxGriuPR51pmDef7S3Q#list/path=%2Fvid2vid 密码:1111 ​ FlowNet2放在 `vid2vid-master/models/flownet2_pytorch`下 4、准备环境 ```bash create -n [envs-name] py=3.7 cd [envs-name] source bin/activate cd ../vid2vid-master pip install -r requirements.txt cd models/flownet2_pytorch bash ./install.sh cd ../../ ``` ​ 建议服务器部署,8张显卡的操作谁也整不起 ```bash cd vid2vid-master pip install -r requirements.txt cd models/flownet2_pytorch bash ./install.sh cd ../../ ``` 5、训练&测试 ```bash nohup python train.py --name [model_name]_256p --dataroot datasets/[datasets_name] --dataset_mode pose / --input_nc 3 --ngf 64 --resize_or_crop randomScaleHeight_and_scaledCrop --loadSize 384 --fineSize 256 / --n_downsample_G 2 --num_D 2 --max_frames_per_gpu 4 --n_frames_total 12 --max_t_step 4 --openpose_only / --remove_face_labels --checkpoints_dir ./checkpoint --add_face_disc 1> [model_name]_256p.out 2>&1 & ``` ```bash python test.py --name [model_name]_256p --dataroot datasets/[datasets_name] --dataset_mode pose --ngf 64 / --input_nc 3 --resize_or_crop scaleHeight --loadSize 256 --no_first_img --openpose_only / --remove_face_labels --checkpoints_dir ./checkpoint --add_face_disc ``` ```bash nohup python train.py --name [model_name]_512p --dataroot datasets/[datasets_name] --dataset_mode pose / --input_nc 3 --ngf 64 --resize_or_crop randomScaleHeight_and_scaledCrop --loadSize 768 --fineSize 512 / --no_first_img --n_frames_total 12 --max_t_step 4 --add_face_disc --n_scales_spatial 2 --num_D 3 / --max_frames_per_gpu 2 --niter_fix_global 3 --niter 5 --niter_decay 5 --lr 0.0001 --openpose_only / --remove_face_labels --checkpoints_dir ./checkpoint / --load_pretrain checkpoint/[model_name]_256p 1> [model_name]_512p.out 2>&1 & ``` ```bash python test.py --name [model_name]_512p --dataroot datasets/[datasets_name] --dataset_mode pose / --input_nc 3 --n_scales_spatial 2 --ngf 64 --resize_or_crop scaleHeight --loadSize 512 / --no_first_img --openpose_only --remove_face_labels --checkpoints_dir ./checkpoint ``` ```bash nohup python train.py --name [model_name]_1024p --dataroot datasets/[datasets_name] --dataset_mode pose / --input_nc 3 --ngf 64 --resize_or_crop randomScaleHeight_and_scaledCrop --loadSize 1536 --fineSize 1024 / --no_first_img --n_frames_total 12 --max_t_step 4 --add_face_disc --n_scales_spatial 3 --num_D 4 / --ndf 32 --niter_fix_global 3 --niter 5 --niter_decay 5 --lr 0.00005 --openpose_only --remove_face_labels / --checkpoints_dir ./checkpoint --load_pretrain checkpoint/[model_name]_512p 1> [model_name]_1024p.out 2>&1 & ``` ```bash python test.py --name [model_name]_1024p --dataroot datasets/[datasets_name] --dataset_mode pose / --input_nc 3 --n_scales_spatial 3 --ngf 64 --resize_or_crop scaleHeight --loadSize 1024 / --no_first_img --openpose_only --remove_face_labels --checkpoints_dir ./checkpoint ``` 更多训练指令从`scripts/pose/`中去看。 ## 项目参考 本项目参考自以下两个开源项目: https://github.com/babysor/MockingBird https://github.com/TheTempAccount/Co-Speech-Motion-Generation ## 最终封装好的运行代码,以及pyqt运行界面的使用 ### 在aihand目录下voice_and_speechmotion.py中是封装好的各个部分代码 * **函数text_to_wav功能是克隆语音** 输入分别为文本文件的路径,说话人名字,说话人的一条语音 返回克隆之后的wav所在的文件夹路径 * **函数text_to_lab_textgrid功能是根据文本生成lab文件和textgrid文件** lab的内容是文本的拼音和声调形式如下: ```da4 jia1 hao3 da4 jia1 hao3 ``` textgrid文件是文本的节奏,使用mfa工具生成 输入是文本文件的路径和说话人名字 返回textgrid文件路径 * **函数wav_to_pose功能是由根据音频和节奏生成手势** 输入是wav路径和textgrid路径以及说话人姓名 生成的pose保存在aihand目录下的video目录下 ### 界面使用 界面是使用pyqt设计的,运行目录下so.py使用界面 界面弹出后: 点击 选择文本文件,即可选择本地txt文件,文本文件是要演讲的文本,注意标点符号分开的每小段话不宜太长。 点击 选择音频,即可选择本地已有的wav音频,也可点击 录音 实时获取 选择好音频之后,会弹出小窗口输入说话人名字,输入之后点击ok 上述完成之后,点击 生成pose,待生成完毕之后,会显示pose已生成 生成之后,点击播放即可看到生成的视频