Summary
On VocaMac 0.7.0, roughly 10–25% of dictations finish with:
Transcribing Ns of audio...
Transcription completed in ~0.35s
Result: ...
Transcription produced no usable text (silence or blank audio)
WhisperKit is fine — it receives a full-length PCM buffer that is effectively silence. Empty buffers exit earlier (audioData.isEmpty → idle, no "Transcribing" line), so this is silent capture, not a failed start.
Evidence (local logs, M5 Max, built-in mic)
| Gap since previous transcription |
Blank rate |
| 0–3s |
60% (3/5) |
| 3–10s |
15% |
| 10–30s |
9% |
| 30–120s |
9% |
| 120s+ |
7% |
Clear long failures also exist (7.6s / 12.9s / 24.9s of "audio" → blank), so it isn't only accidental short taps.
Also seeing frequent startRecording called in processing state — force recovering when the previous transcription hasn't returned to idle yet.
Likely cause
#136 / PR #136 made AVAudioEngine lazy: create on startRecording, releaseEngine() immediately on stopRecording. That frees the input route for AirPods/HFP (good), but every dictation cold-reacquires the mic.
Rapid back-to-back dictations (common in push-to-talk) hit that cold path hardest — matching the 60% blank rate for gaps < 3s.
engine.start() can succeed while early (or all) tap buffers are still near-zero until Core Audio finishes opening the device. Duration is sample-count based, so the UI/log still show a full N seconds of "audio".
Suggested fix
Defer idle teardown by a few seconds so quick re-records reuse a warm engine; still release after idle for #136. Also call prepare() on acquire.
Patch against v0.7.0 (works for me conceptually; couldn't rebuild locally — no full Xcode, only CLT):
- Cancel pending release in
acquireEngine()
newEngine.prepare() before return
stopRecording() → scheduleEngineRelease() (3s) instead of immediate releaseEngine()
- Keep immediate
releaseEngine() on force-reset / config-change / start-failure
Happy to open a PR if useful.
Environment
- VocaMac 0.7.0
- Apple M5 Max, 64 GB
- Model:
openai_whisper-large-v3-v20240930_turbo_632MB
- Mode: push-to-talk (F11 / keyCode 103)
- Mic: System Default → MacBook Pro Microphone
- ZoomAudioDevice is installed (not selected as default)
- Permissions: mic / accessibility / input monitoring all granted
Notes
Summary
On VocaMac 0.7.0, roughly 10–25% of dictations finish with:
WhisperKit is fine — it receives a full-length PCM buffer that is effectively silence. Empty buffers exit earlier (
audioData.isEmpty→ idle, no "Transcribing" line), so this is silent capture, not a failed start.Evidence (local logs, M5 Max, built-in mic)
Clear long failures also exist (7.6s / 12.9s / 24.9s of "audio" → blank), so it isn't only accidental short taps.
Also seeing frequent
startRecording called in processing state — force recoveringwhen the previous transcription hasn't returned to idle yet.Likely cause
#136 / PR #136 made
AVAudioEnginelazy: create onstartRecording,releaseEngine()immediately onstopRecording. That frees the input route for AirPods/HFP (good), but every dictation cold-reacquires the mic.Rapid back-to-back dictations (common in push-to-talk) hit that cold path hardest — matching the 60% blank rate for gaps < 3s.
engine.start()can succeed while early (or all) tap buffers are still near-zero until Core Audio finishes opening the device. Duration is sample-count based, so the UI/log still show a full N seconds of "audio".Suggested fix
Defer idle teardown by a few seconds so quick re-records reuse a warm engine; still release after idle for #136. Also call
prepare()on acquire.Patch against
v0.7.0(works for me conceptually; couldn't rebuild locally — no full Xcode, only CLT):acquireEngine()newEngine.prepare()before returnstopRecording()→scheduleEngineRelease()(3s) instead of immediatereleaseEngine()releaseEngine()on force-reset / config-change / start-failureHappy to open a PR if useful.
Environment
openai_whisper-large-v3-v20240930_turbo_632MBNotes
selectedAudioDeviceID=BuiltInMicrophoneDeviceis not a workaround — hits open Mic instantly stop when try to use any Input Method (Microphone) other thanSystem Default#174 (preferred device triggers immediate config-change stop loop).Audio configuration changedlines in my blank cases (unlike Mic instantly stop when try to use any Input Method (Microphone) other thanSystem Default#174).