dsh-web-speech-input
leozou320-ai
Voice-to-text for the DeepSeek Harness Web UI — live, editable, never auto-sends. | DeepSeek Harness 网页语音输入
PROJECT TOPICS
PROJECT README
DeepSeek Harness 的轻量实时语音插件。不包含 Docker、Python或本地模型。千问线路是确定性的三段式管线:浏览器采集 PCM,Harness Host 以同源 WebSocket 代理专用 ASR/TTS;空闲时完整语句经原生输入框自动交给当前 Harness 会话,忙时的新语音先合并到输入框,播报结束后按可配置停留时间安全续发,语音厂商没有独立回答的机会。

qwen3-asr-flash-realtime → DeepSeek Harness → qwen3-tts-flash-realtime(阿里云百炼,北京/新加坡)。gpt-realtime-2.1(OpenAI Realtime)。1800ms,期间没有续说或键盘编辑才提交完整草稿。推理、记忆、联网、插件与工具调度全部由 Harness 完成。threshold=0.85、尾静音 700ms,并关闭浏览器自动增益以优先近讲。ASR final 先进入候选断句,再等待 1200ms 的续说窗口;从停顿开始约 1.9s 才提交 Harness,期间继续说话仍属于同一轮。TurnCoordinator 为每轮分配唯一 ID,并串行处理 ASR 状态事件;旧轮的迟到回调不能再启动 Harness、覆盖新轮或播放过期语音。speech_started 会暂停倒计时,只有 speech_stopped 后才允许恢复,后续 ASR final 合并后重新计时;键盘编辑、粘贴、清空、手动发送、连接停止或草稿版本不匹配都会撤销自动发送,避免长句中途提交和重复提交。500ms 持续近讲后,才暂停播放器并把带预卷的候选音频交给 ASR。400ms 防回声窗口,清理残留 ASR 缓冲后才重新进入监听。turn/end。聊天界面不再显示任何 voice-summary/HTML 边界,TTS 只消费 text-delta,绝不读取 reasoning-delta、工具过程或后续详情。800ms 且仍没有正文时,才播出依据脱敏短主题、Harness 工具/重试阶段和此前接场句临时生成的自然承接,不再依赖固定话术库。长等待最多三句且不会重复;快回答会取消未播接场。接场和结果共用同一 TTS 单写者队列,不写 Harness 历史,也不读取 reasoning 或 tool payload。localStorage、包文件或日志。推荐直接从带版本标签的 GitHub 仓库安装:
dsh plugin --profile web add github:zfu691531-hash/dsh-realtime-voice#v0.12.0
仓库提交预构建 lib/,因此这条命令不需要本机 TypeScript、源码 checkout 或 pnpm allowBuilds。重启 DeepSeek Harness 后,在“设置 → 插件”展开“实时语音(千问 / GPT)”。
也可以下载同版本 GitHub Release 中的预构建 tarball 后执行:
dsh plugin --profile web add ./dsh-realtime-voice-0.12.0.tgz
也可以从源码自行验收并打包:
npm install --ignore-scripts
npm run dev:link-dsh
npm run check
npm pack
源码构建需要本机已安装 DeepSeek Harness;dev:link-dsh 只把类型检查和打包所需的 Harness 包链接进当前开发目录。普通用户安装 Release tarball 不需要执行这一步。
dsh plugin --profile web remove dsh-realtime-voice
重启 Harness 后插件的 Host 路由、客户端槽位和语音上下文会随 Cordis disposer 一并移除。凭据由 Harness 统一管理,卸载插件不会擅自删除用户凭据。
先运行 dsh plugin --profile web list 确认安装版本,再在 Harness 已打开的浏览器页面执行:
await fetch('/dsh-realtime-voice/status').then(response => response.json())
完整示例配置与排障见 docs/EXAMPLE_CONFIG.md。
package.json 通过 dsh.bundle.patch 声明组合包,patch 指向本包的 Host 与 Client 入口。cordis.patch.yml 只贡献本插件自己的服务行,不覆盖用户 profile 的其他插件。在 Harness 的凭据配置中提供所选线路的引用:
DASHSCOPE_API_KEY,并在插件设置里填写同区域的百炼 Workspace ID。OPENAI_API_KEY。TENCENT_SECRET_ID 与 TENCENT_SECRET_KEY。声纹音频会按用户显式启用发送到腾讯云说话人验证服务;插件只持久化腾讯云返回的不透明 VoicePrintId,不持久化录音或声纹特征。插件设置只保存 provider、Workspace ID、ASR/TTS 模型、TTS 音色、VAD/语段合并/草稿停留参数、声纹开关/阈值和播报风格;不保存 Key。声纹 ID 只存 Host 设置且不会返回浏览器,原始 PCM 仅在当前 utterance 的内存中短暂存在。千问默认使用北京区、qwen3-asr-flash-realtime、qwen3-tts-flash-realtime 和 Chelsie;OpenAI 默认使用 gpt-realtime-2.1 和 marin。Tina 是 Omni 专属音色,独立 TTS 不支持;Chelsie 是专用 TTS 中更接近其软糯亲昵风格的选择。
当前 DeepSeek Harness Desktop rc.5 的 Electron 壳会拒绝 renderer 的麦克风权限。插件在桌面窗口点击话筒时会用默认外部浏览器打开同一个 loopback Harness 页面;在 Chrome/Edge 中授权麦克风后即可使用。Host、会话和插件仍是同一套 Harness 实例,不会接入 Sophie 或另起 Agent 服务。
未来桌面壳开放麦克风权限后,这个插件无需音频架构变更即可直接在内嵌窗口工作。
npm install --ignore-scripts
npm run dev:link-dsh
npm run check
npm run check 包含类型检查、无真实 Key 的 Host/委派/双 provider 协议测试、生产构建和浏览器 bundle 纯度检查。
详细 rc.5 契约见 docs/HARNESS_RC5_CONTRACT.md。
面向 DSH 组合架构的职责、事件契约、权限边界、依赖和风险清单见 docs/ARCHITECTURE_PACKAGE.md。安全报告流程见 SECURITY.md。
自适应“对话接场器”的实现与后续进度话术路线见 docs/ADAPTIVE_FLOOR_MANAGER.md。当前版本已实现第一阶段的实际延迟竞速、单次承接和轨迹重试失效保护。
CLASSIFICATION EVIDENCE
系统优先读取 GitHub Topics,再与站内分类词典和词根规则比对。