收起左侧

当 AI 有了“身体”,幻想将成为现实!在 NAS 上部署数字生命,超详细指南!

0
回复
469
查看
[ 复制链接 ]

125

主题

14

回帖

0

牛值

fnOS系统内测组

社区上线纪念勋章fnOS1.0上线纪念勋章EVO2产品纪念

数字生命计划 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 虚拟角色)

使用体验:⭐⭐⭐⭐(完成度高,配置相对简单)

部署难易:⭐⭐⭐(一般)︎

收藏
送赞
分享
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则