https://zhuanlan.zhihu.com/p/696337285
Reshape
13 人赞同了该文章
从去年开始,就感觉数字人在中国非常火:数字生命、直播带货、教育等等不一而足,大厂们也有自己的动作:
作为2019就做过2D数字人全管线的技术人员来说,很诧异数字人在2023重新火起来,因为从技术的角度,2D数字人技术并没有太多发展,我能想到的唯一解释就是,大语言模型作为“灵魂”火起来之后,需要一个“身体”来作为承载,大家自然就联想到了数字人。
五一假期不想出去人挤人,闲下来几天,正好可以把这个想法实现。
00:11 / 00:53
我构建了一个将 ASR(自动语音识别)、唇同步、TTS(文本转语音)和流媒体技术与 LLM 集成的系统,以实现一个能够实时交互的数字人。
系统:Windows 11 + WSL
硬件:4090(3090应该也能实时)+i9-13900K
在语音输入方面,我直接使用的Google WebKitGTK 的语音识别功能,参考:https://www.google.com/intl/en/chrome/demos/speech.html
在唇同步方面,我选择了 Wav2Lip。尽管近年来基于 NERF 的数字人(例如 ER-NERF)越来越受欢迎,它们利用 3D 先验知识并在实时场景中通常比 Wav2Lip 表现得更好,但我发现 Wav2Lip 的 2D 方法在输出质量上具有更高的稳定性。
对于 TTS(文本转语音)组件,我选择了 Bert-VITS2。这个项目的社区非常活跃,可能因为二次元比较多哈哈(+1),用一句老话来说就是:个个都是人才,说话又好听,我超喜欢在里面。最近似乎有更好的tts方案,比如:GitHub - RVC-Boss/GPT-SoVITS: 1 min voice data can also be used to train a good TTS model! (few shot voice cloning)
音频和视频流媒体对我来说是一个重大挑战,因为我以前没有相关经验。为了实现实时交互,我不能简单地将 Wav2Lip 的结果保存为视频然后使用 ffmpeg 流式传输,而是需要直接在内存中同步生成的音频和视频帧,然后进行流媒体传输。正在我毫无思路的时候,突然发现了这个项目:opencv_ffmpeg_streaming。它正是我所需要的:将 ffmpeg/avcodec 打包为 Python 接口。(窥探了下作者,是学物理的大佬,太强了)简单修改以后(把推单帧改成推batch),它完美地满足了我的需求,使我能够有效地流式传输神经网络推理结果。
在音频和视频帧的流媒体传输方面,我使用了 srs(简单实时服务器)Docker 来管理数据流。Python 服务器负责推理并将流发送到 srs Docker,然后它将该流转发到 OBS。最终,OBS 将流分发到各种终端设备。这一设置确保流媒体过程具有良好的稳健性和可扩展性,能够在不牺牲实时交互质量的前提下触达各种终端设备。
大语言模型我接的智谱(便宜+效果还行),但Web Search是我自己实现的。(吐槽一下,官网上说的Web Search用不了,问客服也回复不到点上)
Wav2Lip 的工作过程分为两个主要阶段。第一阶段是面部检测,从视频帧中提取面部区域。这部分通常最耗时,但可以通过预处理来完成。我们保存每个视频帧的面部检测结果,从而简化了实时处理。第二阶段是唇部合成,对提取的图像进行操作,使其唇部动作与音频输入相匹配。为了提高这一阶段的性能,我用 TensorRT 进行了加速。
TTS 组件直接在 GPU 上进行推理,这已经非常快。
为了进一步减少初始帧的延迟,我实施了一种方法,将 LLM 输出按逗号和句号分段。这样可以进行流式生成,有助于减少语音输出的延迟,确保更流畅、更具互动性的用户体验。
srs推拉流,我直接选择的最常见的rtmp:RTMP Deploy | SRS(本来想用WebRTC的,但折腾了下,在浏览器上播放不出来,maybe是令牌没配对?有编解码的大佬可以指点一下)
最近阿里的EMO和微软的VASA-1效果非常惊艳(可惜暂时没有开源),再加上GPT-5的来临,智能体全面融入我们的生活,到时候,我们的智能体交互的频率也许比与人类交互的频率还要高,是否人类与各种智能体的交互也需要一个全新的IM软件呢?
发布于 2024-05-07 13:29・IP 属地广东