音视频开发之旅(83)- 腾讯音乐开源高质量唇形同步模型--MuseTalk

目录

1.效果展示

2.原理学习

3.流程分析

4.资料

一、效果展示 -- (推理素材来源于网络,如有侵权,联系立删!)

唱歌效果(歌曲有suno生成)

用于推理的视频素材来源于网络,如有侵权,立删

二、原理学习

目前只开源了推理代码和预训练模型;

训练代码;技术论文等尚未开源,通过模型架构图来进行分析。

图片

MuseTalk 在潜空间中进行训练,其中图像由冻结的 VAE 进行编码。音频由冻结的 whisper-tiny 模型编码。生成网络的架构借鉴了stable-diffusion-v1-4 的 UNet,其中音频嵌入通过交叉注意力融合到图像嵌入。

三、流程分析

推理:

python -m scripts.inference --inference_config configs/inference/test.yaml

test.yaml配置如下:

task_0: video_path: "data/video/02.mp4" audio_path: "data/audio/女-悲伤情歌.wav" bbox_shift: 3

1. 从视频中提取视频帧

save_dir_full = os.path.join(args.result_dir, input_basename)os.makedirs(save_dir_full,exist_ok = True)cmd = f"ffmpeg -v fatal -i {video_path} -start_number 0 {save_dir_full}/%08d.png"os.system(cmd)input_img_list = sorted(glob.glob(os.path.join(save_dir_full, '*.[jpJP][pnPN]*[gG]')))fps = get_video_fps(video_path)

2. 对音频进行特征提取

whisper_feature = audio_processor.audio2feat(audio_path)whisper_chunks = audio_processor.feature2chunks(feature_array=whisper_feature,fps=fps)

3. 提取人脸关键点和人脸box

coord_list, frame_list = get_landmark_and_bbox(input_img_list, bbox_shift)

4. 根据人脸box对图像进行裁剪,并缩放到256,进行vae编码到潜空间

i = 0input_latent_list = []for bbox, frame in zip(coord_list, frame_list):    if bbox == coord_placeholder:        continue    x1, y1, x2, y2 = bbox    crop_frame = frame[y1:y2, x1:x2]    crop_frame = cv2.resize(crop_frame,(256,256),interpolation = cv2.INTER_LANCZOS4)    latents = vae.get_latents_for_unet(crop_frame)    input_latent_list.append(latents)

5. 平滑第一帧和最后一帧,使得视频可以循环

​​​​​​​

# to smooth the first and the last frameframe_list_cycle = frame_list + frame_list[::-1]coord_list_cycle = coord_list + coord_list[::-1]input_latent_list_cycle = input_latent_list + input_latent_list[::-1]

6. 进行推理

​​​​​​​

############################################## inference batch by batch ##############################################print("start inference")video_num = len(whisper_chunks)batch_size = args.batch_sizegen = datagen(whisper_chunks,input_latent_list_cycle,batch_size)res_frame_list = []for i, (whisper_batch,latent_batch) in enumerate(tqdm(gen,total=int(np.ceil(float(video_num)/batch_size)))):        tensor_list = [torch.FloatTensor(arr) for arr in whisper_batch]    audio_feature_batch = torch.stack(tensor_list).to(unet.device) # torch, B, 5*N,384    audio_feature_batch = pe(audio_feature_batch)        pred_latents = unet.model(latent_batch, timesteps, encoder_hidden_states=audio_feature_batch).sample    recon = vae.decode_latents(pred_latents)    for res_frame in recon:        res_frame_list.append(res_frame)

7. 生成的唇形同步的256人脸头像再贴回到原图片​​​​​​​

print("pad talking image to original video")for i, res_frame in enumerate(tqdm(res_frame_list)):    bbox = coord_list_cycle[i%(len(coord_list_cycle))]    ori_frame = copy.deepcopy(frame_list_cycle[i%(len(frame_list_cycle))])    x1, y1, x2, y2 = bbox    try:        res_frame = cv2.resize(res_frame.astype(np.uint8),(x2-x1,y2-y1))    except:        #print(bbox)        continue        combine_frame = get_image(ori_frame,res_frame,bbox)    cv2.imwrite(f"{result_img_save_path}/{str(i).zfill(8)}.png",combine_frame)

8. 合并视频帧为视频,与音轨合并输出最终视频

​​​​​​​

cmd_img2video = f"ffmpeg -y -v fatal -r {fps} -f image2 -i {result_img_save_path}/%08d.png -vcodec libx264 -vf format=rgb24,scale=out_color_matrix=bt709,format=yuv420p -crf 18 temp.mp4"print(cmd_img2video)os.system(cmd_img2video)
cmd_combine_audio = f"ffmpeg -y -v fatal -i {audio_path} -i temp.mp4 {output_vid_name}"print(cmd_combine_audio)os.system(cmd_combine_audio)

