OpenAvatarChat数字人项目结构分析
Open Avataar Chat 项目结构分析
完整实现逻辑拆解
要理解OpenAvatarChat数字人项目的完整实现逻辑,需从目录结构、核心模块功能、组件交互流程三个维度展开,结合“用户与数字人语音交互”的具体场景,梳理模块间的配合关系。
用户视频(Video Input)→ 提取音频(Mio Audio)→ 得到Human Audio(视频中的语音)和Camera(面部图像);
用户音频(Audio Input)→ 检测有效语音(VAD)→ 得到Human Audio(有效语音);
Human Audio → 转文本(ASR)→ 得到Human Text(用户文本);
Human Text → 生成回复(LLM)→ 得到Avatar Text(数字人回复文本);
Avatar Text → 转语音(TTS)→ 得到Avatar Audio(数字人语音);
Camera + Human Audio → 唇同步处理(S2S)→ 同步信号输入Avatar Audio;
Avatar Audio → 生成数字人(Avatar)→ 输出Video Output(数字人视频)和Audio Output(数字人语音)。
一、先明确:项目核心目标
OpenAvatarChat的核心是实现“带3D视觉交互的智能语音数字人”,即:
用户通过语音与数字人对话(输入);
数字人通过3D形象(端侧渲染)展示表情/动作(输出);
数字人通过语音回复(输出);
支持实时交互(低延迟)。
二、项目目录结构与核心模块功能
根据提供的OpenAvatarChat-main目录,关键文件夹的功能如下:
文件夹 | 核心功能 | 关键文件/内容 |
---|---|---|
config/ | 场景配置中心:定义不同聊天场景的组件依赖、参数(如API密钥、模型路径) | chat_with_gs.yaml(带3D渲染的语音聊天)、chat_with_minicpm.yaml(纯文本聊天)等 |
src/ | 后端核心逻辑:协调组件调用、处理API请求、实现业务流程 | main.py(后端入口)、handlers/(API接口处理)、services/(业务逻辑封装)、client/(前端交互 handler) |
models/ | 本地模型存储:存放预训练的机器学习模型(如VAD、ASR) | silero_vad.onnx(Silero VAD模型)、sensevoice.onnx(SenseVoice ASR模型) |
assets/ | 静态资源存储:存放3D资产、图片、音频等前端资源 | 3d_assets/(高斯波溅.splat文件)、images/(数字人头像)、audio/(提示音) |
build/ | 前端构建产物:存放编译后的前端代码(如HTML、JS、CSS),可直接运行 | index.html(前端入口)、bundle.js(前端逻辑打包)、style.css(样式) |
scripts/ | 工具脚本:用于构建、启动项目(如前端打包、后端启动) | build_and_run.sh(一键构建并启动)、install_deps.sh(安装依赖) |
三、核心模块交互流程(以“语音聊天+3D渲染”场景为例)
以config/chat_with_gs.yaml(带3D高斯波溅渲染的语音聊天)为例,梳理用户发送语音→数字人回复的完整流程,说明模块间的配合关系:
高斯波溅(Gaussian Splatting)是一种实时3D重建与渲染技术,核心用于生成高质量、高细节的3D场景/物体模型,尤其适合从图像或视频中重建真实感强的3D资产(如数字人、场景)
-
前端交互:
用户触发语音输入(build/ + src/client/)
触发:用户打开build/index.html(前端页面),点击“麦克风”按钮,开始说话。
前端逻辑:build/bundle.js(前端打包代码)通过navigator.mediaDevices.getUserMedia获取用户语音流,调用后端/api/voice/start接口(定义在src/handlers/voice_handler.py),发送语音流。 -
语音处理:VAD检测+ASR转文本(src/services/ + models/ + config/)
VAD检测:后端src/services/voice_service.py读取config/chat_with_gs.yaml中的vad_model_path(如models/silero_vad.onnx),加载Silero VAD模型,检测语音流中的“语音段”(区分“说话”与“沉默”)。当检测到用户停止说话时,截取有效语音段。
ASR转文本:有效语音段传给src/services/asr_service.py,读取config中的asr_api_key(如百度SenseVoice的密钥),调用SenseVoice ASR服务(或本地模型models/sensevoice.onnx),将语音转为文本(如“今天天气怎么样?”)。 -
对话生成:LLM生成回复(src/services/ + config/)
LLM调用:ASR得到的文本传给src/services/llm_service.py,读取config中的llm_api_base(如https://api.openai.com/v1)和llm_api_key(OpenAI密钥),调用OpenAI兼容模型(如GPT-3.5),生成回复文本(如“今天北京晴,气温25℃~32℃。”)。 -
语音合成:TTS转语音(src/services/ + config/)
TTS调用:回复文本传给src/services/tts_service.py,读取config中的tts_api_key(如百度CosyVoice的密钥),调用CosyVoice TTS服务,将文本转为语音(如女声回复“今天北京晴……”)。 -
3D渲染:端侧展示数字人动画(src/client/ + assets/ + build/)
3D资产加载:后端将回复文本、语音数据返回给前端(build/bundle.js),前端调用src/client/rendering_handler.py(封装LAM项目的端侧渲染逻辑),加载assets/3d_assets/中的高斯波溅资产(如digital_human.splat)。
同步交互:前端将3D资产渲染到build/index.html的canvas标签中,实现数字人的表情/动作同步(如嘴唇随语音动),同时播放TTS生成的语音。
流程总结:模块配合逻辑图如下
组件名称 | 英文全称 | 核心功能 | 常用例子 | 项目中的位置/配置方式 |
---|---|---|---|---|
VAD模型 | Voice Activity Detection | 识别音频中的“语音段”(用户说话)与“沉默段”(用户停止说话),触发后续流程 | Silero VAD(本地模型)、WebRTC VAD(开源库)、科大讯飞VAD(云服务) | 存放于models/ 文件夹(如silero_vad.onnx );配置文件(如chat_with_gs.yaml )中通过vad_model_path 指定模型路径 |
ASR服务 | Automatic Speech Recognition | 将用户语音(音频)转换为文本,是“语音交互”的核心桥梁(LLM无法直接处理音频) | 百度SenseVoice(云服务/本地模型)、OpenAI Whisper(本地模型)、阿里云ASR(云服务) | 配置文件中通过asr_service 指定服务类型(如sensevoice ),或通过asr_model_path 指定本地模型路径(如models/sensevoice.onnx ) |
LLM模型 | Large Language Model | 接收ASR转换后的文本(用户问题),生成符合场景的智能回复(数字人的“大脑”) | GPT-3.5/4(OpenAI云服务)、Minicpm(国产本地模型)、Qwen(阿里本地模型) | 配置文件中通过llm_type 指定模型类型(如openai_compatible ),或通过llm_model_path 指定本地模型路径(如models/minicpm-2b-chat.pt ) |
TTS服务 | Text-to-Speech | 将LLM生成的文本回复转换为语音,实现“语音交互”的闭环 | 百度CosyVoice(云服务)、微软Edge TTS(云服务)、OpenAI Text-to-Speech(云服务) | 配置文件中通过tts_service 指定服务类型(如cosyvoice ),或通过tts_model_path 指定本地模型路径(如models/cosyvoice.onnx ) |
3D资产 | 3D Assets | 存储数字人的3D视觉素材(如几何形状、纹理、动画),实现“3D视觉交互” | 高斯波溅模型(.splat ,如LAM项目资产)、骨骼动画模型(.fbx ,传统3D模型) | 存放于assets/3d_assets/ 文件夹(如digital_human.splat );配置文件中通过3d_asset.path 指定资产路径 |
具体模块分析
src文件夹
在Python项目中,src是“Source Code(源代码)”的缩写,用来集中存放项目的核心业务代码。它的存在是为了把“代码逻辑”和根目录的“配置文件、文档、脚本”分开,让项目结构更清晰(比如不会把config.yaml(配置)和chat_engine.py(核心逻辑)放在同一个文件夹里)。
src文件夹的整体作用(后端:负责业务逻辑处理(如聊天流程、角色管理、LLM调用)、数据存储(如角色配置、对话历史)、API接口暴露(供前端调用)。
)
src下各子文件夹/文件的详细说明
chat_engine聊天引擎(核心中的核心)
作用:负责处理对话的全流程,比如“理解用户消息”、“维护对话上下文”、“生成AI角色的回复”。可以把它看作是“AI角色的大脑”——所有和“聊天”相关的核心逻辑都在这里。
engine_utils引擎工具库(辅助核心逻辑)
作用:存放通用的辅助函数/类,供其他模块(比如chat_engine、service)调用,避免重复代码。可以把它看作是“工具箱”——所有模块都能用里面的工具。
handlers:请求处理器(连接前端与后端)
作用:负责接收前端的请求(比如用户在网页上发送的消息),解析请求参数,调用核心逻辑(chat_engine)处理,最后返回结果给前端。可以把它看作是“前台接待员”——用户的所有请求都要经过它。
service:业务服务层(连接处理器与数据)
作用:负责封装业务逻辑(比如和数据库交互、角色管理、知识库查询),供handlers调用。可以把它看作是“后台管理员”——处理一些“幕后工作”,比如保存角色信息、查询知识库。
third_party:第三方集成(连接外部服务)
作用:负责集成第三方服务或库(比如OpenAI API、Anthropic API、语音转文字服务),供chat_engine调用。可以把它看作是“外接设备”——比如AI角色需要“说话”(生成回复),就需要外接“OpenAI的大脑”(GPT-4)。
init_.py:包初始化文件(Python的“标识”)
作用:这是Python的包(Package)标识文件——只要文件夹里有__init__.py,Python就会把这个文件夹当作一个“包”(可以理解为“可引用的文件夹”)。
Config 文件夹
文件夹的核心功能
config文件夹是项目的配置中心,其设计目标是分离“可变参数”与“核心代码”,通过场景化的YAML配置文件,实现以下关键功能:
集中管理动态参数:将模型路径、API密钥、服务端点等可变参数从代码中提取,避免硬编码(如api_key不会写死在main.py中)。
支持场景快速切换:每个YAML文件对应一个具体的聊天场景(如“纯文本聊天”“语音+3D渲染聊天”),通过修改启动命令中的配置文件路径(如–config chat_with_gs.yaml),即可切换服务功能。
管理敏感信息:敏感信息(如API密钥)以占位符形式存在(如{{OPENAI_API_KEY}}),部署时替换为真实值,避免提交到代码仓库。
config文件夹内各YAML文件的作用(以chat_with_gs.yaml为例)
所有YAML文件均遵循chat_with_[场景特征].yaml的命名规则,每个文件对应一个具体的聊天场景,以下是对常见文件的解析(结合文件名与之前的聊天内容):
核心场景:带3D高斯波溅渲染的语音聊天(端侧渲染+语音交互)。
关键配置:
3D渲染:使用LAM项目的端侧渲染客户端(客户端/h5_rendering_client/client_handler_lam),渲染高斯波溅资产(如3D avatar)。
语音处理:
VAD(语音活动检测):Silero VAD(本地GPU运行,路径vad/silerovad/silero_vad.onnx),检测用户语音段。
ASR(自动语音识别):SenseVoice(百度百炼服务,需配置api_key),将语音转为文本。
对话生成:OpenAI兼容模型(如GPT-3.5、Qwen),通过API调用生成回复文本。
语音合成:百度百炼CosyVoice(需配置api_key),将回复文本转为语音。
适用场景:需要3D视觉交互的语音聊天(如智能客服、虚拟助手)。
assets文件夹
功能描述:静态资源仓库:存储前端/数字人所需的非代码类资源(不参与代码编译,直接引用)。
关键内容:3d_assets/:3D数字人资产(如高斯波溅模型.splat、传统3D模型.fbx);- images/:数字人头像、图标、背景图;- audio/:提示音(如“请说话”)、默认语音素材。
在项目中的作用:提供数字人视觉/听觉素材(如3D模型用于渲染、图片用于头像展示),是前端交互的基础。
build文件夹
功能描述:前端构建产物:存储编译后的前端代码(通过webpack、Vite等工具打包生成)。
关键内容:index.html:前端入口页面(用户访问的首页);
bundle.js:打包后的前端逻辑代码(包含3D渲染、语音交互等功能);
style.css:前端样式文件。
在项目中的作用:直接运行index.html即可访问应用(无需重新编译),是用户与数字人交互的前端界面载体。
docs文件夹
功能描述:项目文档:存储项目的使用说明、API文档、部署指南等。
关键内容:api_docs.md:后端API接口说明(如/api/voice/start接口的参数/返回值);
deploy_guide.md:部署步骤(如Docker部署、云服务器部署);
faq.md:常见问题解答。
在项目中的作用:帮助开发者快速理解项目、调试问题,是项目的说明书。
models文件夹
功能描述:机器学习模型仓库:存储本地运行的机器学习模型(无需调用云服务,离线处理)。
关键内容:silero_vad.onnx:Silero VAD模型(语音活动检测);
sensevoice.onnx:SenseVoice ASR模型(语音转文本);-
minicpm-2b-chat.pt:Minicpm LLM模型(本地对话生成)。
在项目中的作用:支持离线功能(如本地语音检测、本地ASR),降低对云服务的依赖(节省成本、减少延迟)。
resource文件夹
功能描述:通用资源仓库:存储项目通用的配置模板、语言包、字体等。
关键内容:config_templates/:配置文件模板(如chat_with_gs_template.yaml,用于快速生成新场景配置);
i18n/:语言包(如zh-CN.json、en-US.json,支持多语言);
fonts/:数字人对话的字体文件。
在项目中的作用:提供项目通用资源,简化配置、支持多语言等扩展功能。
scripts文件夹
功能描述:工具脚本仓库:存储自动化脚本(简化开发/部署流程)。
关键内容:build_and_run.sh:一键构建前端+启动后端(适合快速测试);
install_deps.sh:安装项目依赖(Python/前端依赖);
deploy_docker.sh:Docker部署脚本(生成镜像并运行容器)。
在项目中的作用:减少手动操作,提高开发/部署效率(如build_and_run.sh可快速启动项目)。
ssl_certs文件夹
功能描述:SSL证书仓库:存储HTTPS证书(用于加密数据传输)。
关键内容: server.crt:SSL证书文件;
server.key:SSL私钥文件。
在项目中的作用:支持HTTPS部署(如线上环境),确保用户语音/文本数据传输的安全性。
tests文件夹
功能描述:测试用例仓库:存储单元测试/集成测试代码(确保代码质量)。
关键内容: test_vad.py:VAD模型单元测试(验证语音检测是否正确);
test_asr.py:ASR服务集成测试(验证语音转文本是否准确);
test_llm.py:LLM模型测试(验证回复是否合理)。
在项目中的作用:确保组件功能正确(如VAD能正确检测语音段),避免代码改动引入bug。
其他文件
文件名称 | 功能描述 |
---|---|
.dockerignore | Docker忽略文件:指定构建Docker镜像时不包含的文件/目录(如临时文件、本地缓存),减少镜像体积。 |
.gitattributes | Git属性文件:定义Git对特定文件的处理方式(如换行符转换、二进制文件标识),统一团队开发环境。 |
.gitignore | Git忽略文件:指定Git不跟踪的文件/目录(如build/ 、node_modules/ ),避免提交冗余或敏感文件。 |
.gitmodules | Git子模块配置文件:记录项目依赖的子模块(如引用其他Git仓库的代码)的路径和URL,方便同步子模块。 |
build_and_run.sh | 一键构建与启动脚本:自动化执行前端构建(如webpack打包)和后端启动命令,简化开发测试流程(只需运行此脚本即可启动项目)。 |
Dockerfile | Docker容器化配置文件:定义Docker镜像的构建步骤(如基础镜像选择、依赖安装、代码拷贝、启动命令),支持项目的容器化部署。 |
install.py | 项目安装脚本:自动安装项目所需的依赖(包括Python包如openai 、pyyaml ,以及前端依赖如webpack ),简化环境搭建。 |
LICENSE | 许可证文件:声明项目的开源许可证类型(如MIT、Apache 2.0),规定用户使用、修改、分发项目的权利和义务。 |
pyproject.toml | Python项目配置文件:定义项目的元数据(如名称、版本、作者)、依赖项(如requests 、torch )以及构建工具配置(如使用poetry或setuptools)。 |
README.md | 项目说明文件(英文):包含项目简介、快速启动指南、目录结构说明、贡献指南等,是用户(尤其是英文用户)了解项目的入口。 |
readme_cn.md | 中文说明文件:README.md 的中文版本,内容与英文文档一致,适合国内开发者阅读,降低语言障碍。 |
setup.cfg | Python安装配置文件:配合setuptools 使用,定义项目的安装规则(如包结构、脚本入口、 metadata ),用于生成Python安装包(如.whl 文件)。 |
具体实现组织整个项目的流程图如下