Skip to content

feat: meetings — system audio recording (macOS 15+) + one-click Scripto install#45

Merged
TN019 merged 1 commit into
mainfrom
feat/meeting-system-audio
Jul 24, 2026
Merged

feat: meetings — system audio recording (macOS 15+) + one-click Scripto install#45
TN019 merged 1 commit into
mainfrom
feat/meeting-system-audio

Conversation

@TN019

@TN019 TN019 commented Jul 24, 2026

Copy link
Copy Markdown
Owner

背景

两个会议相关改动:

  1. 会议录音此前只采集麦克风(AVAudioRecorder)。本机参加视频会议(DingTalk / Zoom / 腾讯会议)时:外放靠麦克风声学回采,能录到但质量差;耳机时对方声音直接进耳机,麦克风完全采不到。
  2. Scripto 此前必须手动 clone 并在设置里指定目录,新机器上多一道终端操作。

改动

系统声音录制(commit 53a998c)

  • 新增 SystemAudioRecorder(macOS 15+,@available 门控,部署目标仍为 macOS 13):用 Core Audio process tap(CATapDescription 全局混音、排除 Shiftly 自身)+ 私有聚合设备 + IOProc,把系统声音输出写入隐藏边轨 .dd-mm-yy.system.m4a。tap 在系统混音层截取,与输出走扬声器还是耳机无关。
  • AppModel:开始录音时同时启动系统声音边轨,任何失败(权限被拒、tap 报错)自动降级为仅麦克风并在状态栏提示;停止录音后用 AVMutableComposition + AVAssetExportSession 把两轨混成一个文件,仍落在 dd-mm-yy.mp4(m4a 容器,Scripto / 播放器均兼容)。混音完成前会议不出现在列表里,避免转录与文件替换竞态;混音失败时保留麦克风原始录音。
  • MeetingStore.meetings() 过滤点号开头的文件,录音中/崩溃残留的边轨不会被当成会议音频或字幕。
  • Info.plist(build_app.sh)新增 NSAudioCaptureUsageDescription;首次录音会触发独立于麦克风的「系统音频录制」隐私弹窗。

一键安装 Scripto(commit 120f37c)

  • 新增 ShiftlyKit.ScriptoInstall:纯逻辑的目标目录解析——app 位于 Shiftly git 检出内(如从 dist/ 运行)时克隆到检出的同级目录(../scripto,即开发机常规布局);否则克隆到 ~/Library/Application Support/Shiftly/scripto(不受 app 搬家影响,也避免把 Python venv 放进可能被 iCloud 同步的存储根)。
  • AppModel.installScripto():目标处已有 checkout(含 pyproject.toml)则直接采用不重复克隆;否则 git cloneuv sync 预热环境(首次转录不再静默等依赖下载)→ 自动写入 scripto_dir。缺 uv / sync 失败时保留 checkout 并给出对应提示;克隆失败时清理本次创建的目录。
  • 设置 → 会议:Scripto 目录未设置时显示「一键安装」按钮(进行中转菊花并禁用按钮)。
  • 抽出共享的 AppModel.runShell(登录 zsh,先排空 stderr 再等退出,stdout 丢弃,避免管道写满死锁),转录调用同步改用它。
  • UI 文案、zh-Hans 本地化、docs/SETUP.md 同步更新。

验证

  • scripts/test.sh 全部通过(114 用例;新增隐藏文件过滤 3 项 + ScriptoInstall 目录解析/checkout 检测 3 项)。
  • scripts/build_app.sh 打包成功,plutil -lint 校验 Info.plist 通过。
  • git clone https://github.com/TN019/scripto.git 到临时目录实测成功,pyproject.toml 存在;登录 shell 可找到 uv。

未自动化验证项

Core Audio tap、TCC 弹窗与 GUI 按钮无法在 CI 中自动化,需在打包后的 app 中人工验证:

  1. 运行 scripts/build_app.sh,打开 dist/Shiftly.app,在会议页点击录音;预期首次出现「系统音频录制」授权弹窗(与麦克风弹窗分开)。
  2. 戴耳机加入任一视频会议(或播放一段视频),说几句话后停止录音;预期状态栏短暂显示「正在保存录音…」,随后会议出现在列表中,回放能同时听到本人声音与耳机中播放的声音。
  3. 在 系统设置 → 隐私与安全性 中拒绝系统音频录制授权后再录一次;预期状态栏显示「录音中…(系统声音不可用,仅麦克风)」,录音仍正常保存。
  4. 设置 → 会议:把 Scripto 目录清空(或在无 ~/dev/local/scripto 的环境)点击「一键安装」;预期本机(从检出运行)直接采用 ~/dev/local/scripto 并提示已保存;全新环境则克隆到对应位置、跑完 uv sync 后提示「Scripto 已就绪。」且目录自动填入。
  5. 对录音执行 Transcribe;预期 Scripto 正常产出 SRT。

🤖 Generated with Claude Code

…tap (macOS 15+)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@TN019
TN019 merged commit 830a92a into main Jul 24, 2026
3 checks passed
@TN019 TN019 changed the title feat: meeting recordings capture system audio (macOS 15+) feat: meetings — system audio recording (macOS 15+) + one-click Scripto install Jul 24, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant