修复 Pipecat 实时链路并补齐网页测试

This commit is contained in:
ylhan
2026-09-16 09:50:38 +08:00
parent 74a30b11d7
commit c3d2c7f3a8
6 changed files with 296 additions and 100 deletions
+23 -12
View File
@@ -61,7 +61,7 @@ DoA 读取和网络桥接,不跑任何推理。
│ ├── memory/ 接口 + SQLite 实现
│ ├── identity/ 接口 + 手动切换实现
│ ├── voice/ STT / TTS(本地 + 远端两种后端)
│ └── tests/ 4 个测试,共 88 项断言
│ └── tests/ 5 个测试脚本(含传输适配层回归)
├── models -> ~/ai_companion_bench/models 软链,未重复占用
└── .venv/ 608MB(Python 3.12)
@@ -100,7 +100,7 @@ TTS 的线程扩展方向又和 STT 相反(越多越快)。
cd ~/tts-qwen && setsid nohup .venv/bin/python tts_server.py --port 18040 \
> logs/tts_service.log 2>&1 < /dev/null &
# 2. (可选)Pipecat 传输层服务端 —— 实验状态,帧路由未通
# 2. Pipecat 实时服务端(含 /client/ 网页测试入口)
cd ~/ai-companion && setsid nohup .venv/bin/python services/bot_server.py \
--host 0.0.0.0 --port 7860 > logs/bot_server.log 2>&1 < /dev/null &
@@ -160,28 +160,39 @@ rsync -az --delete --exclude '__pycache__' --exclude '*.pyc' \
(vLLM 0.28 拉上来的);源码编译要从 GitHub 拉依赖,而这台机器下
GitHub release 会断连。
## 当前卡点:Pipecat 帧路由未通
## Pipecat 实时链路状态
2026-09-15 的传输层实验:**传输层跑通(信令/ICE/data channel/双向媒体轨),
但帧送不进自定义处理器**——`process_frame` 调用次数为 0,引擎从未运行。
2026-09-15 已闭环:`PipelineWorker` 自动启动,音频帧进入自定义处理器,完整
STT → DeepSeek → Qwen3-TTS → WebRTC 返回非静音语音。保留 RTVI 与 `/client/`
网页测试入口,并补齐 Playground 启动所需的 `/start`;架构确定采用
“Pipecat 管传输,自有引擎管语义”的 A 方案。
现象:连接全对、音轨协商成功、助手永远不说话,**日志里一条错误都没有**。
原帧路由问题的根因是 NLTK `punkt_tab` 首次运行下载拖住 Pipecat 预热,导致
20 秒 setup timeout;不是框架不支持自定义处理器。服务器已把数据预装到权限 700 的
`~/.local/share/ai-companion/nltk_data`,服务启动时会 fail-fast 检查。
这直接影响 A/B 架构方案(A:Pipecat 只做传输;B:按框架 service 模型重构)。
根因未定位。完整记录见 Obsidian 笔记库里的 `P0-Pipecat传输层实验报告.md`。
单次文件音频实测:源音频结束到客户端首个非静音约 5.8 秒;其中包含约 0.7 秒
VAD 等待,当前仍高于 P1 的 2 秒目标,需要后续单独优化。完整记录见 Obsidian
笔记库里的 `P0-Pipecat传输层实验报告.md`。
**注意** `services/bot_server.py` 里目前还带着 `[诊断]` 前缀的日志,
是留给下一轮排查用的,定位后应清理。
2026-09-16 通过 SSH 隧道打开 `http://localhost:7860/client/` 真人实测成功;补齐
Playground 使用的 `/start` 后,浏览器麦克风、RTVI、语音回复均正常,单轮服务端
指标约 3.0 秒。当前是 P1 调试模式:连接后持续上传并响应每段有效语音,尚未实现
P2 的本地唤醒和 20 秒连续对话窗口。
## 未做的事
- **没有常驻服务**:TTS 服务和助手都没有 systemd 开机自启(方案 §10 要求 P2 后做)
- **没接 Pipecat 管线**:引擎与传输解耦,接 WebRTC 时写薄适配层即可
- **网页 HTTPS 尚未启用**:`/client/` 已挂载且 HTTP 返回正常,但浏览器远程取麦克风
需要 HTTPS;Tailscale Serve 仍需在 tailnet 管理页启用
- **唤醒尚未实现**:当前网页连接后会持续上传麦克风并响应每段有效语音;正式方案
是在 N5095 本地做关键词检测,待机时音频不出网
- **设备侧代码不存在**:N5095 的外设桥(USB、WebRTC 客户端、串口)尚未开始
- **STT 没换**:仍是 2023 年的 Zipformer int8,中文识别率从未测过
- **记忆库在服务器上**,而人脸特征按方案必须留在设备端——将来做
"删除我的数据"要跨两台机器协调,这个数据边界问题需要单独想
- **代码仍在 note_sync 笔记仓库里**,未拆成独立仓库
- **代码与设计文档分属两个仓库**:实现位于 `ai-companion`,设计记录位于
`note_sync`,状态变更需同步更新两边
## 相关文档