独立依赖

This commit is contained in:
xsl
2026-04-08 14:38:04 +08:00
parent 760cf864eb
commit 64c894b673
36 changed files with 431 additions and 337 deletions
+146
View File
@@ -0,0 +1,146 @@
# 部署说明
本文说明如何把「3D 数字人语音聊天」服务端部署到一台新机器(Linux / WSL / macOS 等类 Unix 环境)。**唯一需要能访问公网的依赖是 LLM API**;语音相关权重应放在项目内 `models/` 目录,不在运行时从公网拉取。
## 1. 环境与依赖
- **Python**:建议 3.12(与当前 `requirements.txt` 一致)。
- **系统工具**`openssl`(生成自签证书);可选 `ffmpeg`(若你后续扩展音视频流程)。
- **硬件**CPU 可运行;有 NVIDIA GPU 时 ASR 等会优先用 CUDA(无卡则回退 CPU,可能较慢)。
- **磁盘**`models/` 中 ASR + TTS 权重合计约 **1.2GB+**,请预留空间。
## 2. 获取代码与虚拟环境
```bash
git clone <你的仓库地址> product
cd product
python3 -m venv .venv
source .venv/bin/activate # Windows: .venv\Scripts\activate
pip install -U pip
pip install -r requirements.txt
```
说明:依赖里已包含 `huggingface_hub`(由其它包装带动)。若单独只为下载权重,也可 `pip install huggingface_hub`
## 3. 准备本地模型(`models/`
首次在一台**能访问 Hugging Face**的机器上执行(仅需一次,或把整份 `models/` 目录打包拷贝到离线机):
```bash
source .venv/bin/activate
python scripts/vendor_hf_models.py
```
该脚本会:
- 从已安装的 `silero-vad` 包复制 **`models/vad/silero_vad.jit`**
- 拉取 **ASR**`models/asr/SenseVoiceSmall/`
- 拉取 **TTSKokoro**`models/tts/Kokoro-82M/`(含 `voices/` 下各 `.pt` 音色)
若目标机无外网,可在有网机器上跑完上述命令后,**整体复制 `models/`** 到部署机同一路径(相对于项目根)。
仅补全 VAD、不拉 HF(需已 `pip install silero-vad`):
```bash
python scripts/vendor_hf_models.py --skip-hf
```
## 4. 配置环境变量(`.env`
```bash
cp .env.example .env
```
**必须非空**(见 `config.py` 校验):
| 变量 | 含义 |
|------|------|
| `LLM_API_KEY` | OpenAI 兼容接口的 API Key |
| `LLM_BASE_URL` | 例如 `https://api.deepseek.com/v1` |
| `LLM_MODEL` | 例如 `deepseek-chat` |
**HTTP 服务**(不要使用已废弃的 `WEBRTC_*`):
| 变量 | 含义 |
|------|------|
| `HTTP_HOST` | 监听地址,一般 `0.0.0.0` |
| `HTTP_PORT` | 端口,例如 `8080``8018` |
**HTTPS(推荐用于跨设备访问页面与麦克风)**
- 证书路径建议写**相对项目根**,便于迁移,例如:
- `SSL_CERTFILE=certs/dev-cert.pem`
- `SSL_KEYFILE=certs/dev-key.pem`
- 程序会把相对路径解析为项目根下的绝对路径。
**TTS 音色**`TTS_VOICE` 必须与 `models/tts/Kokoro-82M/voices/<名称>.pt` 一致(默认示例为 `zf_xiaoxiao`)。
完整字段说明见仓库根目录 [`.env.example`](../.env.example)。
## 5. 生成自签证书(可选但常需要)
在**项目根目录**执行:
```bash
bash scripts/gen-self-signed-cert.sh
```
生成 `certs/dev-cert.pem``certs/dev-key.pem`,并在 `.env` 中配置上一节的 `SSL_CERTFILE``SSL_KEYFILE`
默认证书主题为 `CN=localhost`。用局域网 IP 访问时浏览器可能提示证书与地址不符,属自签名常见情况,可在浏览器中选择继续访问;生产环境请改用正规 CA 或内网 PKI 签发的证书。
## 6. 启动服务
**开发 / 前台运行:**
```bash
source .venv/bin/activate
python main.py
```
或使用脚本(会读 `.env` 中的 `HTTP_HOST``HTTP_PORT`):
```bash
bash scripts/start-public.sh
```
**HTTPS**:当 `.env``SSL_CERTFILE``SSL_KEYFILE` 均有效且文件存在时,`main.py` 会通过 uvicorn 加载证书(与 `config` 中解析后的路径一致)。
启动后在本机浏览器访问:
- `http(s)://127.0.0.1:<HTTP_PORT>/`
- `http(s)://<服务器局域网IP>:<HTTP_PORT>/`(需防火墙放行该端口)
## 7. 防火墙与端口
确保部署机对客户端开放 **`HTTP_PORT`(TCP)**。若前面有云厂商安全组,需同步放行。
## 8. 目录与可移植性约定
- **项目根**:所有相对路径(SSL、`models/` 布局、`web/` 静态资源)均以**含有 `main.py``config.py` 的目录**为基准;启动时工作目录应为此目录。
- **可选**:环境变量 `VISUAL_CHAT_PYTHON` 可指向指定 Python 解释器(部分 `scripts/*.sh` 会优先使用)。
## 9. 验证
```bash
curl -s "http://127.0.0.1:${HTTP_PORT:-8080}/health" | head
```
或用仓库内脚本(需根据实际 URL 调整):
```bash
python scripts/qa_check.py --base-url "https://127.0.0.1:8080" --rounds 3
```
(若仅 HTTP,把 `base-url` 改成 `http://...`。)
## 10. 常见问题
- **`.env``LLM_*` 为空**:应用在加载 `config` 时会校验失败,请务必填写有效值。
- **ASR/TTS 不工作**:检查 `models/asr/SenseVoiceSmall/` 是否含 `configuration.json``models/tts/Kokoro-82M/` 是否含 `config.json`、权重 `.pth``voices/<TTS_VOICE>.pt`
- **麦克风在别的设备上不可用**:多数浏览器要求 **HTTPS** 与用户手势;请启用 HTTPS 并在页面内点击「连接语音通道」等操作。
- **旧变量名**`WEBRTC_HOST``WEBRTC_PORT``STUN_URL` 已废弃,请只使用 `HTTP_HOST``HTTP_PORT`
更细的语音/文本流水线时序见 [development-guide.md](development-guide.md)。