Open-source voice-to-text custom keyboard for iOS
WhisperSource is a privacy-focused, fully open-source iOS custom keyboard that enables voice input across all apps. Built on top of state-of-the-art speech recognition models like NVIDIA's Parakeet v3, it provides fast, accurate transcription while keeping your data under your control.
- π€ Voice Input Anywhere: Use voice typing in any iOS app
- π± 100% On-Device: All transcription happens locally using CoreML
- π Zero Network Required: Your voice never leaves your device
- β‘ Real-time Transcription: Fast, accurate speech-to-text powered by Whisper
- π 90+ Languages: Supports major languages worldwide
- π Optimized for iOS: Leverages Apple Neural Engine for efficiency
- π 100% Open Source: GNU GPL v3 licensed - forever free and open
WhisperSource draws inspiration from:
- Wispr Flow - Sleek voice input UX
- Superwhisper - macOS voice typing excellence
- CustomKeyboardKit - iOS keyboard extension patterns
- Keyman - Multi-platform keyboard architecture
WhisperSource/
βββ Sources/WhisperSource/
β βββ Core/
β β βββ ModelManager.swift # Multi-model management
β βββ Models/
β β βββ TranscriptionModel.swift # Protocol for ASR models
β β βββ ParakeetV3Model.swift # NVIDIA Parakeet implementation
β β βββ [Future: WhisperModel, ConformerModel...]
β βββ Audio/
β β βββ AudioRecorder.swift # Optimized audio capture
β βββ UI/
β β βββ KeyboardViewController.swift # Keyboard extension UI
β βββ Extensions/
β βββ [Helper extensions]
βββ Tests/
βββ Package.swift
WhisperSource uses a protocol-based architecture allowing easy addition of new models:
public protocol TranscriptionModel {
var name: String { get }
var version: String { get }
var supportedLanguages: [String] { get }
func initialize() async throws
func transcribe(audioData: Data, language: String) async throws -> String
func transcribeStream(audioStream: AsyncStream<Data>, language: String) -> AsyncStream<String>
func cleanup()
}- Xcode 15.0+
- iOS 17.0+ target device (WhisperKit requires iOS 17+)
- Swift 5.9+
- ~100MB storage for Whisper base model
git clone https://github.com/ksaitor/WhisperSource.git
cd WhisperSourceopen Package.swift
# or create an iOS App project and add this package as a dependencyWhisperSource is a framework. To use it:
- Create a new iOS App project in Xcode
- Add a Keyboard Extension target
- Add WhisperSource as a Swift Package dependency
- Import and use in your keyboard extension:
import WhisperSource
class KeyboardController: KeyboardViewController {
// WhisperSource handles the rest!
}WhisperSource automatically downloads and uses Whisper models on first run:
// In your keyboard extension:
// Tiny: ~40MB, fastest (good for older devices)
let whisper = WhisperKitModel(modelSize: .tiny)
// Base: ~75MB, recommended (best balance)
let whisper = WhisperKitModel(modelSize: .base)
// Small: ~240MB, more accurate
let whisper = WhisperKitModel(modelSize: .small)
// Medium: ~770MB, highest accuracy (may be slow on older iPhones)
let whisper = WhisperKitModel(modelSize: .medium)
ModelManager.shared.registerModel(whisper)
try ModelManager.shared.setActiveModel(name: "Whisper")Recommendation: Start with .base for best balance of speed and accuracy.
- β Whisper (tiny) - 40MB, fastest, great for older devices
- β Whisper (base) - 75MB, recommended, excellent balance
- β Whisper (small) - 240MB, high accuracy
- β Whisper (medium) - 770MB, best accuracy (iPhone 12+ recommended)
All models:
- Run entirely on-device via CoreML
- Support 90+ languages
- Require zero network connection
- Optimized for Apple Neural Engine
For developers who want to use custom backends:
- π§ Parakeet v3 - NVIDIA's state-of-the-art (via API)
- π§ Conformer - Custom API integration
- π§ Wav2Vec 2.0 - Custom API integration
API models require self-hosting or custom server setup.
WhisperSource is designed with privacy as the #1 priority:
- 100% On-Device: All transcription happens on your iPhone/iPad
- Zero Network Access: Works completely offline by default
- No Data Collection: Zero telemetry, no analytics, no servers
- No Cloud: Your voice recordings never leave your device
- Open Source Audit: Every line of code is public and auditable
This means:
- β Works on airplane mode
- β No subscriptions or API keys needed
- β Your conversations stay private
- β No third-party servers can access your voice data
WhisperSource requires minimal permissions:
- β Microphone Access: To record your voice (iOS standard permission)
- β Text Insertion: To insert transcribed text (built-in keyboard capability)
What WhisperSource does NOT need:
- β "Allow Full Access" - Not required! (because everything is on-device)
- β Network Access - Works completely offline
- β Contacts, Photos, or other sensitive data
This is a major privacy advantage over commercial voice keyboards that require "Allow Full Access" to send your voice to their servers.
swift test- Create a new file in
Sources/WhisperSource/Models/ - Implement the
TranscriptionModelprotocol - Register in
ModelManager:
class MyCustomModel: TranscriptionModel {
let name = "My Model"
let version = "1.0"
let supportedLanguages = ["en", "es"]
func initialize() async throws { ... }
func transcribe(audioData: Data, language: String) async throws -> String { ... }
// ...
}
// Register
ModelManager.shared.registerModel(MyCustomModel())We welcome contributions! WhisperSource is a community project.
- Models: Add support for new ASR models
- Languages: Improve multi-language support
- UI/UX: Enhance keyboard design and features
- Performance: Optimize audio processing and transcription
- Documentation: Improve guides and examples
- Testing: Add unit and integration tests
- Fork the repository
- Create a feature branch (
git checkout -b feature/amazing-feature) - Commit your changes (
git commit -m 'Add amazing feature') - Push to the branch (
git push origin feature/amazing-feature) - Open a Pull Request
All contributions must be licensed under GNU GPL v3 to ensure the project remains open source.
WhisperSource is licensed under the GNU General Public License v3.0.
This ensures:
- β Anyone can use, modify, and distribute WhisperSource
- β All derivative works must also be open source (copyleft)
- β Cannot be commercialized under proprietary licenses
- β Cannot be used in closed-source products
Why GPL v3?
- Protects user freedom and privacy
- Prevents proprietary forks that lock users in
- Ensures the project benefits everyone forever
See LICENSE for full text.
- NVIDIA NeMo - Parakeet v3 model
- OpenAI - Whisper model
- iOS Developer Community - Keyboard extension patterns
- All Contributors - Thank you! π
- Core architecture and model abstraction
- On-device Whisper models via WhisperKit
- Basic keyboard UI
- Multi-language support (90+ languages)
- 100% offline mode
- Real-time streaming transcription
- Custom vocabulary / domain adaptation
- Model size selection UI
- Language switching in keyboard
- Custom wake word support
- TestFlight beta release
- App Store release
- Issues: GitHub Issues
- Discussions: GitHub Discussions
- Email: [TBD]
If you find WhisperSource useful, please star the repo! It helps others discover the project.
Built with β€οΈ by the open-source community
Voice input should be free, private, and open to all.