NEW 4.0.0: the DAW-style rebuild, projects in one .tbaw file

Text to speech, edited like a DAW project.

Kokoro GUI is a desktop workstation for turning a script, or a whole ebook, into audio. Assign characters to a transcript, watch clips land on their own timeline track, and regenerate only what changed. Everything runs on your machine.

Runs locally, no API keys Apache-2.0 Windows · macOS · Linux 2 synthesis engines
Kokoro GUI 4.0 · Advanced workspace
Kokoro GUI: a transcript with a character gutter and settings tabs above a seconds-axis timeline with waveforms, a playhead, and the transport
Built on
How it works

Write, assign, generate, export

The transcript is the source of truth. Audio is a render of it, tracked per clip, so you never wonder which file is current.

01

Write the script

Paste text or import a .txt, .pdf or .epub. Tag speakers inline, or select a range and pick a character from the combo above the editor.

[Narrator]: The old house stood at the end of the lane. [Villain:Whisper]: Someone should not have come here.
02

Generate what changed

Auto-split turns tags into clips on each character's track. Generate renders only the clips whose text or settings moved since their last take. Edit one line, regenerate one clip.

Narrator ▶ 2 clips out of date Villain clean, cache hit Generate → 2 segments · 0:07
03

Mix and export

Play the arrangement from the transport, drag clips in time, tweak FX while it plays. Export mixes every track down to one file, with an .srt and per-clip files if you want them.

audiobook.wav 12:41 audiobook.srt 38 cues audiobook_001_Narrator.wav …
Features

A 2x2 grid of docks, and the model behind it

Transcript and settings tabs on top, timeline and transport underneath. Every panel is a dock; Workspace > Simple hides the timeline when you just want to read text aloud.

A transcript that knows who's speaking

Each run of text is colored by its character. The gutter names the speaker and FX once per change and draws a play button beside every clip that's out of date. Click it to regenerate that clip alone.

Transcript reference →

A timeline on a real seconds axis

One track per character. Generated clips show waveforms; ungenerated ones are dashed estimates that learn from past runs. Drag a clip in time, onto another track, or Shift+drag inside it to replace a sub-range with new TTS.

Timeline reference →

FX that never dirty a clip

Seventeen Pedalboard sliders in five groups, applied when a clip is played or exported, never written into it. Move a slider mid-play and you hear it on the next pass.

FX reference →

Regenerate only what moved

Every segment is keyed by a hash of its text, voice, speed and engine version. Change any of those and the clip goes out of date. Change anything else and it doesn't.

How segment keys work →

Settings scoped to the selection

Nothing selected edits the project defaults. A clip selected edits its overrides. A character selected edits its preset, and every clip using it follows.

Settings reference →

Two ways to get a voice

With Kokoro, pick a named voice or blend two into a new one in the Mixing tab. With Audio8, drop in a reference WAV, let the bundled ASR write the transcript, and save it as a clone. The Voices tab shows whichever tool the active engine supports.

Compare the engines →

Projects travel as one file

A .tbaw (text based audio workflow) bundle holds the text, the clips, every generated segment, and the voice mixes, references and FX presets the project names. Open it on another machine with the same engines and it plays.

What's inside a .tbaw →
Engines

Two local models, one interface

Both sit behind the same backend abstraction. Options > Engine swaps the voice list, the sample rate and the Voices tab live. Nothing else about the app changes.

Kokoro default · hexgrad/kokoro Audio8 Audio8-TTS-Preview-0.6b
VoicesNamed base voices, plus custom mixesZero-shot cloning from a reference WAV and its transcript
LanguagesAmerican and British English, Spanish, French, Italian, Portuguese, Japanese, ChineseWhatever the reference clip speaks
Sample rate24,000 Hz44,100 Hz
ParallelismOne pipeline per worker thread, so chunks render in parallelOne shared model behind a lock; threads don't help
JIT streaming● Supported○ Falls back to batch
Voices tabMixingVoice Reference, with Auto-transcribe
Licensing noteApache-2.0 modelThe default ASR model for Auto-transcribe (Audio8-ASR-0.1B) is CC-BY-NC-4.0; Vosk is the Apache-2.0, offline alternative
Post-processing

One fixed chain, applied at read time

This is the order in process_audio. It runs when a clip is played, drawn on the timeline, or exported, over the raw model output on disk.

01

Trim

Leading and trailing silence, if enabled

02

Volume

A plain gain multiply

03

Pitch

Shifted by resampling

04

FX chain

Every enabled Pedalboard effect

05

Normalize

Peak to 98% of full scale, last

Projects

One .tbaw per project. Nothing else to keep track of.

