数字生命计划 2(简称 DLP3D):
一个开源的实时框架,使大语言模型(LLM)能够通过富有表现力的 3D 虚拟角色栩栩如生地呈现出来。用户可以通过语音与角色自然对话,而角色会即时生成语音、全身动画及物理模拟,并直接在浏览器中进行同步展示。角色的外观(3D 模型)与个性(角色提示词)均可完全自定义,且可无缝适配任意大语言模型或文本转语音(TTS)服务。

技术架构:
- • Web应用:提供直观的图形界面,用于自定义和与3D虚拟角色交互。每个角色都是完全可配置的——包括3D模型、LLM、提示词和语音。与具身AI聊天就像按住麦克风按钮说话一样简单。系统不依赖本地资源,而是实时流式传输角色音频、面部表情和身体动作。实现了强大的运行时动画管道来接收、组织和播放流式数据,具有自适应动作混合、连接丢失恢复和网络健康估计等机制,以确保响应性和交互性。
- • Orchestrator:作为实时智能对话引擎,协调个性化的多模态AI交互工作流。它集成了自动语音识别(ASR)、大语言模型(LLM)、文本转语音(TTS)、情感分析、记忆管理和3D动画生成(Audio2Face & Speech2Motion)模块。设计时考虑了模块化和流式处理,支持多个AI服务提供商并管理整个对话生命周期。作为指挥者,Orchestrator将各种AI服务和算法组件无缝同步为统一、连贯的体验。
- • 后端与云服务:包括AI服务和Web后端。用户可以为LLM、TTS和ASR服务选择首选提供商。后端负责运行时的资产和数据库管理,为DLP3d生态系统中的用户认证、虚拟角色资源访问提供统一的API。
安装
由于需要下载比较多文件,下面给出整体的一个目录结构供参考
**─docker-compose.yml
**─configs
** **─nginx
** **─nginx.conf
**─data
** **─motion_database.db
** **─blendshapes_meta
** **─joints_meta
** **─mesh_glb
** **─motion_files
** **─restpose_npz
** **─rigids_meta
**─weights
**─unitalker_v0.4.0_base.onnx
来到项目地址(github.com/dlp3d-ai/dlp3d.ai),下载整个文件夹(或者只下载 nginx.conf ,按结构创建文件夹)

