- 数字人
- AI 应用
- 语音
- 多模态
- 音视频
- 后端
【免费下载链接】OpenAvatarChat
LAM(Lip and Motion / Audio-to-Expression)数字人驱动 Handler 是 OpenAvatarChat 中负责"端侧渲染数字人表情"的核心模块:它接收 TTS 合成或任何来源的音频流,通过 wav2vec2 特征提取器与 LAM_audio2exp 流式模型推理,实时输出 52 维 ARKit 面部表情系数(含口型、眉毛、眼部动作),供 LAM 端侧渲染客户端驱动 Gaussian Splatting 数字人形象。读完本文,你将掌握该 Handler 的完整模型依赖与一键/手动下载流程、源码级的加载与流式推理原理、以及config/chat_with_lam.yaml中 LAM_Driver 的完整接线方式,能够独立完成从模型部署到数字人驱动的整条链路。
Handler 定位:语音如何变成表情
在 OpenAvatarChat 的 Handler 流水线中,avatar/lam/avatar_handler_lam_audio2expression是一个典型的Avatar(数字人驱动)类 Handler。它的职责非常聚焦:消费上游传入的数字人音频流(ChatDataType.AVATAR_AUDIO),产出数字人动作数据流(ChatDataType.AVATAR_MOTION_DATA),其中动作数据的核心是一个名为arkit_face的 1×52 表情向量流。这套机制由 handler 源码 中的HandlerAvatarLAM类实现,其输入/输出定义如下:
- 输入:
AVATAR_AUDIO,消费模式为ChatDataConsumeMode.ONCE(一次性消费,不保留历史); - 输出:
AVATAR_MOTION_DATA,数据捆绑包(DataBundle)中包含两个条目:arkit_face:shape 为[1, 52]、采样率 30 Hz、时间轴 0、通道轴 1,通道名来自 arkit_face_channels.txt(如jawOpen、mouthSmileLeft、eyeBlinkLeft、browInnerUp等 52 个标准 ARKit 面部通道);avatar_audio:1 声道、采样率 24 kHz 的音频条目,与表情帧对齐输出。
这意味着 Handler 输出的是一帧一帧的 ARKit 表情系数(每 1/30 秒一帧),客户端拿到后可直接映射到数字人面部的 blendshape。整个推理不依赖 GPU 渲染——渲染在端侧(LAM 客户端)完成,这是该方案的架构特点。
依赖模型:两个模型、两条下载路径
LAM Handler 的运行依赖两个模型,二者缺一不可:
| 模型 | 作用 | 仓库内落盘路径 |
|---|---|---|
wav2vec2-base-960h | 预训练语音特征提取器(backbone encoder),将原始音频转为语义/声学特征 | models/wav2vec2-base-960h |
LAM_audio2exp_streaming | LAM 流式音频→表情(Audio2Expression)推理权重 | models/LAM_audio2exp/ |
wav2vec2 特征提取器与 FlashHead 等其他 Avatar Handler 共享,因此如果之前已下载过,脚本会跳过重复克隆。LAM_audio2exp 则是本 Handler 专属的流式表情模型,下载后解压得到pretrained_models/lam_audio2exp_streaming.tar等文件,供推理引擎加载。
一键下载(推荐)
文档给出的标准做法是使用仓库统一的模型下载脚本:
# 默认源(脚本对 lam 会优先选择 ModelScope 镜像) uv run scripts/download_models.py --handler lam # 国内用户显式指定 ModelScope 源 uv run scripts/download_models.py --handler lam --source modelscope该命令对应的实现位于 scripts/download_models.py 的download_lam()函数。从源码可以看到脚本会先检查目标目录是否已存在(wav2vec2-base-960h已存在则跳过;LAM_audio2exp存在pretrained_models/或config.yaml则跳过),再分别执行克隆/下载与tar解压,并对 H 参数的--handler lam做了注册(MODULE_TO_HANDLER中avatar/lam → lam)。指定--source modelscope时,脚本使用国内 ModelScope 镜像地址,网络环境更友好。
手动下载(离线/自定义环境)
如果希望绕过脚本自行下载(例如断网环境拷贝、或想固定某一模型版本),文档提供了等价的手动流程。两个模型分别处理:
1. wav2vec2-base-960h(语音特征提取器)
# HuggingFace 源 git clone --depth 1 https://huggingface.co/facebook/wav2vec2-base-960h ./models/wav2vec2-base-960h # ModelScope 源(国内推荐) git clone --depth 1 https://www.modelscope.cn/AI-ModelScope/wav2vec2-base-960h.git ./models/wav2vec2-base-960h2. LAM_audio2exp(流式表情推理权重)
# HuggingFace 源 wget https://huggingface.co/3DAIGC/LAM_audio2exp/resolve/main/LAM_audio2exp_streaming.tar -P ./models/LAM_audio2exp/ tar -xzvf ./models/LAM_audio2exp/LAM_audio2exp_streaming.tar -C ./models/LAM_audio2exp && rm ./models/LAM_audio2exp/LAM_audio2exp_streaming.tar # 阿里云 OSS 源(国内镜像) wget https://virutalbuy-public.oss-cn-hangzhou.aliyuncs.com/share/aigc3d/data/LAM/LAM_audio2exp_streaming.tar -P ./models/LAM_audio2exp/ tar -xzvf ./models/LAM_audio2exp/LAM_audio2exp_streaming.tar -C ./models/LAM_audio2exp && rm ./models/LAM_audio2exp/LAM_audio2exp_streaming.tar手动下载时务必保持目录名与配置默认值一致(models/wav2vec2-base-960h与models/LAM_audio2exp),否则需要在 Handler 配置 中覆盖feature_extractor_model_name或model_name。
Handler 配置项详解
Handler 的配置模型AvatarLAMConfig定义在 handler 源码 中,继承自HandlerBaseConfigModel:
| 配置项 | 默认值 | 说明 |
|---|---|---|
model_name | LAM_audio2exp | LAM 表情模型的目录名,实际权重路径为<model_root>/LAM_audio2exp/pretrained_models/lam_audio2exp_streaming.tar |
feature_extractor_model_name | wav2vec2-base-960h | 特征提取器目录名,加载为 backbone 的pretrained_encoder_path |
audio_sample_rate | 24000 | 推理音频采样率(Hz),同时决定音频切片长度与输出avatar_audio的采样率 |
在实际配置文件中,该 Handler 通常只需一行即可启用(其余参数走默认值):
LAM_Driver: module: avatar/lam/avatar_handler_lam_audio2expression注意:模型根目录由 Chat Engine 全局配置chat_engine.model_root(默认models)决定,加载流程 中通过DirectoryInfo.get_project_dir()拼接出最终绝对路径,并将LAM_Audio2Expression算法子模块目录临时加入sys.path后导入引擎。
源码级运行原理
模型加载与预热
load()阶段完成以下关键步骤(见 handler 源码):
- 将 handler 自带的
LAM_Audio2Expression算法包目录追加到sys.path,导入default_config_parser、default_setup与INFER引擎; - 通过
default_config_parser读取算法包内的configs/lam_audio2exp_config_streaming.py流式推理配置,并将模型权重路径、wav2vec2 预训练编码器路径与wav2vec2_config.json注入配置; - 构建
INFER推理对象并调用model.eval()切换到推理模式; - 读取 52 个 ARKit 通道名;
- 预热(warmup):向推理引擎送入 1 秒(
audio_sample_rate个采样点)的零音频执行一次流式推理,并打印耗时日志——这一步可显著降低首帧推理延迟。
会话与流式推理
每个会话通过create_context()创建独立的AvatarLAMContext,其中会初始化一个 1 秒长度的音频切片器(SliceContext,slice_size = audio_sample_rate * 1.0)。处理一条音频数据时(handle 方法):
- 首次收到音频时创建新的输出流(stream),命名为
lam_audio2expression且cancelable=True,以便打断; - 将输入音频按 1 秒切片送入队列,逐片调用
infer.infer_streaming_audio(audio, ssr, context)进行流式增量推理——上一片的隐状态(context_update)会作为下一片的context传入,实现跨切片的表情连续性; - 若这是数据流末尾(
is_last),先 flush 切片器残余数据,再补发一段 50 采样点的静音片段以确保推理完整收敛,随后将流标记为结束; - 每一帧推理结果中的
expression(52 维浮点数组)被打包为DataBundle:arkit_face作为主数据,同时附带对齐的avatar_audio切片与元信息(stream_key、可选的表情对应文本avatar_speech_text),通过streamer.stream_data(output, finish_stream=is_last)推送下游。
打断与取消
由于流支持取消,Handler 通过on_signal()响应STREAM_CANCEL信号(见 handler 源码):当关联流被取消时,从活跃流集合中移除该流,handle()循环会在下一片音频前检测到该流已失效,停止推理并重置推理上下文。这保证了用户在说话中途打断时,表情驱动能快速停止而非继续消耗算力。
依赖与运行环境
该 Handler 的第三方依赖声明在 pyproject.toml 中:addict(配置字典工具)、yapf、transformers(wav2vec2 推理)、termcolor,并要求 Python>=3.10, <3.13。
完整链路:配置、安装与启动
LAM 数字人方案的最小可用链路是"LAM 客户端 + VAD + ASR + LLM + 云 TTS + LAM 表情驱动",官方预置的 config/chat_with_lam.yaml 已经配好全部环节。其 Handler 接线核心如下:
chat_engine: model_root: "models" handler_configs: LamClient: # 端侧渲染客户端,选择形象资产 module: client/ws_lam_client/ws_lam_client_handler asset_path: "lam_samples/barbara.zip" # 预置形象之一 connection_ttl: 900 upstream_mode: 'ws' InterruptHandler: # 打断处理器 module: logic/interrupt/interrupt_handler SileroVad: # 本地 VAD 检测说话区间 module: vad/silerovad/vad_handler_silero speaking_threshold: 0.15 ... SenseVoice: # 本地 ASR 语音识别 enabled: True module: asr/sensevoice/asr_handler_sensevoice model_name: "iic/SenseVoiceSmall" CosyVoice: # 百炼云端 TTS enabled: True module: tts/bailian_tts/tts_handler_cosyvoice_bailian voice: "longxiaocheng" LLMOpenAICompatible: # 对话大模型 enabled: True module: llm/openai_compatible/llm_handler_openai_compatible model_name: "qwen-plus" api_url: "https://dashscope.aliyuncs.com/compatible-mode/v1" LAM_Driver: # 本文主角:语音→表情 module: avatar/lam/avatar_handler_lam_audio2expression该方案中只有 VAD 与 ASR 在本地 GPU 上运行,TTS 与 LLM 走云端百炼,因此对机器性能依赖很轻、可支持一机多路并发(详见 docs/getting-started/lam.md)。端侧形象由 LAM Client Handler 负责,仓库预置了barbara.zip、james.zip、status.zip、vfhq_case1.zip等多个示例形象(位于 lam_samples),也可通过 LAM 项目自行训练形象后替换asset_path。
按文档的快速开始顺序部署即可:
# 1. 安装依赖并注册本 Handler uv run install.py --config config/chat_with_lam.yaml # 2. 下载 LAM 依赖模型(wav2vec2 + LAM_audio2exp) uv run scripts/download_models.py --handler lam # 3. 启动服务 uv run src/demo.py --config config/chat_with_lam.yaml验证与排错要点
- 模型路径核对:启动前确认
models/wav2vec2-base-960h/与models/LAM_audio2exp/pretrained_models/lam_audio2exp_streaming.tar存在;启动日志中出现的LAM_Audio2Expression warmup finished in ... milliseconds.即表示模型加载与预热成功。 - 配置项命名:
AvatarLAMConfig中的三个可覆盖项分别对应model_name、feature_extractor_model_name、audio_sample_rate,若手动更换模型目录需同步调整。 - 打断不生效:确认
InterruptHandler已启用,且输入音频流的取消语义(cancelable=True)被上游正常传递,否则STREAM_CANCEL信号不会被分发到本 Handler。 - Python 版本:本 Handler 依赖包要求 Python 3.10–3.13 区间,使用
uv管理环境可避免版本冲突。
- 数字人
- AI 应用
- 语音
- 多模态
- 音视频
- 后端
【免费下载链接】OpenAvatarChat
相关推荐
如何快速实现Fay数字人面部表情实时驱动:从语音到表情的完整参数化方案
如何快速实现Fay数字人面部表情实时驱动:从语音到表情的完整参数化方案 Fay是一款开源数字人框架,集成了语言模型和数字角色,提供零售、助手和代理版本,适用于虚
3步掌握Fay数字人表情驱动:从语音到唇形动画的完整工作流
3步掌握Fay数字人表情驱动:从语音到唇形动画的完整工作流 Fay是一款开源数字人框架,集成了语言模型和数字角色,提供零售版、助手版和代理版,适用于虚拟导购、主
Fay数字人情感分析模型部署优化
Fay数字人情感分析模型部署优化 情感分析是Fay数字人框架实现自然交互的核心能力之一,直接影响虚拟角色对用户情绪的理解与回应质量。本文将从模型选型、性能优化到
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考