Offline Windows TTS narration studio (Kokoro + optional Qwen3-TTS).
Not affiliated with narravoice.com.
NarraVoice is a free, open-source, local alternative to cloud TTS services like ElevenLabs — built for offline audiobook narration and multi-character voiceover on Windows. A local, offline text-to-speech narration studio for turning story files into audiobooks — no cloud APIs, no per-character billing, no subscription.
Two engines in one app
- Kokoro — fast, fully local, lightweight, and CPU-friendly
- Qwen3-TTS — stronger emotional expression and natural intonation (optional)
Use either (or both) in the same project with the same editor, presets, chunking, and export pipeline.
Most people should start with Kokoro only. It is the simplest and most reliable way to use NarraVoice.
This is the best path for most users, especially if you are coming from the book and just want to start narrating.
- Go to the Releases page
- Download the latest release
.zip - Extract it to a folder (example:
C:\NarraVoice) - Download the Kokoro model and voices (see below)
- Edit
config.jsonso the paths match your folder - Run the
.exe
You do not need Qwen3, Python, or any extra setup to use NarraVoice this way.
Qwen3-TTS is better at emotional expression and natural intonation.
Use it when you want more expressive character voices or richer delivery.
It requires extra setup:
- Python 3.13.x
- The Qwen model files
- The
qwen_server.pyscript
It also runs more slowly on computers without a strong GPU.
You can add it later after you are already comfortable using Kokoro.
Only needed if you want to modify the code.
Prerequisites
- Windows 10/11 (64-bit)
- .NET SDK
- Visual Studio 2022 or the
dotnetCLI
Basic steps
- Clone this repository
- Restore and build the solution
- Copy the required model files into the output folder
- Edit
config.jsonwith correct paths - Run the application
NarraVoice needs the Kokoro model to generate speech.
- Place
Kokoro-v1.0.onnxhere:models/kokoro/Kokoro-v1.0.onnx - Place the voice
.binfiles here:models/kokoro/voices/ - After the first launch, you can also use Tools → Voice Manager / Download Voices to get missing English or other language voices.
Helps with pronunciation and IPA support.
- Install eSpeak NG normally, or
- Copy the full eSpeak NG folder into the
espeak\folder for a portable setup
Only needed if you want stronger emotional expression and better intonation.
- Requires Python 3.13.x
- Requires the Qwen model files and
qwen_server.py - Skip this completely if you are happy with Kokoro
A typical install looks like this:
NarraVoice/
├── NarraVoice.exe
├── config.json
├── narration_config.json
├── substitutions.json
├── voice_preferences.json
├── projects/
├── models/
│ ├── kokoro/
│ │ ├── Kokoro-v1.0.onnx
│ │ └── voices/ ← *.bin voice files
│ └── Qwen/ ← optional
│ ├── qwen_server.py
│ └── Qwen3-TTS-.../
└── espeak/ ← optional portable eSpeak NG
Place config.json next to the executable and update every path to match your install.
{
"base_dir": "C:\\Path\\To\\NarraVoice",
"app_dir": "C:\\Path\\To\\NarraVoice",
"models_dir": "C:\\Path\\To\\NarraVoice\\models",
"voices_dir": "C:\\Path\\To\\NarraVoice\\models\\kokoro\\voices",
"projects_dir": "C:\\Path\\To\\NarraVoice\\projects",
"kokoro_model_path": "C:\\Path\\To\\NarraVoice\\models\\kokoro\\Kokoro-v1.0.onnx",
"qwen_server_script": "C:\\Path\\To\\NarraVoice\\models\\Qwen\\qwen_server.py",
"espeak_path": "C:\\Program Files\\eSpeak NG\\espeak-ng.exe",
"device": "cpu"
}Important: Most setup problems come from incorrect paths in
config.json.
Make sure every path actually exists on your machine.
- Click New Project
- Select a
.txt,.docx, or.pdfstory file - Edit a chunk
- Click Preview
- When all chunks are rendered, click Merge to create the final MP3
Import tip: NarraVoice splits on sentence boundaries. If a header or unpunctuated line merges with the next line, place your cursor at the break and press Enter to split it manually.
- Fully offline — both TTS engines run locally; nothing is sent to a cloud API
- CPU-first — designed to run well without a dedicated GPU
- Dual-engine — mix Kokoro and Qwen3-TTS voices in the same project
- Per-line voice control — preset/gutter system lets you assign different voices, pitch, rate, or volume to any stretch of text
- PDF / DOCX / TXT ingestion — drop in a story file and it chunks automatically at sentence boundaries
- Full pipeline — edit → preview → render → merge into one finished MP3
- Combine external audio — can also merge audio files that were not generated inside NarraVoice
- Built-in visualizer — waveform, pitch (Hz), and energy (RMS) view
- Pronunciation control — Smart IPA overrides for Kokoro + global substitution list for both engines
| Feature | NarraVoice (Local) | Cloud TTS (ElevenLabs, OpenAI, etc.) |
|---|---|---|
| Cost | Free — no subscriptions or per-character fees | Per-character billing |
| Privacy | Fully private — nothing leaves your PC | Text sent to third-party servers |
| Hardware | CPU-optimized | Requires internet + server availability |
| Dialogue Control | Per-line presets with gutter colors | Manual splitting / harder multi-voice work |
| Fine-Tuning | Smart IPA + local dictionaries | Limited control over names & heteronyms |
Save a Voice + Rate + Pitch + Volume combination as a named preset (each gets a gutter color). Arm a preset in the left margin and it applies from that line until the next marker. This is how you handle multi-character dialogue or shift a single character’s tone mid-scene.
For Qwen voices only, a preset can also carry an Instruct (a short style note such as “speak angrily”). There is also a separate session Instruct for quick experiments that is not saved between restarts.
Render priority for a given line:
- Preset Instruct (if present)
- Session Instruct (if set)
- No instruct
Kokoro voices ignore Instruct — they only use pitch, rate, and volume.
- Kokoro: Right-click any word → Smart IPA (uses a built-in dictionary with eSpeak NG fallback), or add it to the global substitution list.
- Qwen3: Does not use IPA. Spell the word the way it should sound (e.g. “reed” for the present tense of “read”).
- Do not combine a global substitution and an inline IPA override on the same word.
- Heteronyms (
read/read,lead/lead, etc.) still need manual overrides. NarraVoice gives you the tools instead of guessing.
| Specification | Minimum | Recommended |
|---|---|---|
| Operating System | Windows 10 (64-bit) | Windows 11 (64-bit) |
| Processor | Intel Core i5 / AMD Ryzen 5 (4 cores) | Intel Core i7 / AMD Ryzen 7 or better |
| Memory (RAM) | 8 GB | 16 GB or more |
| Storage | 2 GB free | 5 GB free (SSD preferred) |
| Execution | Standalone .exe |
Local environment |
Cloud runtimes, Linux containers, and macOS are not supported in this standalone desktop version.
Phantom sounds
Usually caused by empty segments from stray quotes, runs of punctuation, or too many blank lines. Prefer the Silence button or a <sil:500ms> tag instead of blank lines for pacing.
Pitch
Stay roughly within −6 to +6 semitones. Higher values tend to sound harsh. Pitch changes overall pitch only — it is not a substitute for better natural prosody.
Flat question intonation
Most Kokoro voices are limited here. Prefer bf_alice, af_jessica, or a blend of them.
Cancel button
Stopping an in-progress Kokoro generation is not always instant.
- Most Kokoro voices have limited question intonation.
- Cancel during synthesis is not always reliable.
- Qwen3 requires a separate Python + server + model install and is slower on CPU.
- Multi-voice dialogue inside a single sentence often sounds unnatural. Switch voices at line or paragraph boundaries when possible.
- Session Instruct is intentionally not saved across restarts.
- Heteronyms require manual pronunciation overrides.
- User Guide — complete editor reference, keyboard shortcuts, and settings
- Context Document — additional technical details
NarraVoice is licensed under the MIT License — see LICENSE.
Third-party packages and user-installed models are covered in THIRD_PARTY_NOTICES.md.
Kokoro and Qwen3-TTS model weights are Apache 2.0 and are not redistributed with this project. You must download them separately.