Skip to content

Conversation

@jcampuza
Copy link
Owner

@jcampuza jcampuza commented Jan 7, 2026

Summary

  • Local Transcription with WhisperKit: On-device speech-to-text using Apple's WhisperKit, supporting multiple model sizes (tiny, base, small, large-v3-turbo) with download management and progress tracking
  • Voice Isolation: Apple's voice processing API to reduce background noise and isolate speech at the hardware level (enabled by default)
  • Microphone Test Feature: Record and playback short audio clips to verify microphone quality and voice isolation effectiveness

Changes

Local Transcription

  • LocalTranscriptionService - WhisperKit integration with actor-based thread safety
  • ModelManager - Download, delete, and manage local Whisper models
  • TranscriptionRouter - Routes between API and local transcription based on settings
  • Settings UI for model selection with download/delete/activate controls

Voice Isolation

  • voiceIsolationEnabled configuration setting
  • Applied to both AudioCaptureService (dictation) and AudioSampler (test)
  • Toggle in Audio Settings

Microphone Test

  • AudioSampler - Record up to 10 seconds, playback to verify quality
  • Real-time audio level meter
  • Test Microphone section in Audio Settings

Other

  • Renamed TranscriptionResultTranscriptionOutput to avoid WhisperKit type collision
  • Track transcription source (api/local) and model in history

Test plan

  • Enable local transcription mode and download a model
  • Verify transcription works with local model
  • Toggle voice isolation on/off and verify it affects audio capture
  • Use Test Microphone to record and playback audio
  • Verify voice isolation applies to test recordings
  • Switch between API and local modes, verify routing works

🤖 Generated with Claude Code

jcampuza and others added 2 commits January 7, 2026 16:56
…est features

This commit adds several major features:

**Local Transcription with WhisperKit**
- Add LocalTranscriptionService using WhisperKit for on-device transcription
- Add ModelManager for downloading and managing local Whisper models
- Add TranscriptionRouter to switch between API and local transcription
- Support for multiple model sizes (tiny, base, small, large-v3-turbo)
- Model download progress tracking with success/failure alerts
- Sandboxed model storage in Documents directory

**Voice Isolation**
- Add voiceIsolationEnabled setting (enabled by default)
- Enable Apple's voice processing on AVAudioInputNode
- Reduces background noise and isolates speech at hardware level

**Microphone Test Feature**
- Add AudioSampler for recording short audio clips (up to 10 seconds)
- Playback recorded audio to verify microphone quality
- Real-time audio level meter during recording
- Respects voice isolation setting for accurate testing

**Other Changes**
- Rename TranscriptionResult to TranscriptionOutput to avoid WhisperKit collision
- Add transcription source and model tracking in history
- Update settings UI with model selection and voice isolation toggle

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Add @preconcurrency import to ModelManager.swift to handle WhisperKit's
non-Sendable types. This was passing on local Swift 6.2.3 but failing
on CI's Swift 6.1.2 (Xcode 16.4) due to stricter concurrency checking.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
@jcampuza jcampuza force-pushed the feature/local-whisper-voice-isolation branch 2 times, most recently from 8c64059 to 1f608f4 Compare January 7, 2026 20:22
- Add @preconcurrency import to ModelManager.swift for WhisperKit
- Add "CI Environment & Reproducing CI Failures" section to CLAUDE.md
- Use swift-actions/setup-swift@v2 with Swift 6.2 to match local dev
- Document how to reproduce CI issues locally

Using setup-swift action ensures CI uses Swift 6.2 to match local
development environment.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
@jcampuza jcampuza force-pushed the feature/local-whisper-voice-isolation branch from 1f608f4 to c32beb7 Compare January 7, 2026 20:23
@jcampuza jcampuza merged commit 8087dab into main Jan 7, 2026
1 check passed
@jcampuza jcampuza deleted the feature/local-whisper-voice-isolation branch January 7, 2026 20:28
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.

2 participants