Skip to content

Intermittent blank transcriptions after stop (silent buffer; worse on rapid re-record) #176

Description

@flesler

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

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    appbugSomething isn't working

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions