samonti86/jarvis

GitHub: samonti86/jarvis

一款基于 Windows 平台的常驻型智能语音助手,通过本地语音识别与 Claude 驱动的 36 工具智能体循环,实现低延迟的多模态交互与复杂任务自动化。

Stars: 2 | Forks: 0

# Jarvis [![gate](https://static.pigsec.cn/wp-content/uploads/repos/cas/ac/ac32ef5453bed18c9bd54b27fa9e7f6a48ba352846f1500d2e3c48565f3aa5e3.svg)](https://github.com/samonti86/jarvis/actions/workflows/ci.yml) [![license: MIT](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE) [![python 3.12](https://img.shields.io/badge/python-3.12-blue.svg)](https://www.python.org/downloads/) 一款专为 Windows 打造的常驻型语音助手。只需说“Hey Jarvis,”提出问题,即可获得 语音回复 —— 其背后拥有一个包含 36 个工具的 Agentic 层,能够搜索网页、在 沙盒中运行代码、读取日历、监控家庭实验室,甚至通过摄像头进行视觉感知。 唤醒词检测和语音转文本均在**本地**运行。只有转录后的文本 会离开本机 —— 唯一的例外是可选择开启的[后台 agent](docs/ENV_VARS.md#long-horizon-background-agents-m91), 该功能默认关闭。 ``` mic ──► openWakeWord ──► faster-whisper ──► Claude ──► edge-tts ──► speakers (local) (local) (agentic (streamed) tool loop) ``` 包含约 29,000 行 Python 代码,分布在 70 个模块中。完整的工程记录 —— 包括设计 权衡、事后复盘,以及那些后来被证明是错误的结论 —— 均记录在 [docs/MILESTONES.md](docs/MILESTONES.md) 中;如果你只想挑选阅读, 其中的 [**从这里开始**](docs/MILESTONES.md#start-here) 章节为你精选了六篇最值得一读的 内容。 ## 值得一读的部分 **是 Agentic 工具循环,而不是聊天机器人。** Claude 被赋予了 36 个工具,并自主决定 调用哪一个,在多次迭代中将它们串联起来。比如询问“我的 Plex 媒体库中播放次数最多的电影是什么?”,它会组合调用四次独立的 MCP 才能得出 结果 —— 系统中完全没有针对该问题的手写代码路径。 **延迟是核心设计约束。** 模型的回复以流式传输,并被分块 切分为句子,*在模型仍在生成时*就合成为语音,因此 第一个单词大约在一秒后就会发出,而无需等待整个响应生成完毕。系统 prompt 经过 prompt 缓存处理;每轮对话的上下文(说话人身份、当前时间)搭载在另一个 刻意**不缓存**的块中,因此该部分的修改只需消耗约 20 个 新 token,而不会使整个已缓存的 prefix 失效。 **最小权限原则,在代码中强制执行。** 并非每个调用者都能使用所有工具。来自 手机客户端或 Discord 桥接的请求将被提供一个*受限的*工具 界面 —— 没有shell、没有文件系统、没有代码执行、没有自我更新。该边界 在服务端的两个独立关卡强制执行:工具列表在 模型看到之前就已经被过滤,*并且*如果某个被拒绝的工具通过某种方式被 触达,执行器也会按名称拒绝执行。该原则绝对不通过在 prompt 中 委婉要求模型来执行。变更性操作 受到确认门控的限制,并且该门控会携带评估该操作所需的信息 —— 无法让你评估的确认门控只是形式主义,而非真正的安全。 **任意代码获得的是边界限制,而非白名单。** `run_code` 在 临时的 Podman 容器中执行由 Claude 编写的 Python 代码:无网络、无主机挂载、 设有 CPU/内存/PID 限制,并在 30 秒后强制终止。你无法为 任意代码设立白名单,因此只能转而对其进行隔离。 **所有组件采用平滑降级。** 任何单一子系统 —— TTS、Plex 桥接器、GPU 转录服务器、日历源 —— 均可发生故障而不会导致监听 循环崩溃。优雅降级并记录日志;绝对不让与用户正在 交流的系统崩溃。 **设立回归测试关卡,因为本该由测试拦截的 bug 必须要有对应的测试。** `scripts/run_all_tests.py` 会运行 49 个关卡 —— 包括语法、模块连接、一项 JS 结构 检查,以及总计包含约 1,100 项断言的 46 个测试套件 —— 且在 任何代码发布前必须全部通过。CI 会在每次推送时运行*相同的* 命令;其中五个需要原生 ML 工具链或 Windows SAPI 的关卡会按名称被明确 跳过,绝不悄无声息地混入通过的数量中。 ## 功能 | 领域 | | | --- | --- | | **语音** | 唤醒词、回复中途打断、后续对话窗口(无需重复唤醒)、解放双手的对话模式、实时双向同声传译模式 | | **知识库** | 网络搜索与抓取、私有 RAG 语料库(SQLite FTS5 + 本地 embedding,使用 Reciprocal Rank Fusion 融合)、过往对话的全文检索 | | **感知** | 网络摄像头视觉、屏幕捕捉、环境声音分类(PANNs)、基于语音 embedding 的说话人识别 | | **主动服务** | 极端天气警报、日历事件前提醒、家庭实验室运行/宕机监控、跨领域信息综合、早间简报与晚间总结 | | **长周期任务** | 派发在托管沙盒中运行长达一小时并反馈结果的研究任务 —— 完成时通过语音播报,如果在夜间完成则并入早间简报(可选择开启) | | **系统** | 只读诊断 shell(包含 18 个动词的白名单)、需确认门控的服务控制、沙盒代码执行、自我更新、崩溃看门狗 | | **客户端** | 桌面控制台、系统托盘、通过 WSS 进行按键说话的 iOS PWA、Discord 机器人桥接 | | **数据源** | 天气、体育、新闻、影视、游戏、WolframAlpha、Plex(通过 MCP) | 设计上支持多语言:系统会逐轮检测语言,并以相应的语音返回 该语言的回复。 ## 技术栈 Python 3.12 · [openWakeWord](https://github.com/dscripka/openWakeWord) · [faster-whisper](https://github.com/SYSTRAN/faster-whisper) · Anthropic SDK(流式传输、 prompt 缓存、工具使用) · [edge-tts](https://github.com/rany2/edge-tts) 并提供 `pyttsx3` 离线回退方案 · `sounddevice` · YOLOv8n · Resemblyzer · Podman · `websockets` · MCP 特意选择原生支持 Windows 而非 WSL:因为 WSL2 的音频桥接对于 常驻型实时音频捕获而言,其稳定性还不够。 ## 快速开始 ``` git clone https://github.com/samonti86/jarvis.git && cd jarvis python -m venv venv .\venv\Scripts\Activate.ps1 pip install -r requirements.txt Copy-Item .env.example .env # then set ANTHROPIC_API_KEY python scripts\doctor.py # verifies deps, config, audio devices python main.py # or: pythonw jarvis.pyw (silent, no console) ``` 然后说 **“Hey Jarvis.”** `doctor.py` 是只读的,并且会准确地告诉你缺少了什么 —— 它是解答 “为什么无法启动?”的最快途径。Anthropic API 密钥是**唯一**的硬性 要求;其他所有集成为可选项,默认关闭,并在未配置时 平滑降级提示“未配置”,而不会导致报错崩溃。 - **[docs/SETUP.md](docs/SETUP.md)** —— 详细的配置指南,包括如何获取各个 API 密钥 - **[docs/ENV_VARS.md](docs/ENV_VARS.md)** —— 所有配置项、其默认值以及读取来源 使用 `python scripts/run_all_tests.py` 运行测试关卡。 ## 布局 ``` main.py composition root: load config, build subsystems, start threads src/listen_loop.py voice path — wake word, barge-in, follow-up/conversation modes src/turn_runner.py one turn end-to-end: history, streaming, tool loop, TTS src/bootstrap.py subsystem assembly (Plex, announcer, remote console, shutdown) src/llm.py Anthropic client, streaming, tool loop, per-origin tool boundary src/wake_word.py openWakeWord src/speech_to_text.py faster-whisper (local, or offloaded to a GPU host) src/text_to_speech.py edge-tts + fallback, sentence-chunked streaming src/security.py vision security mode (person detection, challenge/response) src/*.py the tool and subsystem modules (70 in total) tests/*_test.py the regression suites — everything here runs in the gate scripts/ operational entry points + hand-run probes; never collected docs/SETUP.md deployment walkthrough docs/MILESTONES.md engineering log — index + "start here" docs/milestones/ the log itself, 107 entries across 5 parts ``` ## 许可证 个人项目,作为作品集展示发布。
标签:AI智能体, 人工智能, 文本转语音, 本地语音识别, 用户模式Hook绕过, 语音助手, 逆向工具