桃子桃子快讯
返回首页
工具

完全本地运行的 iOS AI 代理与语音管线应用

开发者展示一款 iOS 应用:所有 AI 代理、网页研究与语音管线均在设备本地运行,无云端推理,配合 Apple Int…

2026.08.23 · 周日4 分钟阅读

开发者 Rob Sandhu 在 Hacker News 上展示了一款 iOS 应用 Agent,实现了完全在设备上运行的 AI 代理与完整语音管线:无需账号、无模型 API、无云端推理,唯一离开手机的只有可关闭的网页研究模块。该应用同时复用 Apple Intelligence 本地模型与 Sherpa-onnx 推理引擎,把代理执行、网页研究、流式 STT 与零样本语音克隆 TTS 串成端到端流程。

两大核心能力

应用能力拆为两块:

  • 后台代理:用户描述任务(如「找芝加哥附近适合 9 岁孩子的夏令营」),代理在后台规划搜索、读取网页,再用 Apple Intelligence 本地模型推理并附上引用,结果回来后直接朗读。
  • 设备端语音:流式 STT 用于口述任务与实时转录;零样本语音克隆 TTS 让代理结果「开口说话」,声音可来自一段十秒样本。

应用还附带一个 Echo 回环开关的实时转录界面,正是作者未来「语音通话应用」的雏形:发送方设备转录音频、网络只传约 50 字节/秒文本、接收方再以发送方克隆的语音合成还原——用文本传输替代 6–24 kbps Opus 音频流。

五层系统架构

应用拆为五层,UI 用 SwiftUI 编写、不直接接触原生运行时:

  • UI 层:AgentsView、SettingsView、共享 DesignSystem 组件。
  • Agents 域:AgentRunner 管理 BGProcessingTask 与前台任务;AgentBrain 是可替换的模型协议;AgentStore(ModelActor)负责持久化。
  • Web 研究:WebResearcher 调度搜索,支持 DuckDuckGo(免 Key)与 Brave(API Key 存钥匙串),通过 PageReader + HTMLText 抽取正文。
  • 语音引擎:SttEngine 与 TtsEngine 各用串行队列,配合 AudioCapture、AudioPlayer、VoiceProfileStore。
  • 原生桥接:SherpaOnnx.swift 经 c-api.h 调用 sherpa-onnx 与 onnxruntime 的 xcframework。

AgentBrain 通过协议实现可插拔:FoundationModelsBrain 调用 Apple Intelligence(iOS 26+),分三遍——规划查询、汇总发现、写三句话朗读式总结;MockAgentBrain 作为回退,让流水线在任何设备上都能测试。

后台任务与网页研究

每条代理是 SwiftData 中的一条记录,状态在 queued → running → completed/failed 间流转,结果分为朗读版 summary 与详细版 detail。AgentRunner 通过两条路径排水:

  • 前台:App 进入前台或用户发起(模拟器中唯一可用)。
  • 后台:com.robsandhu.Agent.agentwork 的 BGProcessingTask,iOS 在设备空闲充电时调度;过期回调会取消并重新入队,进程死亡遗留的 running 任务在下一次启动时被 requeueOrphanedRunningJobs 恢复。

网页研究流水线为:规划查询 → 搜索 → 合并去重 → 读 N 页 → 抽取摘要 → 落地。WebResearcher 轮转查询避免单一查询独占读预算,按 canonical host+path 去重;单页上限 1.2 MB,优先 <article> / <main>,失败时降级为搜索摘要。Prompt 中每条发现带编号摘录并要求内联引用,上下文溢出时自动以 1100 → 600 → 300 字符更短重试,最终回退到无搜索的通用知识。来源以 sourcesJSON 形式持久化到任务上,作为可点击链接直接列在发现下。

整个项目以「模型永远不碰网络」为原则:所有网页请求均由 WebResearcher 发起并把文本交给模型,使模型能看到的内容由策略边界限定,而非由其自身工具调用能力决定。

信源