跳到正文
Hacker News· grigio·· 8 天前AI 评分62

Show HN:无需独立 GPU、内存低于 15GB 的离线语音助手

Show HN: Offline voice assistant, NO dedicated GPU, less 15Gb RAM

AI 导读

作者发布离线语音助手,全部本地运行,无需独立 GPU、内存占用低于 15GB,支持打断、技能与工具调用。它把打断分为两种强度,短促哼声暂停播放、明确打断丢弃剩余回复;轮次结束由逐帧语音检测、停顿阈值和分类器共同投票,分歧时用四 token 的判定提示词输出 LISTEN 或 REPLY。

正文 · AI 翻译

Luigi

2026年10月10日 • 2 分钟阅读

大多数语音助手就像对讲机。你按下、说话、等待。而这个助手在回答时保持麦克风开启,所以你可以在句子中间打断、改变主意或纠正自己,并在一个音频缓冲区内得到反应。一切都在本地运行。没有云端,没有账户,没有往返,支持技能和工具调用

有趣之处

打断有两种强度。一声短促的低语会暂停播放,让你说完;一次坚定的打断会丢弃回复的剩余部分。历史记录保留已说过的内容,并加上一个你插话的标记,而一声轻轻的“嗯嗯”不会打断任何东西。

轮次结束是一个分层决策,而非计时器。逐帧语音检测器、停顿阈值,以及对你最后几秒话语的分类器,各自投票判断你是否说完了。当它们意见不一致时,一个四 token 的裁判提示会回答 LISTEN 或 REPLY 来打破平局。

一个工具闸门位于模型和你的机器之间。每一轮提议的工具调用都会与你实际的最后一句话进行核对;任何你没有要求的内容都会被拒绝,并附上语音解释。这消灭了一整类在打断后出现的幽灵工具调用。

两个大脑共享一次对话。一个通过标准聊天 API 从本地服务的模型流式输出。另一个将编码代理 CLI 作为子进程启动,并继承其工具、技能和每会话记忆。一个复选框在运行时切换它们。

历史记录是打断安全的。当一个轮次被切断时,不完整的工具交换会被丢弃,因此技能不会每轮都被重新读取。每次请求前,历史记录会被裁剪以适应上下文窗口,最旧的轮次优先,绝不裁剪正在回答的那一轮。

模型会镜像你的语言:意大利语得到意大利语,英语得到英语,并且当你在一场对话中途切换时,它会逐轮跟随你。

如何连接

一个中枢进程拥有 32 毫秒的帧循环、状态机、所有队列、对话历史和播放节奏。围绕它的是三个小型服务,每个都是一个内置原生服务器的配置,拥有自己的 HTTP 端点和健康检查。

转录通过单个套接字全双工运行:客户端推送音频并在同一连接上读取流式部分结果,手工实现原始协议,因为请求/响应做不到这一点。合成以 20 毫秒的切片流式传输音频,中枢根据时钟调节节奏,这正是让打断后的暂停、恢复和刷新能在一个缓冲区周期内生效的原因。轮次评分向中枢提供投票。推理核心是外部的;启动器检查其健康端点,否则拒绝启动。

mic (16 kHz) ─► VAD ─► STT :8091 ─► HUB turn-end ─► LLM :8080 / agent CLI
                                                      │
                                    sentence splitter ─► TTS :8092 ─► paced player
                                                      ▲
                                                 barge-in hooks

一个通往 UI 的套接字双向承载文本事件和二进制音频;最新的客户端获胜。工具包括日期时间、计时器、记事本和 shell 命令,受审批策略(关闭 / 询问 / 自动)、白名单以及拒绝链式或替换元字符的保护。技能是从 UI 启用的指令文件夹,从不自动发现:只有你勾选的才会进入提示,每次对话读取一次,其脚本跳过审批提示。每个设置都是来自一个文件的环境变量;UI 在运行时修改同一个对象,只有技能选择在重启后保留。

来源:Hacker News · grigio.org