Skip to content

About

Local-first macOS meeting recorder, offline transcription, and AI summaries

Topics

Resources

Code of conduct

Contributing

Security policy

Stars

2 stars

Watchers

0 watching

Forks

Repository files navigation

MMListener

MMListener 图标

一款轻量、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 也可能提示“无法验证开发者”,或者“已损坏,应该移到废纸篓”。

  1. 从 Releases 下载最新的 MMListener-<version>-arm64.dmg。

  2. 在 Release 页面展开安装包信息,核对 GitHub 显示的 SHA-256。也可以在终端计算下载文件的 SHA-256:

    shasum -a 256 ~/Downloads/MMListener-<version>-arm64.dmg
  3. 打开 DMG,将 MMListener 拖入 Applications,确保最终路径是 /Applications/MMListener.app。

  4. 先尝试从 Applications 正常打开应用。如果只提示“无法验证开发者”,可以按住 Control 点击应用,选择“打开”,再次确认“打开”;也可以前往“系统设置 → 隐私与安全性”确认放行。

出现“移到废纸篓”时

只有在安装包来自本仓库 Releases、SHA-256 已核对一致时,才执行以下操作:

  1. 取消“移到废纸篓”,不要删除应用。

  2. 在终端验证 App Bundle 的签名完整性:

    codesign --verify --deep --strict --verbose=2 /Applications/MMListener.app

    校验成功时命令不会输出错误。如果校验失败,请删除应用并重新下载,不要自行重新签名。

  3. 移除 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 不一致的应用执行此命令。

首次授权

  1. 首次录音时允许“麦克风”和“屏幕与系统音频录制”。屏幕与系统音频授权后,macOS 可能要求重启应用。
  2. 首次转写时允许“语音识别”,并等待系统准备离线语言资源。
  3. 始终从 /Applications/MMListener.app 启动,避免权限被记录到开发目录副本或终端进程。

权限异常修复

ad-hoc 构建升级后,如果系统设置显示已授权,但应用仍提示无权限:

  1. 从顶部菜单退出 MMListener,并确认菜单栏图标消失。
  2. 确保启动的是 /Applications/MMListener.app,而不是开发目录中的副本。
  3. 在“设置 → 权限诊断”中点击“重置三项权限记录并退出”。
  4. 重新启动 Applications 中的应用并依次授权。

基本使用

  1. 点击工具栏的“录音”开始会议;MMListener 会分别保存麦克风和系统音频。点击“停止”结束录音。
  2. 在左侧会议列表中选择会议。可以新建分组、移动会议、折叠分组或使用批量管理。
  3. “笔记”用于手写记录;“转写”显示 macOS 本地语音识别结果。
  4. 配置模型后,在“原文”中将零散转写恢复为自然的“我 / 其他人”对话,在“纪要”中生成结构化会议总结。
  5. 点击右上角“导出”,选择“导出原文”或“导出纪要”,再选择 Markdown 或纯文本。原文和纪要会分别导出,不会互相混入。
  6. “小卡片”会显示悬浮录音卡片;“隐藏”会把主窗口收至菜单栏。录音中的状态仍可从对应入口恢复。

使用模型生成原文和纪要

在“设置”中选择服务商,填写 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.sh

测试与打包

swift test
swift build -c release --product MMListener
./scripts/build-dmg.sh

App 和 DMG 会生成到被 Git 忽略的 dist/ 目录。

项目结构

Sources/MMListener/
├── App/             应用状态与窗口协调
├── Audio/           麦克风和系统音频采集
├── Models/          会议领域模型
├── Settings/        服务商、钥匙串与权限状态
├── Storage/         SQLite 持久化
├── Summary/         OpenAI-compatible 模型调用
├── Transcription/   Apple 本地语音转写
└── Views/           SwiftUI 界面

参与贡献

欢迎提交问题、功能建议和 Pull Request。开始前请阅读 贡献指南、行为准则 和 安全策略。

许可证

本项目使用 MIT License。

About

Local-first macOS meeting recorder, offline transcription, and AI summaries

Topics

Resources

Code of conduct

Contributing

Security policy

Stars

2 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages