音视频开发之旅(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相关内容,欢迎关注公众号“音视频开发之旅”,一起学习成长。

欢迎交流

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Java中常见的排序算法

常见算法可以分为两大类:   非线性时间比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此称为非线性时间比较类排序。   线性时间非比较类排序:不通过比较来决定元素间的相对次序…

Windows应急响应

1.排查隐藏账号 查看注册表 找到攻击者用户目录文件 排查用户异常 eventvwr.msc 分析用户登录日志 排查可疑端口 排查可疑进程 检查启动项、计划任务和服务 查看系统补丁信息 安装火绒,在安全工具里有火绒剑 计划任务 使用D盾对主机进行检测,发现隐藏账户…

python自定义库的打包和安装

要将自定义库安装到python的三方包地址site-packages中,除了可以直接的复制之外,更为合理科学的方法是通过build和install的方式进行。因为直接复制仅仅作为一种临时的简单的方法,而且只能针对源码进行,也不好进行科学管理&#x…

AJAX —— 学习(三)(完结)

目录 一、jQuery 中的 AJAX (一)get 方法 1.语法介绍 2.结果实现 (二)post 方法 1.语法介绍 2.结果实现 (三)通用型的 AJAX 方法 1.语法介绍 2.结果实现 二、AJAX 工具库 axios &#xff08…

简历复印--原型模式

1.1 夸张的简历 简历的打印。"对编程来说,简单的复制粘贴极有可能造成重复代码的灾难。我所说的意思你根本还没听懂。那就以刚才的例子,我出个需求你写写看,要求有一个简历类,必须要有姓名,可以设置性别和年龄&am…

第十四届蓝桥杯省赛大学C组(C/C++)填充

原题链接:填充 有一个长度为 n 的 01 串,其中有一些位置标记为 ?,这些位置上可以任意填充 0 或者 1,请问如何填充这些位置使得这个 01 串中出现互不重叠的 0 和 1 子串最多,输出子串个数。 输入格式 输入一行包含一…

SQLite 4.9的 OS 接口或“VFS”(十三)

返回:SQLite—系列文章目录 上一篇:SQLite字节码引擎(十二) 下一篇:SQLite 4.9的虚拟表机制(十四) 1. 引言 本文介绍了 SQLite OS 可移植性层或“VFS” - 模块位于 SQLite 实现堆栈底部 提供跨操作系统的可移植性。 VFS是Virtual File…

5560.树的直径

蛮不错的一道题目&#xff0c;你要利用树的性质分析出&#xff0c;你只需要维护上一次的树的直径的两个端点就好了 #include<iostream>using namespace std; using ll long long; using pii pair<int,int>; const int N 6e510; const int inf 0x3f3f3f3f; cons…

算法:树形dp(树状dp)

文章目录 一、树形DP的概念1.基本概念2.解题步骤3.树形DP数据结构 二、典型例题1.LeetCode&#xff1a;337. 打家劫舍 III1.1、定义状态转移方程1.2、参考代码 2.ACWing&#xff1a;285. 没有上司的舞会1.1、定义状态转移方程1.2、拓扑排序参考代码1.3、dfs后序遍历参考代码 一…

MySQL复制拓扑4

文章目录 主要内容一.启用GUID并配置循环复制1.其中&#xff0c;UUID用来唯一标识每一个服务器&#xff0c;事务的编号记录了在该服务器上执行的事务的顺序。使用SELECT server_uuid\G命令可以查看服务器的UUID&#xff0c;sever1的UUID值显示如下&#xff1a;代码如下&#xf…

Vue3_2024_7天【回顾上篇watch常见的后两种场景】

随笔&#xff1a;这年头工作不好找咯&#xff0c;大家有学历提升的赶快了&#xff0c;还有外出人多注意身体&#xff0c;没错我在深圳这边阳了&#xff0c;真的绝啊&#xff0c;最尴尬的还给朋友传染了&#xff01;&#xff01;&#xff01; 之前三种的监听情况&#xff0c;监听…

文本识别 OCR 解决方案

Capture2Text 便携式 OCR 工具 Capture2Text 能够使用键盘快捷键快速对屏幕的一部分进行 OCR。 默认情况下&#xff0c;生成的文本将保存到剪贴板。支持中文、英文、法文、德文、日文、韩文、俄文、西班牙文等 90 多种语言。 Capture2Text 是便携式工具&#xff0c;不需要安装…

快速了解FastAPI与Uvicorn是什么?

概念 什么是Uvicorn Python Uvicorn 是一个快速的 ASGI&#xff08;Asynchronous Server Gateway Interface&#xff09;服务器&#xff0c;用于构建异步 Web 服务。它基于 asyncio 库&#xff0c;支持高性能的异步请求处理&#xff0c;适用于各种类型的 Web 应用程序。 Uvi…

SEO超级外链工具源码

源码简介 超级外链工具&#xff0c;是一款在线全自动化发外链的推广工具。使用本工具可免费为网站在线批量增加外链&#xff0c;大大提高外链发布工作效率&#xff0c;是广大草根站长们必备的站长工具。 搭建环境 PHP 5.6 安装教程 上传源码压缩包到网站目录并解压即可 首…

Linux安装最新版Docker完整教程

参考官网地址&#xff1a;Install Docker Engine on CentOS | Docker Docs 一、安装前准备工作 1.1 查看服务器系统版本以及内核版本 cat /etc/redhat-release1.2 查看服务器内核版本 uname -r这里我们使用的是CentOS 7.6 系统&#xff0c;内核版本为3.10 1.3 安装依赖包 …

【数据结构(二)】顺序表与ArrayList

❣博主主页: 33的博客❣ ▶文章专栏分类:数据结构◀ &#x1f69a;我的代码仓库: 33的代码仓库&#x1f69a; &#x1faf5;&#x1faf5;&#x1faf5;关注我带你学更多数据结构知识 目录 1.前言2.定义IList接口3.MyArraylist实现接口3.1定义成员变量与构造方法3.2添加元素3.3…

构建未来数字化世界的统一用户中心产品架构

随着数字化时代的到来&#xff0c;用户数据管理变得愈发复杂&#xff0c;各类应用和服务的涌现使得用户信息分散存储&#xff0c;导致了数据孤岛和体验碎片化的问题。在这样的背景下&#xff0c;统一用户中心产品架构应运而生&#xff0c;为构建数字化世界提供了全新的解决方案…

S7-200 SMART 应用第003期-数字量输入模块接线

概述 S7-200 SMART作为西门子的一款高性价比PLC产品,很多工控电气工程师在选型和电路图设计时,对模块接线并不是非常清楚,为了使大家更好的了解和掌握该部分,本文从CPU本体、数字量输入(DI)、数字量输出(DQ)向大家详细介绍S7-200 SMART 详细的接线和注意事项。 不同型号C…

2023年度总结:允许迷茫,破除迷茫;专注自身,把握当下

0、前言 &#x1f4dc;为什么24年已经过了几个月&#xff0c;才提笔写这年度总结呢&#xff1f;毫不羞愧直问我的内心&#xff0c;其实就是懒罢了。直到前几天朋友看到了我去年写的总结&#xff0c;我自己点进那篇总结&#xff0c;完完整整的看了一遍&#xff0c;又翻看我23年…

ideaSSM 网上选课管理系统bootstrap开发mysql数据库web结构java编程计算机网页源码maven项目

一、源码特点 idea 开发 SSM 网上选课管理系统是一套完善的信息管理系统&#xff0c;结合SSM框架和bootstrap完成本系统&#xff0c;对理解JSP java编程开发语言有帮助系统采用SSM框架&#xff08;MVC模式开发&#xff09;&#xff0c;系统具有完整的源代码和数据库&#xff…