
🎥 摄像头桥
让 DSH 会听、会看、会盯着你的锅。
对着电脑说话 → 本机转成文字 → 当成你这一轮的话送进会话 → 它回 → 朗读桥念出来。 摄像头一直开着,YOLO 认画面里有什么;模型拿不准时,自己看一张快照。
名字里的「桥」就是这个意思:麦克风和摄像头在电脑这边,说话和看东西在会话那边,中间靠它接起来。
它由几部分组成
| 是什么 | 干什么 | |
|---|---|---|
| ① DSH 插件(这个仓库) | 住在 DSH 里 | 右下角小卡片、设置页、四个工具、做饭模块 |
| ② 两个 Python worker | 本机子进程 | asr_worker.py 转写、yolo_worker.py 认物 |
| ③ 外部依赖 | 你自己装的 | ffmpeg 抓设备、Python 跑推理、模型文件 |
「念出来」不是它的事:出声是另一个独立插件
dsh-tts-bridge(朗读桥)。 本项目没有打包它,只在运行时调两个 HTTP 接口问「在不在念 / 停一下」。 不装也能用:听、看、认、做饭都正常,只是不出声。
需要什么
- DSH(DeepSeek Harness),带 Web 界面
- ffmpeg:抓麦克风、解视频流(装好加进
PATH,或在面板里填绝对路径) - Python 3.10+:跑两个 worker
- 模型(不随包分发,见下方「装法」第三步)
- 一块能用的摄像头 / 麦克风
想让它出声的话,再装 dsh-tts-bridge + 它的浏览器扩展。
适配 DSH 版本
这个插件跟着 DSH 走:作者这边跑的是最新版 DSH,最新版插件永远是给最新版 DSH 写的。 遇到「不适配」先升级 DSH 再试。
当前实测:插件 0.9.0-beta.1 ↔ DSH 桌面版 2026-11
装法
第一步:装插件
在 DSH 里(设置 → 插件 → 安装),或者直接说:
帮我装 C:\path\to\dsh-camera-bridge
装完重启一次 DSH,右下角会出现 🎥 摄像头桥 卡片,设置里多一页「摄像头桥」。
第二步:装 Python 依赖
<你的 python> -m pip install -r tools/requirements.txt
只想听、不看画面的话,可以不装 ultralytics(省一大坨 torch)——
但「眼睛」相关的自动识别会不可用,手动拍快照、你自己看图仍然能用。
第三步:放模型
| 东西 | 放哪儿 | 大小 |
|---|---|---|
| SenseVoice | <DSH_HOME>/camera-bridge/models/sense-voice/(model.int8.onnx + tokens.txt) |
~230 MB |
| YOLO-World | <DSH_HOME>/camera-bridge/models/yolov8s-worldv2.pt |
~25 MB |
| CLIP ViT-B/32 | 首次用开放词表时自动下载到 ~/.cache/clip(需联网) |
~338 MB |
放完点设置页的「跑一次自检」——它会直接告诉你缺哪一样、该放哪儿。
怎么用
右下角的小卡片
| 按钮 | 干什么 |
|---|---|
| 📷 | 开/关画面(面板里实时放 MJPEG) |
| 👁 | 开/关持续识别(YOLO 一直在跑) |
| 👀 | 开/关「盯着看」:自己判阶段,出事才开口 |
| 开始听 / 停止 | 麦克风开关(点了才会听) |
| 详情 | 选会话、看耗时、看日志 |
卡片整张按住就能拖,位置记得住。
设置 → 摄像头桥
| 区块 | 内容 |
|---|---|
| 配置 | 送到哪个会话、麦克风、摄像头、ffmpeg/python 路径 |
| 挂载的服务 | 长在摄像头下面的模块(目前是「做饭」) |
| 自检 | 缺什么、能不能跑,一眼看清 |
做饭
在「挂载的服务 → 做饭」里填想做什么菜(比如「番茄炒蛋」),点开始做:
- 摄像头开始盯
- 菜谱由模型查/编,用
recipe_import导进状态机 - 之后按步骤跟,到点或到状态就开口提醒
也可以纯语音:说「我想做番茄炒蛋」「帮我看着锅」,模型会自己调工具。
四个工具(模型自己用)
| 工具 | 作用 |
|---|---|
look_camera |
拍一张,返回 jpg 路径(模型再 read_image 真的去看) |
camera_state |
一句话摘要:画面里认出了什么 |
watch_camera |
开/关盯着看 |
recipe_import |
导入/查询/清空菜谱 |
配置
~/.dsh/camera-bridge.json(面板里改也行,改完即时生效):
| 键 | 默认 | 说明 |
|---|---|---|
micDevice |
空 | 麦克风;空 = 自动挑(会跳过虚拟声卡) |
videoDevice |
空 | 摄像头;空 = 自动挑 |
ffmpegPath |
空 | 空 = 自动找,找不到用 PATH |
pythonPath |
空 | 同上 |
silenceMs |
600 | 静音多久算说完。调小更快,容易把停顿切成两句(实测 400 时 250ms 词间停顿安全、500ms 会切) |
maxSpeechMs |
15000 | 单句上限 |
halfDuplex |
true | 朗读出声时不听(防自问自答) |
ttsBase |
/dsh-tts-bridge |
朗读服务的地址。改它就能换成别的本地 TTS,留空 = 不用 |
duplexPollMs |
200 | 多久问一次朗读服务在不在念 |
interruptRms |
0.08 | 抢话门槛 |
interruptMs |
400 | 抢话要持续多久才算(防回声误打断) |
autoSend |
true | 识别完自动送进会话 |
targetSession |
空 | 送到哪个会话 |
lookClasses |
一串英文 | 开放词表,改完下次识别就生效 |
lookHz |
2 | 每秒认几次 |
cookDish |
空 | 做饭模块里填的菜名 |
换掉朗读桥(用别的本地 TTS)
本项目默认对接朗读桥,但并不绑定它。 插件只用到朗读服务的两件事:
| 接口 | 方法 | 应返回 | 用途 |
|---|---|---|---|
<base>/status |
GET | {"playing": true, "waiting": 0} |
判断「现在在不在念」→ 决定要不要闭麦 |
<base>/stop |
POST | 任意(200 即可) | 抢话时把正在念的停掉 |
所以要换成任何本地 TTS(edge-tts / piper / Windows SAPI / 自己写的皮),只要:
- 起一个本机 HTTP 服务,按上表实现这两个接口
- 把配置里的
ttsBase改成它:- 同源路径:
/my-tts(挂在 DSH 自己的 webServer 上) - 或者完整地址:
http://127.0.0.1:9000/tts(独立端口也行)
- 同源路径:
改完刷新卡片即可,不用改代码。
最省事的办法:把 ttsBase 留空。
这时插件完全不去问朗读服务——听、看、认、做饭全部照常,只是:
- 不会「它念的时候自动闭麦」(可能把自己的声音听成你说的话)
- 不会「抢话打断」
想要完整的语音对话体验,还是建议装朗读桥;只想「说话 → 会话」的话,留空就够了。
数据在哪
~/.dsh/camera-bridge/
├── timing.jsonl 每一轮耗时(判停 / 转写 / 送达 / 总)
├── clips/ 录音临时文件(转写完即删,不留档)
├── shots/ 最近 20 张快照
├── recipes/current.json 当前菜谱
└── models/ SenseVoice / YOLO 权重
常见问题
| 现象 | 原因 / 怎么办 |
|---|---|
| 自检说缺 ffmpeg / python | 装了没加进 PATH。在设置页填绝对路径,或重装并勾选「加入 PATH」 |
| 自检说缺模型 | 看自检里写的路径,把文件放进去;路径在面板上能改 |
| 麦克风抓不到 | 设备是独占的,别的软件占着就用不了。关掉那个软件再点开始听 |
| 摄像头黑屏 / 起不来 | 同上,独占。另外「Windows 设置 → 隐私 → 摄像头」要允许桌面应用访问 |
| 说了没反应 | 看卡片上的「刚才听到」。如果是空白,多半是麦克风选错了 |
| 一直「正在听你说…」 | 环境太吵,VAD 一直判成有声。调大 minSpeechMs 或换个安静点的地方 |
| 不出声 | 那是朗读桥的事:装 dsh-tts-bridge、浏览器扩展、DeepSeek 页面开着 |
| 念一半自己停了 | 可能是回声误触抢话。调大 interruptMs 或 interruptRms |
| 第一次用眼睛很慢 | 在下载 338MB 的 CLIP,只发生一次 |
| 阶段一直不动 | 画面里没有可判的东西(比如镜头对着墙)。它有意识地不瞎编 |
| 换词没生效 | 词表改完要等下一次识别;如果 vocab 降级成 80 类,说明 CLIP 没准备好 |
兼容性
| 平台 | |
|---|---|
| Windows | ✅ 主支持(dshow 设备枚举最完整) |
| macOS / Linux | ⚠️ 能用,但设备名要手填,自动挑可能不准 |
| 有 NVIDIA GPU | ✅ 推荐,单帧 16–25ms |
| 只有 CPU | ✅ 能跑,慢一些 |
关于隐私(请读一下)
这个插件会用到你的摄像头和麦克风,所以要说清楚:
- 说话:音频只在本机转成文字,不上传;转写完录音文件立即删除(
clips/不留档) - 画面:帧只在本机解码 + YOLO 识别,不会自动上传
- 但:当你(或模型)用
look_camera拍了一张、再read_image去读它时, 那张图片会被送进模型上下文——这一步等于上传给模型服务商,和你手动发图一样 - 快照存在
~/.dsh/camera-bridge/shots/,只留最近 20 张,随时可以删 - 摄像头/麦克风随时可关(卡片上的按钮),不用了就点掉
引用与致谢
本项目默认对接 朗读桥 dsh-tts-bridge(作者 Yuuyuko-uu)。
它负责「把会话里的回复念出来」这一半 —— 具体做的事是:盯着你选的会话,把说完一整轮的文字排进队列, 再通过浏览器扩展,在你自己登录的 DeepSeek 网页里点它的「朗读」按钮,用你自己的账号出声。
说明几点:
- 朗读桥不在这个仓库里,也不会被 npm 包带上;本项目只是在运行时按
ttsBase调它的两个接口 - 它的许可是 「Yuuyuko-uu 插件许可 1.0」(非 OSI 开源许可,要求再分发时注明原作者与仓库)
- 所以:如果你再分发本项目,请保留这段署名和链接
- 不想用它?见上面「换掉朗读桥」
另外,本项目的界面风格参考了朗读桥的 README 排版。
许可
本项目按 GNU AGPL v3.0 或更高版本发布 —— 见 LICENSE。
选它是因为运行时依赖 ultralytics(YOLOv8 / YOLO-World),它也是 AGPL-3.0,用同一套许可就没有冲突。 你可以自由使用、修改、再分发,但分发修改版时也要开源。
依赖清单、模型许可、以及为什么放弃 ONNX 方案,见 THIRD-PARTY-NOTICES.md。
本项目与深度求索公司无关,非官方工具。
No comments yet. Be the first to write one.