四、资料

MuseTalk: https://github.com/TMElyralab/MuseTalk

感谢你的阅读

接下来我们继续学习输出AIGC相关内容,欢迎关注公众号“音视频开发之旅”,一起学习成长。

欢迎交流

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/596596.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于R语言lavaan结构方程模型(SEM)技术应用

结构方程模型(Sructural Equation Modeling,SEM)是分析系统内变量间的相互关系的利器,可通过图形化方式清晰展示系统中多变量因果关系网,具有强大的数据分析功能和广泛的适用性,是近年来生态、进化、环境、…

lua学习笔记7(函数的学习)

print("*****************************函数的学习*******************************") print("*****************************无参数无返回值函数的学习*******************************") function f1()print("f1函数") end f1() f2function()--…

《价值》-张磊-高瓴资本-4(下)-三个投资哲学:“守正用奇”“弱水三千,但取一瓢”“桃李不言,下自成蹊”。

我常用三句古文来概括它们:“守正用奇”“弱水三千,但取一瓢”“桃李不言,下自成蹊”。 守正用奇 “守正用奇”是从老子的《道德经》中总结出来的表述。老子说“以正治国,以奇用兵”,即以清净的正道来治理国家&#xf…

Transformer模型-add norm(残差连接归一化)的简明介绍

今天介绍transformer模型的add & norm(残差连接&归一化) add代表残差连接(Residual Connection) 残差连接是一种跳过连接,它将输入添加到网络的中间层或输出上。 **残差连接(Residual Connection)…

ffmpeg 将多个视频片段合成一个视频

ffmpeg 将多个视频片段合成一个视频 References 网络视频 6 分钟的诅咒。 新建文本文件 filelist.txt filelist.txtfile output_train_video_0.mp4 file output_train_video_1.mp4 file output_train_video_2.mp4 file output_train_video_3.mp4 file output_train_video_4.m…

Qt之信号和槽的机制

前言 在 C 中,对象与对象之间产生联系要通过调用成员函数的方式。但是在 Qt中,Qt提供了一种新的对象间的通信方式,即信号和槽机制。在GUI编程中,通常希望一个窗口部件的一个状态的变化会被另一个窗口部件知道,为…

我做的小程序,一下流量就爆了【小游戏:你对颜色敏感吗】

大家好,我是鬼哥,一位8年前端从业者,也是一位全栈开发&独立开发者, 最近有点浮躁,可笑的是2024年已经过去一个季度了,我今年的目标貌似都还没正式开始。 本来去年下半年计划今年开始,正式运…

2024.4.1-[作业记录]-day06-认识 CSS(三大特性、引入方式)

个人主页:学习前端的小z 个人专栏:HTML5和CSS3悦读 本专栏旨在分享记录每日学习的前端知识和学习笔记的归纳总结,欢迎大家在评论区交流讨论! day06-认识 CSS(三大特性、引入方式) 文章目录 day06-认识 CSS(三大特性、引入方式)作业…

Apache Log4j2 Jndi RCE CVE-2021-44228漏洞原理讲解

Apache Log4j2 Jndi RCE CVE-2021-44228漏洞原理讲解 一、什么是Log4j2二、环境搭建三、简单使用Log4j2四、JDNI和RMI4.1、启动一个RMI服务端4.2、启动一个RMI客户端4.3、ldap 五、漏洞复现六、Python批量检测 参考视频:https://www.bilibili.com/video/BV1mZ4y1D7K…

01.IDEA中出现Cannot resolve symbol ‘SpringApplication异常

试了很多次,看了这篇文章终于发现了问题。IDEA解决springboot工程中Cannot resolve symbol SpringApplication异常-CSDN博客 我存在的问题在于Maven home path有误,改正之后就没有问题,不标红了。

三子棋游戏----C语言版【超级详细 + 视频演示 + 完整源码】

㊙️小明博客主页:➡️ 敲键盘的小明 ㊙️ ✅关注小明了解更多知识☝️ 文章目录 前言一、三子棋的实现思路二、三子棋的实现步骤2.1 先显示游戏的菜单2.2 游戏的具体实现2.2.1 棋盘的初始化2.2.2 展示棋盘2.2.3 下棋🔴玩家下棋🔴电脑下棋2.2…

【Linux】UDP编程【下】{三版本服务器/编程常见问题}

文章目录 3.linux网络涉及到的协议栈4.三个版本的服务器4.1响应式4.2命令式4.3交互式1.启动程序2.运行结果 3.linux网络涉及到的协议栈 Linux网络协议栈是一个复杂而强大的系统,它负责处理网络通信的各种细节。下面是对Linux网络协议栈的详细介绍: 套接…