Text based audio workflow. A zip with a manifest, so anyone can open it, and everything a project needs to play back on a second machine.

  • Saves in the background. Ctrl+S writes a temp file and swaps it in, so a crash never leaves a half-written project. Autosave goes to a working copy, never to your file.
  • Carries its voices. Custom Kokoro mixes, Audio8 references and FX presets the project names ride inside it. The Voices tab lists a bundle's own voices first.
  • Recovers after a crash. Reopen the project and it offers the unsaved session, even if the file was renamed or moved in between.
  • Small when you want it. Untick "bundle generated audio" in the Export dialog and the file holds just text and settings; clips regenerate on open.
my-audiobook.tbaw
manifest.json      format, version, stats, hashes
document.json      text, clips, tracks, characters
project.json       export and bundle options
audio/generated/
  3f9a…c2_0.wav    one file per segment
fx/
  Whisper.json     named FX presets
engines/kokoro/voices/
  narrator_mix.pt  custom voice mixes
engines/audio8/refs/
  villain.wav      cloning reference
  villain.txt      and its transcript
Changelog

What's new

4.0.0 is the DAW-style rebuild. The full history, back to 3.1, is in the README.

4.0.0 LATEST

A document, not a text box

The rebuild. 3.2.0 was a CustomTkinter form; 4.0.0 is a PySide6 shell over a document with clips, tracks and characters layered on top, per-clip dirty tracking, undo and redo, and a settings panel scoped to the selection. Transcript | Settings, Audio FX, Lexicon and Voices tabs on top; Timeline | Transport underneath, with saved Advanced and Simple workspaces. Light and dark themes.

Clips sit on a real seconds axis with waveforms, a ruler and a playhead. Play, pause, stop and seek through one sounddevice stream that mixes the arrangement in the callback. File > Export mixes the timeline down to one file with optional .srt and per-clip files. Audio FX are non-destructive: clips are raw model output and the FX chain, volume, pitch, normalize and trim are applied when the transport, the export or the timeline reads them, so moving a slider never marks a clip out of date.

A project is one .tbaw file that carries the text, the clips, every generated segment and every named voice mix, reference and FX preset it uses. Save runs in the background and never leaves a half-written file; a crash offers to recover the unsaved session. A clip's audio lands in the project's working copy under a name derived from what produced it, and regenerating a clean clip makes a fresh take. Launch reopens the last project under a welcome dialog with recents, New, New from text file and a details pane.

Engines are pluggable: Audio8 voice cloning joined Kokoro as a second real backend, with two ASR choices for auto-transcribing a reference.

Install

From clone to first sample

Python 3.11 or newer and eSpeak NG. Both models download from Hugging Face the first time you pick them.

4.0.0 is a beta, and a different program from 3.2.0. 3.2.0 is the old CustomTkinter app: one text box, one voice, files to a folder. It's frozen and gets no fixes. 4.0.0 is the rebuild this site describes. The intent is that every 4.x release opens a .tbaw made by any earlier 4.x, the beta included; treat that as a goal rather than a promise until 4.0.0 final.

Still want 3.2.0? git clone --branch 3.2.0 --depth 1 the same URL and follow the README in that checkout; its dependencies and launch steps differ from the ones here. Nothing carries over between the two except the presets/ and custom_voices/ folders.

Terminal
# clone the current beta (the tag name changes each release;
# the Releases page lists them all)
git clone --branch 4.0.0-beta.1 --depth 1 https://github.com/CoffeeMethod/KokoroGUI.git
cd KokoroGUI

# virtual environment
python -m venv .venv
.venv\Scripts\activate       # Windows
source .venv/bin/activate    # macOS / Linux

# install and run
pip install -r requirements.txt
python main.py               # or run.bat on Windows
eSpeak NG, the one system dependency
# Windows: run the installer from
https://github.com/espeak-ng/espeak-ng/releases

# macOS
brew install espeak-ng

# Debian / Ubuntu
sudo apt install espeak-ng

# Fedora
sudo dnf install espeak-ng

Python 3.11+

The only hard language-version requirement.

eSpeak NG

Kokoro's phonemization step needs it at runtime. Install it before the first run.

A GPU is optional

Both models run on CPU. Options > Device picks CUDA when PyTorch reports one.

First run downloads weights

Kokoro and Audio8 pull from Hugging Face on first use. Audio8 loads with trust_remote_code=True.

Offline transcription

Copy .env.example to .env and set VOSK_MODEL_PATH to use Vosk instead of the default Audio8 ASR model.

Trouble with torch?

Follow the platform-specific install at pytorch.org before pip install -r requirements.txt.

Open source

Local, inspectable, Apache-2.0

No account, no upload, no per-character billing. Clone it, read the code, ship your audiobook.