A free, privacy-first iOS vocal training app built entirely with Apple frameworks. Real-time pitch and breathing analysis, 29+ guided exercises, streak-based engagement — all running on-device with zero third-party dependencies.
- Real-time pitch detection — FFT-based autocorrelation (60-1200 Hz) via Accelerate framework
- Breathing analysis — Live amplitude monitoring with visual feedback
- 29 guided exercises across 8 categories (warm-ups, pitch, breathing, resonance, articulation, stamina, cool-downs, advanced)
- Voice Checkpoints — Record baseline snapshots and track vocal development over time
- Guest Mode — Try exercises without creating a profile
- Streak tracking — Daily practice streaks with milestone celebrations
- Accessibility — Full VoiceOver support, Dynamic Type, haptic feedback settings
- Privacy-first — All data stays on-device. No analytics, no tracking, no cloud uploads.
| Layer | Technology |
|---|---|
| UI | SwiftUI |
| Audio | AVFoundation + Accelerate (vDSP) |
| Persistence | SwiftData |
| Architecture | MVVM with service layer |
| Dependencies | None — 100% Apple frameworks |
| Minimum iOS | 17.0 |
- Open
VocalCoach.xcodeprojin Xcode 15+ - Select a target device or simulator
- Build and run (Cmd+R)
No CocoaPods, SPM packages, or external dependencies to install.
VocalCoach/
├── Models/ — SwiftData models (Exercise, UserProgress, VoiceCheckpoint)
├── Views/ — SwiftUI views (SessionView, ExerciseListView, ProgressView)
├── Services/ — Audio engine, recording storage, exercise seeding
├── Components/ — Reusable UI (AudioWaveformView, FeedbackOverlayView)
└── Resources/ — Assets, localization
VocalCoachTests/ — Unit tests (45+ passing)
docs/ — Product roadmap, growth plans, architecture docs
VocalCoach processes all audio on-device using Apple's Accelerate framework. No audio recordings, personal data, or usage analytics are sent to any server. The microphone is used exclusively for real-time pitch and breathing analysis during practice sessions.
MIT License — see LICENSE for details.
Built by @martzmakes