# DeepSeek 数字人助手 这是一个“语音提问 → 百度短语音识别极速版 → DeepSeek 回答 → 数字人口播”的 Vue 项目。数字人在待机时默认断开,避免持续占用云渲染交互资源;DeepSeek 返回答案后会自动连接并播报。 ## 项目结构 ```text src/ Vue 前端源码 src/assets/media/ 会随前端一起构建的运行时媒体 server/ 百度语音识别、DeepSeek 和日志服务 resources/reference/ 不参与构建的原始、参考素材 public/ 原样复制到发布目录的公共文件 dist/ 前端构建产物(不提交 Git) dist-server/ 服务端构建产物(不提交 Git) logs/ 本地问答日志(不提交 Git) ``` 所有视频统一存放在 `src/assets/media/`,当前运行时使用 `standby.mp4`,旧版未连接视频为 `disconnected.mp4`。音色样本和采访音频放在 `resources/reference/`,用途详见 `resources/README.md`。 ## 本地开发 ```bash corepack enable corepack yarn install --frozen-lockfile corepack yarn dev ``` 打开 `http://127.0.0.1:5173/` 后,浏览器会请求麦克风权限。允许后即可直接说话,无需点击提问按钮。页面在检测到用户停止说话2秒后,将16kHz单声道PCM录音提交给服务端,再由服务端调用百度短语音识别极速版;这套流程不依赖浏览器内置的 `SpeechRecognition` 服务。数字人播报结束后会继续监听下一句。DeepSeek 30 秒未返回会取消请求并自动销毁数字人 iframe。 成功问答会按日期保存到 `logs/conversation-YYYY-MM-DD.log`,其中包含 UTC 时间、用户语音转写文字与数字人回答。生产部署时该目录会映射到服务器的 `/home/shuziren/logs/`。 ## 本地构建与生产运行 要求 Node.js 18 或更高版本。首次拉取代码后执行: ```bash corepack enable corepack yarn install --frozen-lockfile corepack yarn build corepack yarn start ``` `build` 会同时生成 `dist/` 和 `dist-server/`。生产服务默认监听 `9000` 端口。 ## 发布到 Linux 服务器 项目包含独立 Node 生产服务,会同时提供网页、`/api/baidu/asr`、`/api/deepseek/chat` 和 `/healthz`,监听 `9000` 端口;不需要额外安装 Nginx 或 Node。 1. 将整个项目目录上传到服务器 `/home/shuziren/`。 2. 在服务器上进入该目录:`cd /home/shuziren` 3. 执行:`sh deploy.sh` 4. 直接访问服务:`http://服务器IP:9000/`;通过 Nginx HTTPS 子路径访问:`https://www.v8.中国/shuziren/` `deploy.sh` 会构建并启动 Docker 容器 `shuziren`,并等待健康检查通过。停止服务使用 `docker compose down`;查看日志使用 `docker compose logs -f`。 如果 Nginx 直接从 `/data/nginx/www/shuziren/` 提供静态页面,而不是把整个站点反向代理到 9000 端口,请使用: ```bash STATIC_DIRECTORY=/data/nginx/www/shuziren sh deploy.sh ``` 发布脚本会强制重建容器,并将容器中的最新 `dist` 同步到该 Nginx 静态目录,避免继续显示旧视频。 服务器需要安装 Docker Engine 和 Docker Compose v2,并放行 TCP `9000` 入站端口。服务端必须能够访问 `https://api.deepseek.com`。 ## 安全提示 根据当前项目要求,DeepSeek API Key 和百度语音应用密钥位于 `server/` 的服务端代码中,不会进入浏览器前端构建产物,但会包含在服务器镜像内。请勿将项目或镜像上传到公开位置;公网部署建议额外使用反向代理鉴权或 IP 白名单,避免 API 被滥用。