关于 Griasa
Griasa 是一款本地优先的 macOS 菜单栏应用,可从会议中提取承诺并为后续通话生成简报。它关联录音、承诺、同事页面和提醒,并提供供 AI 助手读取的本地只读 MCP 端点。
主要功能
- 01依据参会者和历史生成会前简报
- 02分别录制麦克风和系统音频
- 03提取并追踪会议承诺
- 04提供上下文提醒和同事页面
- 05支持设备端语音识别与 AI 选项
- 06本地令牌保护的只读端点
适用场景
- 01会前查看相关承诺
- 02从当前应用或窗口创建提醒
- 03向当前焦点应用口述文字
- 04让 MCP 客户端读取会议记录
MCP 相关
提供本地、受令牌保护的只读 MCP 端点,供兼容客户端读取会议信息。Claude Desktop 支持一键安装。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
我们还没有获取到这个服务的安装包或远程地址,请按项目 README 中的说明安装。
工具
本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。
详细介绍
Griasa
有日期的承诺会在日期到来时浮现。没有日期的承诺则永远不会浮现。
Griasa 会在你自己的 Mac 上记录会议,梳理谁承诺了什么,并在你下次与 欠对方人情的人通话前,把另一类承诺摆到你面前。 它是菜单栏应用,不是服务。
下载 macOS 版 · 项目主页 · 变更记录


Support/shoot-docs.sh 实现。功能
通话前。 日历事件开始前几分钟,面板会显示参与者和上次讨论的内容。未兑现的承诺会根据显示它们的原因分组——逾期、在之前与恰好这些人参加的通话中许下、在与房间里某人的一对一会议中许下,或是在其他场合与这些人许下。若承诺涉及的人都不在房间里,就不会显示。点击一个按钮即可打开 Zoom 或 Meet 链接并开始录音。
通话中。 你的麦克风和 Mac 播放的所有声音会分别录为两条音轨,因此转录才能标明说话者。在屏幕上的任何内容上创建提醒(⌃⌥⌘R),应用会记住来源应用、窗口和浏览器标签页。按住按键说话,语音就会输入到当前获得焦点的应用中。
通话后。 应用会从转录中提取承诺——谁答应了什么、何时完成——并分成你欠别人的和别人欠你的。之后的对话可以建议关闭某条承诺,但必须引用表明事情已完成的句子;承诺不会自动关闭。对于时间久远且没有日期的承诺,应用会询问你,因为这类承诺本身永远不会浮现。每位同事都会根据会议名单生成个人页面,无需任何设置。
你的助手也能读取这些内容。 Claude Code、Codex、Cursor——任何使用 MCP 的客户端——都可以通过本地、受令牌保护的只读端点访问;Claude Desktop 只需点击一次即可安装。
所有功能可以同时运行:录制对话时,你仍然可以听写。大多数组件都很小,Apple 明天就能推出其中好几个。难以复制的是它们融为一体:通话中的提醒、从同一通话中提取的承诺、承诺者的个人页面,以及与此人下次会议前的简报,都指向同一批人和同一段历史。拆成独立应用就需要各自集成,而且仍会丢失它们之间的关联,因为关联并不是其中任何一个应用独有的功能。
项目主页还介绍了其余内容:更多截图、哪些内容会离开你的 Mac、哪些不会、比想象中更棘手的工程难题,以及人们真正会问的问题。
隐私政策
简要说明如下;完整政策请见 stari-am.github.io/griasa/privacy.html。
- 音频绝不会离开你的 Mac。 转录在本地进行——使用 Apple 的识别器或
whisper.cpp。Griasa 没有服务器,也不需要账户。 - 默认情况下,文本会留在 Mac 上。 新安装会使用 Griasa 在询问一次后配置好的本地模型;只有在你选择后才会使用 Anthropic、OpenAI 或 Gemini。
- 日历只读取,不写入。 会创建提醒事项,但仅在你要求时创建。
- API 密钥保存在 macOS 钥匙串中,经过加密,不会存放在纯文本偏好设置文件里。
- 所有权限均为可选项,如果你拒绝授权,应用会说明哪些功能将无法使用。
- 可选的录音对象提醒。 通话另一端不会收到 macOS 提供的录音指示。开启 Settings → Meetings → Remind me to tell everyone 后,开始录音时会提供一段话,供你粘贴到通话聊天中。
- 也可以导入其他工具的笔记。 Import Meeting Notes… 会将 ChatGPT Record、Zoom 或 Meet 的摘要转换为 Griasa 会议记录——包括承诺事项、人员页面和简报,并按会议发生日期记录。
- 旧音频可以自动删除。 转录文本和笔记会保留;已转录录音的音频可在选定期限后删除(Settings → Meetings → Recordings on disk)。录音占用的空间几乎全都来自音频。
- 企业可通过 MDM 锁定设置——仅使用设备端 AI、使用企业模型服务器、关闭 MCP。请参见 Support/mdm。
下载
下载最新版本——已签名、公证,支持通用架构,或运行 ./build.sh 自行编译。
使用 Homebrew,只需一条命令即可安装应用及其使用的两个引擎(用于语音的 whisper.cpp,以及用于设备端 AI 的 llama.cpp):
brew install --cask stari-am/tap/griasa
免费使用,没有任何功能受限:不需要许可证检查,而且根据 GPL-3.0 的规定,也不可能设置有实际意义的许可证检查。如果它为你节省了时间,在 Ko-fi 上赞助 $29 就会让我很开心——任何金额都欢迎,当然不赞助也完全没问题。
可以把它想成 WinRAR:试用期永远不会结束,无论是否付费,它都能持续使用。显然,WinRAR 这样确实赚到了钱,这留下了一个三十年来无人解开的谜团——总有人付费。欢迎成为其中一员。

