一款轻量、macOS 原生、本地优先的会议录音与纪要应用。
中文 · English
Important
MMListener 仍处于早期阶段。开始录音前,请确认你已获得所有参与者的同意,并遵守所在地关于录音和隐私的法律。
- 麦克风与系统音频双轨 M4A 录制
- 本地 SQLite 会议库、分组与手写备注
- 基于 macOS 26 系统语音能力的本地离线转写
- 使用大模型修复双轨转写,并生成结构化 Markdown 纪要
- 支持 OpenAI、DeepSeek、GLM、Kimi、MiniMax、Qwen 和自定义 OpenAI-compatible API
- API Key 存放于 macOS 钥匙串
- 隐藏到菜单栏或显示实时音量悬浮卡片
- 导出 Markdown 或纯文本
录音、转写、备注、纪要和会议数据库默认保存在本机的:
~/Library/Application Support/MMListener/
应用不包含遥测或自建服务器。使用系统离线转写时,音频由 macOS 的本地语音能力处理。只有当你主动使用“恢复对话”或“生成总结”等大模型功能时,会议标题、笔记和转写文本才会发送到你选择的模型 API;模型列表请求也会访问相应服务商。详见 隐私说明。
- macOS 14 或更高版本
- 本地离线转写需要 macOS 26,并由系统按需准备语言资源
- 当前 Release 中的预构建 DMG 面向 Apple Silicon
从源码构建还需要 Xcode 26 或兼容的 Swift 6 工具链。
Release 使用 ad-hoc 签名,未使用 Apple Developer ID 签名和公证。因此,即使文件没有损坏,macOS Gatekeeper 也可能提示“无法验证开发者”,或者“已损坏,应该移到废纸篓”。
-
从 Releases 下载最新的
MMListener-<version>-arm64.dmg。 -
在 Release 页面展开安装包信息,核对 GitHub 显示的 SHA-256。也可以在终端计算下载文件的 SHA-256:
shasum -a 256 ~/Downloads/MMListener-<version>-arm64.dmg
-
打开 DMG,将 MMListener 拖入 Applications,确保最终路径是
/Applications/MMListener.app。 -
先尝试从 Applications 正常打开应用。如果只提示“无法验证开发者”,可以按住 Control 点击应用,选择“打开”,再次确认“打开”;也可以前往“系统设置 → 隐私与安全性”确认放行。
只有在安装包来自本仓库 Releases、SHA-256 已核对一致时,才执行以下操作:
-
取消“移到废纸篓”,不要删除应用。
-
在终端验证 App Bundle 的签名完整性:
codesign --verify --deep --strict --verbose=2 /Applications/MMListener.app
校验成功时命令不会输出错误。如果校验失败,请删除应用并重新下载,不要自行重新签名。
-
移除 Gatekeeper 下载隔离属性并启动应用:
xattr -dr com.apple.quarantine /Applications/MMListener.app open /Applications/MMListener.app
如果
xattr提示权限不足,再仅为该命令加sudo:sudo xattr -dr com.apple.quarantine /Applications/MMListener.app
Warning
xattr 只移除下载隔离属性,不会修复损坏的文件或无效签名。不要对来源不明或 SHA-256 不一致的应用执行此命令。
- 首次录音时允许“麦克风”和“屏幕与系统音频录制”。屏幕与系统音频授权后,macOS 可能要求重启应用。
- 首次转写时允许“语音识别”,并等待系统准备离线语言资源。
- 始终从
/Applications/MMListener.app启动,避免权限被记录到开发目录副本或终端进程。
ad-hoc 构建升级后,如果系统设置显示已授权,但应用仍提示无权限:
- 从顶部菜单退出 MMListener,并确认菜单栏图标消失。
- 确保启动的是
/Applications/MMListener.app,而不是开发目录中的副本。 - 在“设置 → 权限诊断”中点击“重置三项权限记录并退出”。
- 重新启动 Applications 中的应用并依次授权。
- 点击工具栏的“录音”开始会议;MMListener 会分别保存麦克风和系统音频。点击“停止”结束录音。
- 在左侧会议列表中选择会议。可以新建分组、移动会议、折叠分组或使用批量管理。
- “笔记”用于手写记录;“转写”显示 macOS 本地语音识别结果。
- 配置模型后,在“原文”中将零散转写恢复为自然的“我 / 其他人”对话,在“纪要”中生成结构化会议总结。
- 点击右上角“导出”,选择“导出原文”或“导出纪要”,再选择 Markdown 或纯文本。原文和纪要会分别导出,不会互相混入。
- “小卡片”会显示悬浮录音卡片;“隐藏”会把主窗口收至菜单栏。录音中的状态仍可从对应入口恢复。
在“设置”中选择服务商,填写 Base URL、模型 ID 和 API Key。远程接口必须使用 HTTPS;本地 OpenAI-compatible 服务可使用 localhost、127.0.0.1 或 ::1 的 HTTP 地址。Ollama 的常用地址为:
http://127.0.0.1:11434/v1
API Key 保存于 macOS 钥匙串,不写入项目文件或会议数据库。发送给第三方模型的数据仍受对应服务商条款约束。
swift run MMListener通过 Swift Package 直接运行时,权限可能显示归属于终端。验证真实权限流程时,请构建 App Bundle:
./scripts/build-app.shswift test
swift build -c release --product MMListener
./scripts/build-dmg.shApp 和 DMG 会生成到被 Git 忽略的 dist/ 目录。
Sources/MMListener/
├── App/ 应用状态与窗口协调
├── Audio/ 麦克风和系统音频采集
├── Models/ 会议领域模型
├── Settings/ 服务商、钥匙串与权限状态
├── Storage/ SQLite 持久化
├── Summary/ OpenAI-compatible 模型调用
├── Transcription/ Apple 本地语音转写
└── Views/ SwiftUI 界面
欢迎提交问题、功能建议和 Pull Request。开始前请阅读 贡献指南、行为准则 和 安全策略。
本项目使用 MIT License。