Skip to content

Interval/30 microphone transcription - #33

Merged
quangshuynh merged 5 commits into
mainfrom
interval/30-microphone-transcription
Sep 24, 2026
Merged

quangshuynh merged 5 commits into
mainfrom
interval/30-microphone-transcription

Conversation

@quangshuynh

Copy link
Copy Markdown
Owner

What changed

Why

Validation

  • xcodebuild -project ScribeKit.xcodeproj -scheme ScribeKit -destination 'platform=macOS' build
  • xcodebuild -project ScribeKit.xcodeproj -scheme ScribeKit -destination 'platform=macOS' test

Transcript and privacy impact

Energy and performance impact

Adds a capture mode — application audio or the microphone, one per
meeting — and a microphone capturer behind the existing AudioCapturing
boundary, so recognition, persistence, gap incidents, pause and resume
and recovery run unchanged for either source.

CaptureModeRouter is the one capturer the runtime holds and sends each
start to the capturer for the meeting's mode. MicrophoneAudioCapturer
taps AVAudioEngine's input node, mixes to mono and cuts audio into 20 ms
buffers so the bounded recognition backlog means the same thing for both
sources. A configuration change ends the meeting as interrupted rather
than moving to another microphone.

AudioCapturing gains prepare(configuration:), run before any artifact
exists: it is where the microphone permission is first asked for, so a
refusal leaves nothing on disk. A start never prompts. Requests that mix
modes, or ask a Microphone meeting to keep audio, are refused.

Adds the audio-input sandbox entitlement and a microphone usage
description.
The session record gains an optional captureMode, written for every new
session; records written before it, including every v0.1.0 session,
decode unchanged and the schema version stays 1. A microphone is named
in the transcript header and the record as "Microphone (<input>)", and
its device identifier is never written.

History carries the mode and labels a Microphone meeting's source as a
source rather than an application. Diagnostic reports state the mode,
never the microphone's name, and report no requested format for a
microphone, which asks for none.
A "Transcribe from" choice at the top of the Meeting tab decides what
the rest of the screen asks for. Microphone mode shows the Mac's current
input and macOS's own answer about microphone access, offers to ask
while macOS never has, and names System Settings after a refusal. It
does not run application discovery, so it never triggers the Screen &
System Audio Recording prompt, and App Audio never reads the microphone
permission.

Readiness keeps its four prerequisites in both modes, titled for the
mode. The choice is remembered; the microphone is not. The menu bar says
a Microphone meeting is being listened to rather than captured.
Drives Microphone meetings through the real runtime with the microphone
replaced at the capture boundary: a start with permission, refusals
before anything is created (including through the real capturer with
stated permission answers), input start failure, audio reaching
recognition, pause and resume media time, stop, an input change ending
the meeting as interrupted, gap incidents, and durable Markdown, the
session record, recovery and History against real files.

Also covers application state, window and tab changes not being inputs
to a running meeting, conflicting starts during a permission prompt,
App Audio never consulting the microphone, the PCM adapter and tap, the
access gate, the router, readiness, the setup model, record
compatibility with v0.1.0, and diagnostics leaving the microphone
unnamed.
Adds a Microphone Transcription page covering App Audio versus
Microphone, the permission, which input is used and why it is never
switched, what is and is not kept, background behaviour stated as design
rather than as observation, and failure and recovery behaviour. Updates
permissions, background operation, architecture, audio capture, failure
semantics, session metadata, transcript format, diagnostics and
limitations, and adds a real-Mac validation checklist to Testing.

Adds an Unreleased changelog entry and records the interval's state in
CONTEXT.md, including that nothing in it has been built or run on a Mac
yet. v0.1.0's release notes are unchanged.
@quangshuynh
quangshuynh merged commit 8d00b08 into main Sep 24, 2026
3 checks passed
@quangshuynh
quangshuynh deleted the interval/30-microphone-transcription branch September 24, 2026 17:13
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