文档
以下内容介绍如何运行、构建和修改它。
听写的工作方式
| 触发方式 | 按住 Right Option / Right Command / Fn(可配置)——在任何应用的文本框中均可使用 |
| 输入方式 | 说话时实时输入,松开后一次性替换为修正后的文本 |
| 自动编辑 | 删除填充词、恢复标点、整理列表格式、处理自我更正 |
| 语气 | 将最前端应用的名称传递给 AI 提示词,因此 Slack 中语气随意,Mail 中语气正式 |
| 语音识别 | 在设备端进行(Apple 识别器或本地 whisper.cpp)——音频绝不会离开 Mac |
| 云端使用 | 只有简短的润色步骤可能会调用大模型,而且只发送文本,并且只有在你启用后才会调用 |
| 语言 | 支持系统提供的任意区域设置;可同时运行两到三种语言作为并行候选,并锁定胜出的结果 |
| 片段 | 输入缩写即可在原位置展开,包括用于内联提问的 ;ai … ;; |
构建与运行
./build.sh # produces "Griasa Dev.app"
open "Griasa Dev.app"
./test.sh # the invariant checks; release.sh runs these first
本地构建会明确标识自己:琥珀色的 DEV 图标、独立的文件名、隐私设置和活动监视器中显示的“Griasa Dev”,以及方角的菜单栏图标。它也使用独立的 bundle 标识符 am.stari.griasa.dev。这一点并非表面功夫——macOS 会将隐私授权同时绑定到标识符和它所见到的签名,因此,两个签名不同的构建若共用一个标识符,就会相互覆盖对方的授权,导致每次启动都重新询问。使用独立标识符只需多走一轮权限提示,而且只需一次。release.sh 不会执行这些操作;签名后的构建会携带正式的标识符、图标和名称。
test.sh 会检查实时输入绝不能破坏的规则——输出文本只能增长;如果某个假设改写了话语的开头,就不能延长其结尾;语言锁定后不得更改。前两项曾导致实际发布的回归问题;现在它们会使命令失败,而不是文本字段出错。这里没有使用测试框架:swiftc 会将 PartialStabilizer.swift 与检查代码编译在一起,二进制程序会以非零状态退出,因此只安装了命令行工具的机器也能运行这些检查。每条失败信息都会说明规则及其重要性,因为“预期为 true,实际为 false”对看到它的人毫无帮助。
自行分发
./release.sh # signed + notarized dist/Griasa-<version>.dmg — the one on Releases
./dist.sh # ad-hoc signed dmg, no Apple account needed
release.sh 用于生成正式发布版本:使用 Developer ID 签名、启用 Hardened Runtime、将 Apple 的公证票据装订到应用和磁盘映像,然后以陌生人的 Mac 上会采用的方式验证成品——对最终文件运行 spctl、stapler 和 lipo -archs,而不是检查构建设置。它需要 Developer ID Application 证书和已存储的 notarytool 凭证;如果缺少这些内容,运行前检查会准确说明需要创建什么,其中也包括最耗时的两个陷阱(使用 security import 导入证书,因为双击会报错 -25294;单独安装 G2 中间证书,否则 codesign 会因“unable to build chain to self-signed root”而失败)。
dist.sh 用于将构建版本交给没有 Apple Developer 账户的同事:它会生成一个通用 dmg,包含应用图标、/Applications 快捷方式和 INSTALL.txt。由于采用临时签名,接收者必须右键 → 打开一次。无论采用哪种方式,其余步骤都可由应用自行完成:首次启动时,应用会通过 Homebrew 安装 whisper-cpp、下载模型,并请求四项权限。
可使用完整的 Xcode 或独立的命令行工具在 macOS 14 及更高版本上构建;可在 macOS 14 及更高版本上运行。build.sh 直接使用 swiftc 编译,无需正常工作的 SwiftPM——部分独立的命令行工具安装包带有损坏的清单库。Package.swift 与之等效,在完整的 Xcode 环境下可以使用 swift build;任选一种即可。
Intel 构建有截止期限。 Xcode 26 是最后一个能在 Intel Mac 上运行的版本,也是最后一个免费提供 x86_64 架构的版本。在 Xcode 27 下,如果部署目标为 27.0 或更高版本,ARCHS_STANDARD 会静默移除 x86_64——不会报错,只会生成仅支持 arm64 的二进制文件;而 macOS 28 将彻底终止对 Intel 软件的支持。本项目的目标版本为 macOS 14.0,因此 release.sh 仍会生成真正的通用二进制文件;它会通过 lipo -archs 验证,而不是盲目相信构建设置。如果将来提高目标版本,也应继续这样验证。
参与贡献
欢迎提交补丁,也欢迎派生项目。CONTRIBUTING.md 介绍了构建、约束检查,以及补丁最容易碰到的几项约定——提示词放在哪里、为什么新增 UI 应作为中心页签而非窗口,以及为什么绝不能使用真实数据截图。
定制你的版本(分支与自定义构建)
用于标识构建归属的所有内容都在一个文件中:Sources/Griasa/BuildConfig.swift。构建前请编辑此文件:
| 常量 | 用途 | 留空时的行为 |
|---|---|---|
supportEmail | “发送反馈”邮件草稿 | 隐藏反馈按钮 |
donateURL | ♥ 捐赠按钮 | 隐藏捐赠按钮 |
updateRepo | 每日检查 github.com/<owner>/<name> Releases 中的更新 | 关闭更新检查 |
appName | 邮件主题和版本行 | — |
代码签名通过环境变量进行参数化,无需修改脚本:
CODESIGN_IDENTITY="My Own Cert" ./build.sh # dev build (default: "Griasa Dev Signing")
DIST_SIGN_IDENTITY="Developer ID Application: You (TEAM)" ./dist.sh # distributable (default: ad-hoc)
Bundle 标识符和版本信息位于 Support/Info.plist 中。如果要分发分支版本,请更改 CFBundleIdentifier,以免权限授权和更新源与上游构建冲突。
更改告知 AI 的内容
Griasa 发送给模型的所有系统提示词都在一个文件中:Sources/Griasa/Prompts.swift——听写清理、会议纪要、承诺事项提取、同事档案、项目归档、文档起草、提醒解析、聊天回复和内联解答。阅读该文件即可准确了解应用要求模型执行的任务;编辑后重新构建即可更改应用的行为。
运行时值采用 {{placeholder}} 形式,并由调用方填入,例如 {{today}}、{{participants}}、{{skeleton}} 等。调用方未提供的占位符会保留在提示词中,而不会被静默清空,因此错误会显示在输出中,而不是被隐藏起来。
你无需重新构建即可进行试验:设置 → AI 与操作 → 系统提示词 → 导出以编辑会将当前文本写入 ~/Documents/Griasa Prompts.json。其中存在的任何键都会覆盖内置版本;删除某个键(或该文件)即可恢复默认版本。点击重新加载编辑内容即可应用更改,无需重启。
提示词预设库(设置 → 提示词预设)有意不放在该文件中——这些是你自己的文档,通过界面编辑并按用户存储,不属于应用行为。
请始终运行已打包的应用(本地运行
Griasa Dev.app,安装后运行Griasa.app),不要直接运行裸二进制文件——macOS 权限提示(麦克风、语音)需要应用包中的 Info.plist。
权限(仅需设置一次)
首次启动时,Griasa 会请求所需的所有权限。如果没有出现提示,请在系统设置 → 隐私与安全性中手动授权:
| 权限 | 用途 |
|---|---|
| 麦克风 | 听写与录音 |
| 语音识别 | 设备端转录 |
| 辅助功能 | 全局快捷键与插入文本(⌘V 合成) |
| 屏幕录制 | 系统音频采集(macOS 会要求应用音频通过此权限) |
授予辅助功能或屏幕录制权限后,请退出并重新启动 Griasa。
签名与权限稳定性:macOS 会将隐私授权与应用的代码签名绑定。build.sh 使用本地自签名证书(“Griasa Dev Signing”,在登录钥匙串中创建一次)进行签名,因此应用身份和权限授权会在重新构建后保留。如果证书缺失,脚本会回退到临时签名并发出警告(使用临时签名时,每次重新构建都会被视为一个新应用,权限也会重置)。如需重新创建证书:生成带有 codeSigning EKU 的自签名证书,将 .p12(旧版格式)导入登录钥匙串,然后使用 security add-trusted-cert -r trustRoot -p codeSign 将其设为信任证书。如果权限状态混乱,可使用 tccutil reset All am.stari.griasa 清除权限,然后重新授权一次。
使用方法
听写
- 点击任意应用中的任意文本字段。
- 按住右 Option(⌥) — 菜单栏麦克风会填满。
- 开始说话 — 说话时,文字会实时出现在光标处(即时本地设备识别器)。
- 松开按键 — 实时文本会在原处更正为润色后的 Whisper + AI 清理版本(仅重写不同的尾部内容,通过合成按键的差异来实现)。
可以在“设置”→“听写”中关闭实时输入(这样所有内容都会在最后一次性粘贴)——适用于合成按键表现异常的应用(例如,启用了激进自动补全的字段)。
Griasa 会在菜单栏面板和“设置”→“系统”中保留一个累计的节省时间计数器(听写字数 × 每分钟打字 40 字与每分钟说话 150 字之间的差值)。
首次启动时,中心会打开一份欢迎指南:包含快速入门,以及一份实时清单,列出三项系统权限;每项权限都提供一键跳转,可打开相应的“系统设置”页面,并说明拒绝权限后哪些功能仍可使用。你可以随时从“设置”→“系统”重新打开该指南。
AI 清理使用已配置的AI 提供商(见下文)。如果未配置,或调用失败,则会改用本地的基于规则的清理,因此听写始终可以离线使用。
AI 提供商 — 默认使用本地模型;也可按需选择 Anthropic、OpenAI、Gemini 或现有订阅
所有 AI 功能都通过一个可配置的提供商运行(设置 → AI 与操作)。新安装默认使用本地模型——除非有人选择云端提供商,否则不会向云服务商发送任何内容。
- 本地(默认) — 无需密钥,也无需手动安装任何内容。Griasa 会检查 Mac 的内存和可用磁盘空间;如果 Ollama 或 LM Studio 中已有模型,就会使用该模型;否则会询问一次,是否下载一个适合 Mac 内存容量的模型(约 3 GB 到 37 GB),并将其安装到自己的引擎中,地址为
127.0.0.1:8177。如果 Mac 支持 Apple 设备端模型,简短的英文文本清理任务会交由该模型处理。输入到设置中的服务器地址或模型名称(customBaseURL、customFastModel、customSmartModel)绝不会被替换。模型准备就绪前结束的会议会在之后生成摘要。如果没有本地模型正在运行,首次执行 AI 操作时会说明原因及解决方法。配合内置的本地 Whisper,Griasa 随后即可完全离线运行——文本绝不会离开 Mac。(组织: MDM 指南。) - Anthropic(Claude) — 可在设置中填写密钥,或使用
ANTHROPIC_API_KEY。在设置中输入的密钥会保存在 macOS 登录钥匙串中,绝不会写入偏好设置文件。 - OpenAI — 可在设置中填写密钥,或使用
OPENAI_API_KEY(默认使用 GPT-5.6 系列)。 - Google(Gemini) — 可在设置中填写密钥,或使用
GEMINI_API_KEY(通过 Google 的 OpenAI 兼容端点;默认使用 Gemini 3.x)。 - Claude Code(订阅) / Codex CLI(ChatGPT 订阅) — 完全无需 API 密钥:如果已安装并登录
claude或codexCLI,Griasa 就会通过它来回答,费用计入你已付费的订阅。系统会自动检测(也可选择覆盖路径);每次请求预计需要约 5–10 秒——非常适合会议记录、资料汇编和文档处理;但对于;tldr等输入路径功能,速度会比 API 密钥慢。(CLIRunner.swift)
每个提供商都有一个快速模型(用于听写清理、提醒解析、分类和回复草稿)和一个智能模型(用于预设、摘要、询问项目和会议记录);默认值经过合理设置(Haiku 4.5/Opus 4.8、GPT-5.6 Luna/Terra、Gemini 3.1 Flash-Lite/3.5 Flash;手动设置的本地服务使用 Qwen3 8B/30B——Griasa 自行设置的模型同时承担这两类任务),并且可以编辑——对于本地端点,加载模型列表按钮会显示实际已安装的模型,测试则会向提供商发送请求并报告延迟。对于本地模型,会议转录文本会按上下文预算截短(Griasa 设置的模型为 38k 个字符,为回复留出空间;手动设置的服务器默认值为 24k,可配置;云端模型为 400k)。在本地模型成为默认选项之前安装的版本,如果已有云端密钥且未保存任何选择,则会继续使用该提供商——粘贴密钥本身就代表做出了选择。如果所选提供商失败——常见情况是本地模型未运行——且云端提供商也可用,明确触发的操作会在通过云端重新发送该请求前征求同意(“每次都询问”,另有直到重新启动为止选项);听写清理和后台分类不会询问,而是静默降级。(LLMProvider.swift、AIFormatter.swift)
语音引擎
Griasa 首选 Whisper(whisper.cpp,large-v3-turbo)——准确度远超 Apple 识别器,完全在本地运行,并由模型原生支持真正的自动语言检测。
首次启动时会自动完成设置:如果尚未安装,应用会通过 Homebrew 安装 whisper-cpp,并将 1.6 GB 的模型下载到 ~/Library/Application Support/Griasa/。下载进度会显示在菜单栏菜单和“设置”→“语音引擎”中(如果出现问题,还会提供“重试”按钮)。应用只假设你已安装 Homebrew;如果没有,应用会告知你,并继续使用 Apple 引擎。
**每个模型在使用前都会经过检查。**下载来自固定的仓库提交版本,而非分支;在移入指定位置之前,会根据写入应用中的 SHA-256 和文件大小进行验证(ModelManifest.swift)——不匹配的文件绝不会安装。更新后,磁盘上已有的模型会检查一次并记录结果;检查失败的模型会重命名为 *.unverified,并替换为经过验证的下载文件。手动操作方式:
brew install whisper-cpp
curl -L -o ~/Library/Application\ Support/Griasa/ggml-large-v3-turbo.bin \
https://huggingface.co/ggerganov/whisper.cpp/resolve/5359861c739e955e79d9a303bcbc70fb988958b1/ggml-large-v3-turbo.bin
shasum -a 256 ~/Library/Application\ Support/Griasa/ggml-large-v3-turbo.bin
# expect 1fc70f774d38eb169993ac391eea357ef47c88757ef72ee5943879b7e8e2bc69
Griasa 会在本地运行已加载模型的 whisper-server,因此释放热键后几乎可以立即完成听写转录,会议音频片段也无需每次都重新加载模型。缺少 whisper-cli 或模型时,所有功能都会回退到 Apple 识别器。
会议转录的时间线正确无误:whisper.cpp 内置的 --vad 会拼接语音片段并连续重新计时,因此长时间停顿后的文本会向前漂移(上游 issue #3634)。Griasa 通过自行运行 Silero VAD(whisper-vad-speech-segments)避免了这个问题:从音频中切出每个语音片段,利用已热加载的服务逐段转录,并为每段标注其真实起始时间——即使经过长时间静音,各片段仍会按真实时间顺序排列。无界面模式可在任何过往录音上重新运行此流程:"./Griasa Dev.app"/Contents/MacOS/Griasa --transcribe "<recording folder>"。
自动语言检测
- Whisper:语言检测由模型原生支持(
-l auto),无需配置。 - Apple 回退引擎:Apple 识别器每次请求都需要固定区域设置,因此 Griasa 会为每种已配置语言并行运行一个识别器(“设置”→“听写”→“语言”,默认为
en-US, ru-RU),并保留置信度得分最高的转录结果——听写时按短语选择,会议时按每个 30 秒片段选择。
混入的英语科技/加密货币术语通过两种方式处理:
- 内置词汇表(Vocabulary.swift:GitHub、deploy、staking、jetton、seed phrase、mainnet……)以及你在“设置”中添加的术语,会作为初始提示词提供给 Whisper,并作为上下文提示提供给 Apple 识别器。
- 清理提示词会指示模型保留英语术语、不进行翻译,并修正按发音音译的术语(“гит хаб”→“GitHub”),同时不翻译文本的其他部分。
对所选文本应用提示词预设(适用于任何应用)
在任意位置(浏览器、Slack、PDF 等)选择文本,然后通过菜单或热键应用提示词预设。内置预设包括“总结”(⌃⌥⌘S)、“修正文法”(⌃⌥⌘G)、“翻译成英语”、“改为专业表达”、“转换为项目符号”和“改写为提交说明”。可编辑预设中会改写文本的预设(修正文法、翻译等)会显示“替换所选内容”按钮;总结预设不会。
添加自己的预设:前往“设置”→“AI 与操作”,填写名称、表情符号、给模型的指令、是否替换所选内容,以及可选的热键。默认使用三个修饰键 ⌃⌥⌘,因为 macOS 上的全局热键无法被拦截——最前端应用也会收到按键,因此组合键必须是没有任何应用绑定的组合。Griasa 会等你松开修饰键后再读取所选内容(按住修饰键时模拟 ⌘C 可能会被某些应用当作纯文本输入,从而清除所选内容);你的剪贴板会先保存,再恢复。
历史记录与导出
每次听写、会议转录和预设结果都会保存到可搜索的历史记录窗口中(菜单 → 历史记录…)。搜索全文,然后复制、插入、显示文件或导出。数据在本地保存于 ~/Library/Application Support/Griasa/history.json(最近 500 条记录)。
导出(在历史记录中或任意结果弹出窗口中)无需外部服务或身份验证:
- 另存为… → Markdown(
.md)、PDF、HTML、RTF 或纯文本。 - 复制为富文本 → 可直接粘贴到 Google Docs、Notion、Confluence、Word 或 Slack,并保留格式(标题、粗体、项目符号)。
Markdown 可顺利导入 Notion/Obsidian/GitHub;HTML 和 RTF 粘贴到 Docs/Confluence 时会保留格式;PDF 可直接打印。(Exporter.swift — 一个小巧、无依赖的 Markdown→HTML 转换器,为 macOS 的富文本和打印系统提供输入。)
捕获(任意应用)
四种系统级操作,每种都有对应的菜单项和可配置的快捷键(设置 → 捕获):
- ⏰ 提醒我 (⌃⌥⌘R) — 可从所选文本创建提醒;如果没有选中文本,也可以拖动屏幕区域。光标处会弹出类似 Slack 的菜单:20 分钟后 / 1 小时后 / 3 小时后 / 明天 9:00 / 下周一 9:00 / 自定义…(日期选择器),还有 从文本提取,由模型直接从文本中读取截止时间(例如“завтра в 3”“in 2 hours”)。固定时间无需 API 密钥。提醒会保存到提醒事项 App,因此会同步到你的 iPhone/Watch。每条提醒都会记录来源:在备注中注明来源 App 和窗口标题(Slack 工作区/频道、Telegram 聊天),如果来自浏览器,还会记录标签页 URL,并附带跳转到所捕获文本位置的锚点——作为提醒链接,一键即可返回原文位置。通过拖动区域创建的提醒还会将裁剪的图像保存到
Documents/Griasa/Reminders/,并在提醒中附上链接(EventKit 无法直接附加文件),这样你保留的不只是 OCR 文本,还有图像本身。(ReminderSource.swift;浏览器 URL 需要为每个浏览器一次性授予自动化权限。) - 🔤 区域 OCR (⌃⌥⌘O) — 拖动矩形区域;其中的文本会在设备上识别(Apple Vision,支持俄语和英语,离线运行),并复制到剪贴板。适用于图像、PDF,以及他人共享的屏幕。
- 💬 起草回复 (⌃⌥⌘Y) — 通过 OCR 读取最前面的聊天窗口,并以相同语言和语气起草符合上下文的回复。通用适用:Telegram、Slack、Gmail 及任何 App。替换所选内容会将回复粘贴回去。
- 从剪贴板运行(菜单)— 针对当前剪贴板内容运行任意提示词预设,无需选择文本。
- ✂️ 片段 — 在任意 App 中输入缩写(如
;meet、;sig),即可在原处展开,也可从菜单插入。模板支持动态占位符,并会在插入时解析:{date}{date+3d}{time}{clipboard}{meetlink}(你在设置中配置的永久 Zoom/Meet 会议室链接)、{slot}/{slots:3}(日历中最近的空闲时段——EventKit 只读,可配置工作时间)、{commitments}/{commitments:mine}/{commitments:theirs}(“承诺事项”标签页中的未完成承诺,以项目符号列出,并附上来源会议、日期和截止时间——;todos可将你的承诺粘贴到任意状态更新中),以及{ai: instruction}。默认的;meet会生成类似 “Would Tue 21 Jul, 15:00 work for you? Here's my room: …” 的文本。设置 → 片段。 - ✨
;ai … ;;— 无需离开句子即可提问。 在任意 App 中输入;ai,写下问题,再用;;结束,整段内容就会在原处替换为答案:;ai как по-английски "предварительный расчёт";;。无需设置片段——此功能已内置,而且会读取两个标记之间的所有内容,因此问题长度不限。按 Escape 或移动插入点即可取消;如果模型运行失败,你输入的文本会原样恢复。(SnippetExpander.swift) - ✨
{ai:}— 可在任意文本框中输入的 AI。{ai: instruction}占位符会在光标所在位置插入模型生成的内容,而且占位符支持嵌套,因此提示词可以使用实时上下文:;tldr会将{ai: Summarize in 3 bullets: {clipboard}}展开为对你复制内容的摘要,;en会将剪贴板内容翻译成英语,而一行自定义片段就能把任何重复的写作任务(礼貌拒绝、站会开场白、提交说明风格)变成三次按键。适用于 Slack、Jira、代码审查等任何需要输入文本的场景。(依托模型的知识和你的本地上下文;不会浏览网页。)
屏幕/窗口捕获会复用屏幕录制权限;提醒功能会请求一次“提醒事项”访问权限。(CaptureController.swift、OCR.swift、RegionCapture.swift、WindowCapture.swift、Reminders.swift)
面向远程团队负责人:承诺、人员、会议准备、文档
- ✅ 承诺 — 每次记录会议后,系统都会在后台提取通话中作出的承诺(谁负责什么、截止时间是什么时候——“周五前”会变成真实的到期日期标签),并将其放入「承诺」标签页,分为我的承诺和等待他人兑现。勾选完成项,点一下即可将任意承诺发送到 Apple Reminders(它会在你的 iPhone 上提醒你),也可以手动添加;点击一下即可跳转到来源会议。菜单栏项目会显示未完成项的数量。导出可将未完成列表复制为 Markdown 任务清单(Notion/Obsidian/GitHub),或复制为每行一项的简洁任务列表——Todoist、Things 和 Linear 会将多行粘贴内容转换为单独的任务,并包含到期日期。
;todos代码片段可在你输入的任何位置粘贴未完成的承诺。(Commitments.swift) - 📇 人员 — 为每位同事创建一个页面,根据会议名单自动生成,无需任何设置:包含你的自由格式笔记(自动保存)、与对方参加过的所有会议、对方未兑现的承诺,以及按需生成的 AI 档案——根据对方出现过的会议转录内容撰写,涵盖职务与负责范围、兑现承诺的情况、工作风格和近期话题。(People.swift、PeopleView.swift)
- 📋 会议准备 — 在包含参会者或通话链接的日历事件开始前几分钟(可在「设置」→「会议」中配置提前时间),「准备」标签页会滑入显示,不会抢走键盘焦点:谁会参加通话(附带你的笔记和对方未兑现承诺的数量)、上次与这些人开会时讨论了什么、你向他们承诺了什么以及他们向你承诺了什么——还有一个加入并录制按钮,一键打开 Zoom/Meet/Teams 链接并开始录制。也可按需打开:菜单 → 准备下次会议。(MeetingPrep.swift)
- 📄 新建文档 — 选择一个模板(PRD、RFC、单页文档、复盘报告——均可编辑,也可在「设置」→「AI 与操作」中添加自定义模板),口述或粘贴简介,然后由智能模型填充模板各章节。简介中未提及的内容会如实标为 待定,并附上需要回答的问题——绝不编造事实。结果可直接编辑,点一下即可复制,并会保存到历史记录中,同时自动归档到某个项目。(DocTemplates.swift)
项目(整理所有内容并向其提问)
每条历史记录——听写、会议、采集结果——都会自动归档到某个项目:快速模型会根据每个项目的名称和描述(「设置」→「项目」)匹配条目;不确定或处于离线状态时则归入收件箱。可在「历史记录」窗口中重新分配任意条目(在详情窗格中使用项目选择器,或在侧边栏中筛选),还可运行一次分类现有历史记录,为该功能推出前记录的所有内容归档。
每个项目都会以纯 Markdown 格式映射到磁盘:~/Documents/Griasa/Projects/<Project>/YYYY-MM-DD-HHmm-<kind>-<id>.md,并带有 YAML frontmatter——可浏览、适合与 git/Obsidian 配合使用,而且永远不会被删除(移除项目时,其文件会移至收件箱)。
🗂 询问项目(⌃⌥⌘P 或通过菜单打开)会打开一个窗口,由智能模型以项目条目以及附加的源文件夹为上下文回答问题——可附加代码仓库、文档文件夹或其他内容;文本文件会按条目从新到旧的顺序读取,最多约 150k 个字符。回答会保存回项目的历史记录中。(Projects.swift、ProjectFiles.swift、ProjectAI.swift、AskProjectWindow.swift)
让助手读取你的会议(MCP)
开启 Settings → System → AI assistants (MCP) 后,Griasa 会在这台 Mac 上提供一个只读端点(127.0.0.1,端口 8179 或下一个可用端口,Bearer 令牌)。它可以回答八类问题:未兑现的承诺(你做出的承诺和你正在等待他人兑现的承诺)、某位同事、按关键词搜索会议、某场会议的摘要、会议转录(仅在有人请求时提供)、下一场会议的简报、人员、项目。无法通过它更改任何内容。
- Claude Desktop — 一键安装。 按下 Add to Claude Desktop。Griasa 会将
Griasa.mcpb写入其存储文件夹,并在 Claude Desktop 中打开;Claude Desktop 会要求你确认安装。该扩展是一个小型 Node 脚本(Node 内置于 Claude Desktop),负责将 Claude 的请求转发给应用;它每次都会从mcp.json读取端口和令牌,因此令牌更新或端口变更都不需要重新安装。Griasa 必须处于运行状态 — 如果没有运行,Claude 会提示你从菜单栏打开它。 - Claude Code、Codex、Cursor 及其他客户端。 按下 Copy client configuration,并将配置块粘贴到客户端的 MCP 设置中。配置块的样子如下:
{"mcpServers": {"griasa": {"type": "http", "url": "http://127.0.0.1:8179/mcp", "headers": {"Authorization": "Bearer …"}}}}。 - 协议。 Streamable HTTP,MCP 2026-07-28(无状态;
server/discover;每个请求都携带版本和标头),并在同一端点支持使用initialize握手的 2025-06-18 和 2025-11-25 客户端。工具包含标题、只读注释和输出架构。源码:MCPEndpoint.swift、MCPTools.swift、MCPBundle.swift。
助手读取的内容会被发送到该助手上下文所去的地方;会议转录是单独的工具,因此关于承诺的问题不会意外拉取会议转录。
通话期间的实时笔记
启用 Show live notes while recording(Settings → Meetings)。录音期间,中心页的 Recording tab 会使用已预热的 Whisper 服务,每隔约 18 秒分块转录双方音轨,并显示实时摘要(标题、要点、待解问题、行动事项)。开启 Auto 开关后,摘要每分钟刷新一次;也可以选择仅在按下 ⟳ Summarize now 时刷新。转录下方有一个笔记字段:你输入的任何内容都会以当前时间码固定到转录中(📝 行),作为高信号输入传给实时摘要,并融入最终会议笔记 — 模型会在 Summary/Key points/Action items 中体现你的笔记,并在转录中将其保留为 > 📝 **Note [mm:ss]:** 引用块。
无人停止的录音会在静音后停止
过去,如果录音时无人说话,录音会一直持续,直到有人发现 — 有一次录音整夜未停,填满了磁盘。当麦克风和 Mac 自带音频都持续一段时间没有检测到语音时,会弹出一个小窗口询问是否继续。Keep recording 会重新启动计时器,因此再次等待同样的时长后会再次询问,而不是只询问一次;如果没有回应,录音会自动停止,转录方式与手动停止完全相同,且转录的最后一行会说明录音已自动停止以及持续了多久。这两个时间间隔都可在 Settings → Meetings → Silence 中设置(默认分别为五分钟和两分钟)。如果问题弹出时语音恢复,问题会消失,录音继续。(SilenceWatch.swift、SilenceLevel.swift)
一个集线器窗口,告别弹窗泛滥
所有内容都集中在一个带标签页的浮动集线器窗口中:操作结果、实时录音标签页、自定义提醒日期选择器、“通话中有哪些人?”问题、Ask Project 和历史记录。忙碌时刻——一边录制通话,一边根据预设结果设置提醒——只需一个包含三个标签页的窗口,而不是三个争抢焦点的窗口。关闭标签页会妥善结束对应流程(关闭的提醒会删除其孤立录音片段;关闭参与者标签页会视为“跳过”,确保转录流程不会停滞)。标签页旁的固定按钮可在切换应用时让窗口保持打开状态——面板默认会在失去激活状态时隐藏,这适合弹窗,却不适合花一小时查看历史记录。只有设置(标准 macOS 设置场景)和系统对话框(文件保存/打开、区域拖拽截屏叠层)会留在窗口之外。(HubWindow.swift)
说话人姓名
设置你的姓名并启用询问通话参与者(设置 → 会议)。录音停止后,Griasa 会询问哪些已知人员参与了通话(名单会被记住),以及是否有新成员;模型会根据自我介绍、彼此直呼姓名等对话线索,将转录内容归属到真实姓名,而不是笼统的“你”/“他们”。这种归属方式基于内容(两条音轨分别是麦克风和其他所有音频,并非按说话人分轨),因此提供名单时准确度最高。
会议录音 + AI 转录
- 菜单栏 → 开始录音(或在设置中启用启动 Griasa 时开始录音,以便始终捕获音频)。
- 停止录音后,Griasa 会自动:
- 在设备上按 30 秒分段转录两条音轨,并添加时间戳(所有受支持的提供商都只处理文本,因此语音转文本始终在本地完成——只有文本会离开设备)。
- 按时间顺序交错合并两条音轨,生成
You:/Them:对话(transcript-raw.txt)。 - 将对话发送给已配置的智能模型,由其修正识别错误并生成
meeting-transcript.md,其中包含摘要、要点、行动项以及整理过并标注说话人的转录内容,然后打开该文件(可切换此选项)。
- 没有 API 密钥时,仍会在
meeting-transcript.md中生成合并后的原始转录。 ~/Documents/Griasa Recordings/<timestamp>/下的每个会话文件夹都包含:microphone.caf— 你的语音system-audio.caf— Mac 播放的所有音频(通话参与者、视频……)transcript-raw.txt— 带时间戳的合并对话meeting-transcript.md— AI 整理的会议记录
- 此外,每份完成的转录内容都可以复制到镜像文件夹,由你指定路径(设置 → 文件夹 → 转录镜像文件夹;默认留空,因此除非你主动设置,否则不会重复保存)。将其指向编码 Agent 的项目目录、Obsidian 库或 git 仓库,会议记录就会以纯 Markdown 文件的形式出现在其中。
- 会话运行时,菜单栏图标会显示红色录音标记;模型处理期间,菜单中会显示进度。
⚠️ 同意:根据你所在的司法管辖区,录制通话可能需要取得所有参与者的同意(许多地方要求双方同意)。请告知他人你正在录音。
架构
Sources/Griasa/
├── GriasaApp.swift # MenuBarExtra app entry
├── AppState.swift # Central state + settings (UserDefaults)
├── HotkeyMonitor.swift # Global flagsChanged monitor (hold-to-talk)
├── MicCapture.swift # Single shared AVAudioEngine mic tap, multi-consumer
├── DictationEngine.swift # Parallel per-language recognizers, best-confidence pick
├── Vocabulary.swift # Built-in tech/crypto contextual vocabulary
├── LLMProvider.swift # Provider config (Anthropic/OpenAI/Gemini/local) + fallback consent
├── AIFormatter.swift # Provider router, dictation cleanup + local fallback
├── TextInserter.swift # Pasteboard swap + synthetic ⌘V
├── SystemAudioCapture.swift # ScreenCaptureKit audio stream → .caf
├── ConversationRecorder.swift # Session folders, mic+system tracks
├── WhisperTranscriber.swift # whisper.cpp integration (preferred engine)
├── WhisperInstaller.swift # First-launch auto-install: brew + model download
├── FileTranscriber.swift # Apple-recognizer fallback (chunked, timestamped)
├── MeetingTranscriber.swift # Merge tracks + AI meeting-notes formatting
├── Permissions.swift # TCC requests/status
├── SelectionActions.swift # Global preset hotkeys, selection grab
├── PromptPresets.swift # Prompt-preset model + store (built-in + custom)
├── HubWindow.swift # The shared tabbed hub window all activities open in
├── PopupController.swift # Result tab content (preset/action output)
├── HistoryStore.swift # Persistent searchable history
├── HistoryWindow.swift # History browser (hub tab)
├── Participants.swift # Speaker roster + "who's who" prompt
├── LiveNotes.swift # Realtime transcript, typed notes + running summary
├── LiveTyper.swift # Synthetic keystrokes for live dictation typing
├── CaptureController.swift # Capture actions: remind / OCR / draft reply / clipboard
├── CaptureAI.swift # AI calls for reminder parsing + reply drafting
├── OCR.swift # On-device text recognition (Apple Vision)
├── RegionCapture.swift # Interactive screen-region screenshot
├── WindowCapture.swift # Frontmost-window screenshot
├── Reminders.swift # EventKit reminder creation
├── ReminderSource.swift # source app / window / tab URL for reminders
├── Projects.swift # Project model + store (auto-categorized history)
├── ProjectFiles.swift # Markdown mirror: one .md per entry per project
├── ProjectAI.swift # AI classification + Ask Project context/Q&A
├── AskProjectWindow.swift # Ask Project window (question → answer over context)
├── Exporter.swift # Markdown → MD/PDF/HTML/RTF/plain export + rich copy
├── Prompts.swift # EVERY system prompt, in one place (JSON-overridable)
├── Snippets.swift # Snippet model + store (defaults incl. ;meet)
├── SnippetEngine.swift # Placeholder rendering: date/clipboard/meetlink/slot/ai
├── SnippetExpander.swift # Type-anywhere abbreviation expansion + `;ai … ;;` inline ask
├── FreeSlotFinder.swift # EventKit free-slot search for {slot}
├── Commitments.swift # Promise model/store + AI extraction from meetings
├── CommitmentsView.swift # ✅ Commitments hub tab (mine / theirs / done)
├── People.swift # Person pages store, avatars, AI dossier
├── PeopleView.swift # 📇 People hub tab (notes, meetings, promises)
├── MeetingPrep.swift # Calendar watcher + pre-meeting brief assembly
├── PrepView.swift # 📋 Prep hub tab (countdown, Join & Record)
├── DocTemplates.swift # Editable PRD/RFC/1-pager/postmortem templates + generator
├── NewDocumentView.swift # 📄 New Document hub tab (brief → filled draft)
├── OnboardingView.swift # First-launch welcome guide + live permission checklist
├── UsageStats.swift # Lifetime dictation counters ("time saved vs typing")
├── UpdateChecker.swift # Daily GitHub-Releases update check (pre-Sparkle)
├── BuildConfig.swift # ← fork here: support email, donate URL, update repo
├── Support.swift # Donate / feedback actions driven by BuildConfig
├── HubStyle.swift # Shared hub visual language: cards, empty states
├── MenuView.swift # Menu-bar popover UI
└── SettingsView.swift # Settings window
设计说明:
- 一个麦克风采集,多处使用 —
MicCapture安装一个AVAudioEngine采集点并将缓冲区分发给多个使用方,因此听写和录音不会争用输入设备。 - 隐私优先的转录 — 当语言区域支持时,Apple 识别器会在设备上运行(
requiresOnDeviceRecognition)。只有简短的润色步骤会将文本(绝不发送音频)发送给已配置的提供商,而且只有在你启用该功能后才会发送。 - 通过 ScreenCaptureKit 捕获系统音频 — 这是 macOS 13+ 上捕获应用音频的受支持方式;视频通道配置为 2×2 px、1 fps 的流,然后丢弃。
已知限制 / 想法
- 说话人分离目前仅支持两方(“你”=麦克风,“对方”=系统音频);无法区分多个远程参与者。使用 Whisper.cpp 加上说话人分离功能可以改进这一点。
- 目前还没有个人词典或免手操作切换模式。
Prompts.swift(键dictationCleanup)是注入自定义词典的位置。 - 录音会保留为两个独立音轨,而不是混合成一个文件;这是有意为之(转录文本更清晰),不过可以通过
ffmpeg -filter_complex amix后处理步骤生成单个文件。 - 使用的模型是 large-v3-turbo——根据已发布的基准测试,其平均 WER 仅比完整的 large-v3 高约 0.4 个百分点,同时速度约快 4 倍,因此适用于听写延迟和会议处理量。如果未来俄语准确度比速度更重要,可将
ggml-large-v3.bin放入~/Library/Application Support/Griasa/(3 GB),并更新WhisperTranscriber.swift中的文件名。 - Whisper 每个语音片段只检测一种语言;句中频繁切换语言时,结果可能会以占主导地位的语言输出(AI 清理步骤会修正技术术语)。
- Apple 备用语言检测会并行地为每种配置的语言运行一个识别器——请保持语言列表较短(2–3 种)。
许可证
GPL-3.0。构建、修改并分享——衍生作品也必须遵循相同许可证开源。如果 Griasa 为你节省了时间,欢迎点击菜单中的 ♥ 按钮表示支持。
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。