Native document read-aloud and audiobook workspace for PDF, DOCX, and EPUB on macOS
Direct download: assets/mayari-video.mp4 · assets/mayari-video.mov
Mayari is a macOS app for reading PDF, DOCX, and EPUB files with native Kokoro text-to-speech, voice/language controls, and audiobook generation. It combines a document library, read-aloud tools, quote capture, and export workflows in one workspace.
- 100% Native — No Python, no servers, no external dependencies
- Native TTS — KokoroSwift running on Apple MLX framework
- Queue-Based Audiobooks — Generate in background with persisted Jobs queue
- Lightweight — 46MB app (model downloads on first use)
- Fast — 3-5x faster than real-time audio generation
- Offline — Works without internet after initial model download
Flutter (Dart UI)
↓
MethodChannel
↓
KokoroTTSPlugin.swift
↓
KokoroSwift + Apple MLX
↓
Apple Silicon GPU
No HTTP servers. No API endpoints. Pure native communication via Flutter MethodChannels.
| Requirement | Details |
|---|---|
| macOS | 15.0+ (Sequoia) |
| iOS/iPadOS | 18.0+ for App Store build baseline |
| Processor | Apple Silicon (M1/M2/M3/M4) for macOS build host |
| RAM | 8GB minimum |
| Storage | ~400MB (app + TTS model) |
| Feature | Description |
|---|---|
| PDF Workspace | Three-pane layout: library sidebar, PDF/Text pane, quotes panel |
| Quote Capture | Select text → Cmd+D to save with page number |
| Highlight Mode | Cmd+H to auto-capture all selections |
| Text-to-Speech | 8 British voices, speed control, play/pause/stop |
| Audiobook Jobs Queue | Background queue with progress, retry/cancel, and saved outputs |
| Export | Markdown export with formatted citations |
| Text Reader | Edit/view markdown documents with TTS |
| Shortcut | Action |
|---|---|
Cmd + D |
Add selected text as quote |
Cmd + H |
Toggle highlight mode |
Space |
Play/Pause TTS |
Escape |
Stop TTS |
Cmd + E |
Toggle edit/view in Text Reader |
- Download
Mayari-1.0.5.dmg - Open DMG and drag Mayari to Applications
- Right-click → Open (first launch only, for Gatekeeper)
- TTS model (~340MB) downloads automatically on first use
# Prerequisites: Flutter 3.x, Xcode 16+, macOS 15.0+
git clone https://github.com/BoltzmannEntropy/Mayari.git
cd Mayari
flutter pub get
flutter run -d macosThis is an early alpha version intended for testing and development. Features may be incomplete, unstable, or change significantly before the stable release. Please report any issues on GitHub.
This macOS build is not signed by Apple. You may need to right-click the app and select "Open" the first time you run it, or go to System Settings → Privacy & Security to allow it.
Mayari uses KokoroSwift, a native Swift port of the Kokoro TTS model:
- Engine: KokoroSwift with Misaki G2P
- Framework: Apple MLX (Metal acceleration)
- Sample Rate: 24kHz
- Performance: ~320MB RAM, 1.7-2.4s for 7-8s audio
| ID | Name | Gender | Grade |
|---|---|---|---|
bf_emma |
Emma | Female | B- (default) |
bf_isabella |
Isabella | Female | C |
bf_alice |
Alice | Female | D |
bf_lily |
Lily | Female | D |
bm_george |
George | Male | C |
bm_fable |
Fable | Male | C |
bm_lewis |
Lewis | Male | D+ |
bm_daniel |
Daniel | Male | D |
Downloaded on first TTS use:
| File | Size | Source |
|---|---|---|
kokoro-v1_0.safetensors |
327MB | HuggingFace mlx-community |
voices.npz |
14MB | KokoroTestApp |
Location: ~/Library/Application Support/Mayari/kokoro-model/
The exact active paths are shown in-app under Settings → Text-to-Speech → Model location.
Create Audiobookadds a new background job immediately.- Open the left deck
Jobstab to monitor queue progress and status. - Jobs support retry/cancel/remove, and completed jobs appear in the
Audiotab. - Audiobook cards now have explicit
Play,Pause, andStopbuttons.
Mayari includes a bundled long public-domain history excerpt:
assets/examples/texts/public_domain_history_wells_excerpt.txt- Source: Project Gutenberg #35461, A Short History of the World by H. G. Wells
Generate long-form test audiobooks through the native TTS API (MethodChannel) with British voices:
./scripts/generate-long-history-audiobooks.shOptional configuration:
MAYARI_LONG_TEST_VOICES="bf_emma,bm_george,bm_lewis" \
MAYARI_LONG_TEST_MAX_CHARS=120000 \
MAYARI_LONG_TEST_SPEED=1.0 \
./scripts/generate-long-history-audiobooks.shOutputs are written to:
~/Documents/Mayari Audiobooks/long-history-tests/
Then open the generated .wav files directly in Finder/QuickTime to listen.
All demo samples are bundled in assets/examples/audiobooks/.
sample-emma.mp3sample-isabella.mp3sample-alice.mp3sample-lily.mp3sample-george.mp3sample-fable.mp3sample-lewis.mp3sample-daniel.mp3
sample-spanish-dora.mp3sample-french-siwis.mp3sample-hindi-alpha.mp3sample-italian-sara.mp3sample-japanese-nezumi.mp3sample-portuguese-dora.mp3sample-mandarin-xiaobei.mp3
example_pdf_genesis.wavexample_docx_readaloud.wavexample_epub_readaloud.wavlong_history_bf_emma_20260221173325268396.wavlong_history_bm_george_20260221173325268396.wavlong_history_manifest_20260221173325268396.jsonlong-history-emma.mp3long-history-george.mp3
Quotes export as markdown:
# Collected Quotes
## "Book Title" by Author Name (2020).
> "Quote text"
>
> — p. 42lib/ Flutter app (UI, state, services)
├── providers/ Riverpod state management
├── screens/ App screens
├── services/ TTS service (MethodChannel client)
└── widgets/ UI components
macos/Runner/
├── KokoroTTSPlugin.swift Native TTS plugin
├── MainFlutterWindow.swift Plugin registration
└── project.pbxproj SPM dependencies
scripts/
├── build-dmg.sh DMG builder
├── generate-long-history-audiobooks.sh Long-text British voice test runner
├── release.sh macOS release automation
├── check-ios-dist.sh iOS/iPad preflight validation
└── release-ios.sh iOS/iPad IPA build + optional upload
ios/
├── Runner/ iOS app target
├── ExportOptions.plist IPA export settings
└── Runner/PrivacyInfo.xcprivacy
KokoroTTSPlugin.swift implements:
| Method | Description |
|---|---|
loadModel |
Load safetensors + voice embeddings |
speak |
Generate and play audio |
pause/resume/stop |
Playback control |
getVoices |
List available voices |
getModelStatus |
Check load state |
Communication via MethodChannel("com.mayari.tts").
# Development
flutter run -d macos
# Release build
flutter build macos --release
# Create DMG
./scripts/build-dmg.sh# Validate iOS/iPad release prerequisites
bash ./scripts/check-ios-dist.sh
# Build IPA (TestFlight/App Store Connect ready artifact)
bash ./scripts/release-ios.shOptional upload with asc CLI:
export ASC_APP_ID="<app_store_connect_app_id>"
export ASC_TESTFLIGHT_GROUP="<testflight_group>"
bash ./scripts/release-ios.sh --upload --dist testflight- Requires macOS 15.0+ and Apple Silicon
- Quote capture needs selectable PDF text (no OCR)
- Non-English voices are listed in catalog, but synthesis language routing is currently optimized for English in the native runtime
| Component | License |
|---|---|
| Source Code | BSL-1.1 (LICENSE) |
| Binary Distribution | Mayari Binary License (BINARY-LICENSE.txt) |
| Overview | LICENSE.md |