TIP:nginx.conf 文件
# ================== web_frontend HTTPS 18000 -> 3000 ==================
server {
listen 18000 ssl http2;
listen [::]:18000 ssl http2;
server_name localhost;
ssl_certificate /etc/ssl/localcerts/localhost.pem;
ssl_certificate_key /etc/ssl/localcerts/localhost-key.pem;
ssl_session_timeout 1d;
ssl_session_cache shared:SSL:10m;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
location / {
proxy_pass http://web_frontend:3000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Port $server_port;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}
# ================== web_backend HTTPS 18001 -> 18080 ==================
server {
listen 18001 ssl http2;
listen [::]:18001 ssl http2;
server_name localhost;
ssl_certificate /etc/ssl/localcerts/localhost.pem;
ssl_certificate_key /etc/ssl/localcerts/localhost-key.pem;
ssl_session_timeout 1d;
ssl_session_cache shared:SSL:10m;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
location / {
proxy_pass http://web_backend:18080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Port $server_port;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}
# ================== HTTPS 18002 -> 18081 ==================
server {
listen 18002 ssl http2;
listen [::]:18002 ssl http2;
server_name localhost;
ssl_certificate /etc/ssl/localcerts/localhost.pem;
ssl_certificate_key /etc/ssl/localcerts/localhost-key.pem;
ssl_session_timeout 1d;
ssl_session_cache shared:SSL:10m;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
location / {
proxy_pass http://orchestrator:18081;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Port $server_port;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}
还需要下载 docker-compose.yml 文件

TIP:docker-compose.yml 文件
services:
speech2motion:
image: dlp3d/speech2motion:latest
container_name: speech2motion
restart: unless-stopped
volumes:
- ./data:/workspace/speech2motion/data
networks:
- dlp3d_network
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:18084/health"]
interval: 10s
timeout: 5s
retries: 10
start_period: 20s
audio2face:
image: dlp3d/audio2face:latest
container_name: audio2face
restart: unless-stopped
volumes:
- ./weights:/workspace/audio2face/weights
networks:
- dlp3d_network
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:18083/health"]
interval: 10s
timeout: 5s
retries: 20
start_period: 40s
mongodb:
image: mongodb/mongodb-community-server:7.0-ubi8
container_name: mongodb
restart: unless-stopped
environment:
MONGODB_INITDB_ROOT_USERNAME: admin
MONGODB_INITDB_ROOT_PASSWORD: admin_password
ports:
- "27017:27017"
volumes:
- ./mongodb:/data/db
networks:
- dlp3d_network
healthcheck:
test: ["CMD", "mongosh", "--eval", "db.adminCommand('ping')"]
interval: 10s
timeout: 5s
retries: 10
start_period: 30s
web_backend:
image: dlp3d/web_backend:latest
container_name: web_backend
restart: unless-stopped
environment:
MONGODB_HOST: mongodb
MONGODB_PORT: 27017
MONGODB_USERNAME: web_user
MONGODB_PASSWORD: web_password
MONGODB_DATABASE: web_database
MONGODB_AUTH_DATABASE: web_database
MONGODB_ADMIN_USERNAME: admin
MONGODB_ADMIN_PASSWORD: admin_password
volumes:
- ./data:/workspace/web-backend/data
depends_on:
mongodb:
condition: service_healthy
networks:
- dlp3d_network
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:18080/health"]
interval: 10s
timeout: 5s
retries: 10
start_period: 20s
orchestrator:
image: dlp3d/orchestrator:latest
container_name: orchestrator
restart: unless-stopped
environment:
MONGODB_HOST: mongodb
MONGODB_PORT: 27017
MONGODB_MEMORY_DB: memory_database
MONGODB_MEMORY_USER: memory_user
MONGODB_MEMORY_PASSWORD: memory_password
MONGODB_WEB_DB: web_database
MONGODB_WEB_USER: web_user
MONGODB_WEB_PASSWORD: web_password
MONGODB_ADMIN_USERNAME: admin
MONGODB_ADMIN_PASSWORD: admin_password
A2F_WS_URL: ws://audio2face:18083/api/v1/streaming_audio2face/ws
S2M_WS_URL: ws://speech2motion:18084/api/v3/streaming_speech2motion/ws
BACKEND_URL: http://web_backend:18080/api/v1/motion_keywords
depends_on:
mongodb:
condition: service_healthy
speech2motion:
condition: service_healthy
audio2face:
condition: service_healthy
web_backend:
condition: service_healthy
networks:
- dlp3d_network
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:18081/health"]
interval: 10s
timeout: 5s
retries: 10
start_period: 20s
web_frontend:
image: dlp3d/web:latest
container_name: web_frontend
restart: unless-stopped
environment:
NEXT_APP_NAME: "dlp3d"
NEXT_PUBLIC_BACKEND_HOST: "127.0.0.1"
NEXT_PUBLIC_BACKEND_PORT: 18001
NEXT_PUBLIC_ORCHESTRATOR_HOST: "127.0.0.1"
NEXT_PUBLIC_ORCHESTRATOR_PORT: 18002
networks:
- dlp3d_network
depends_on:
- web_backend
- orchestrator
nginx:
image: dlp3d/web_proxy:latest
container_name: nginx_proxy
restart: unless-stopped
ports:
- "18000:18000"
- "18001:18001"
- "18002:18002"
networks:
- dlp3d_network
volumes:
- ./configs/nginx/nginx.conf:/etc/nginx/conf.d/default.conf:ro
depends_on:
- web_frontend
- orchestrator
- web_backend
networks:
dlp3d_network:
driver: bridge
创建文件夹,将 nginx.conf 和 docker-compose.yml 两个文件放里面

注意 nginx.conf 存放的结构

编辑 docker-compose.yml 文件, NEXT_PUBLIC_BACKEND_HOST 和 NEXT_PUBLIC_ORCHESTRATOR_HOST 两个参数,修改为当前 NAS 的 IP 地址

下面还需要下载 ONNX 模型文件和动作数据文件,打开链接(https://dlp3d.readthedocs.io/zh-cn/latest/getting_started/quick_start.html#md-data-preparation)

按最上面给的目录结构整理好文件

创建项目并启动,没问题的话是全部正常运行的

使用
浏览器中输入 https://NAS的IP:18000 就能看到界面,注意是 HTTPS 协议

需要先注册账号,再来登录(使用 Safari 浏览器好像有问题)

进入面板,整体功能设置还是很简单的,只是配置 API 会比较繁琐

功能介绍
鼠标按住,能 360° 旋转观察 3D 虚拟角色(比 live2d 模型,上限维度更高,看到细节更多了)

点击最上面“对话列表”,可以选择不同的虚拟角色

但因为默认角色都是固定的(模型,提示词,大语言模型,语音),所以需要修改的话需要创建一个新的

点击这个复制按钮就行

滑动到下面就能看到新创建的了(可以修改一下名称,避免混淆了)

默认自带的模型有 6 个(有资源的可以去映射目录添加试试),模型的整体精度还是比较高的

之前 Grok 虚拟角色 Ani 也有,切换出场会有不同的动作

提示词默认就行了,我这里就不改了(提示词不会随着模型切换改变,选择不同对话列表才能找到当前模型适配的提示词)

可以更换不同的场景

接下来就是要配置模型 API 来驱动虚拟角色了

大语言模型
对于国内用户,大语言模型提供商选择不多

下面使用 DeepSeek 作为对接演示

来到 DeepSeek 开放平台(platform.deepseek.com),没有账号的用邮箱注册就行

新用户好像也没送余额的,需要去**(自定义 1 块钱就行)

接下来就是创建 API key,名称随便填就行

将 key 复制出来(只会出现一次,不然只能删了再新建)

回到 DLP3D 页面,点击钥匙图标

将密钥填写进去就行了

点击下面的设置按钮

填写“deepseek-chat”

都设置完成就可以点击卡片,右上角有勾选就行了

接下来这几个都是一样配置,勾选 DeepSeek ,填写模型就行

语音
语音的话,分别需要配置识别和合成

下面使用“火山”作为演示

需要火山引擎提供的豆包语音(https://www.volcengine.com/product/voice-tech),没有账号的去注册

进入控制台(https://console.volcengine.com/speech),点击“创建应用”

填写应用名称和简介

勾选下面 3 个接入功能
语音合成大模型:语音合成大模型 字符版语音合成:语音合成流式语音识别:流式语音识别 通用-中文

首次使用会赠送免费额度

这样应用就创建完了

点击左侧“流式语音识别大模型”,选择前面创建的应用,就能看到需要的参数了

语音识别,点击“火山”旁边的钥匙

将 APP ID 和 Access Token 分别填到下面

语音合成,点击“火山”按钮(前面填了,这里就不用填了)

选择合成语音的音色

开始对话
全部配置完以后,就可以开始对话了

加载需要等一下下(之前我就是 DeepSeek 没**,一直卡在这里)

TIP:对话需要当前网页有麦克风权限

把这里的权限打开(已经打开还是提示,可以关闭之后再开)

都没有问题,就能看到显示“正常使用中”

按住麦克风按钮就可以对话了

虚拟角色说话,口型也有变化(延时还是有一点的,要等一下才会回复)

比较意思的是,左侧会有一个“好感度”

容器比较多,内存占用需求比较高

总结
随着 AI 技术大爆发, 可以预见 AI 陪伴将成为未来生活中不可或缺的一部分。试想拥有一个贴心的私人 AI 助手,不仅无聊的时候可以聊天,还能协助规划生活、提升工作效率。市面上也有越来越多类似的商业应用,当然完成度要比这个高很多,可是不能本地部署总是感觉不放心。
DLP3D 数字生命计划,是我目前体验过完成度最高的开源虚拟角色方案。很早之前就想部署了,不过网上找不到部署教程一直搁置,还好有认真看了一下官方提供的文档才部署成功。体验下来还是很不错的,打开网页就可以和角色进行对话聊天,而是也有简单动作互动。说实话我的预期值还是很高,出乎意料的基本功能也都达到了想要的效果。
当然目前还是有很多不足的地方,比如国内模型提供商太少,而且也不支持第三方 OpenAI 的接口;不能自定义上传模型和场景;角色姿势没有更加高级的自定义界面。但是我觉得已经很不错,强烈推荐有兴趣的小伙伴部署一个试试!
综合推荐:⭐⭐⭐⭐(免费开源,交互式 3D 虚拟角色)
使用体验:⭐⭐⭐⭐(完成度高,配置相对简单)
部署难易:⭐⭐⭐(一般)︎