Skip to main content

🔊 jaketts

jaketts — also available as the shorter jtts command — is a local text-to-speech utility for macOS powered by the open-weight Kokoro-82M model.

It can play synthesized speech directly through your speakers, save WAV files, read plain-text files, switch between Kokoro voices, adjust playback speed, and launch a small Tkinter desktop interface when run with no arguments.

The default voice is bm_george.

Features

  • 🔊 Direct speaker playback
  • 💾 WAV file export
  • 📖 Plain-text file input
  • 🗣️ Optionless voice selection
  • ⏩ Adjustable speech speed
  • 🌍 Multiple Kokoro language/voice families
  • 🖥️ Native Tkinter GUI with voice, speed, and volume controls
  • 🔒 Local synthesis with no API key required
  • ⚡ jaketts and jtts command aliases
  • 🇯🇵 Automatic one-time Japanese dictionary setup when a Japanese voice is first used

Requirements

jaketts currently supports Python 3.10 through Python 3.12.

On Apple Silicon, jaketts automatically allows PyTorch to use the MPS backend when available, with CPU fallback for unsupported operations. Heavy Kokoro/PyTorch imports are deferred until synthesis actually starts, so lightweight CLI operations and GUI launch remain responsive.

Installation from PyPI

Install the published package into your preferred Python environment:

python -m pip install jaketts

That installs both commands:

jaketts --version
jtts --version

Japanese support uses the full UniDic dictionary. The required Python packages are installed by pip, and the first time you select a Japanese voice, jaketts automatically downloads the UniDic dictionary into the same Python environment. This is a one-time download of roughly 526 MB.

Installation from GitHub

Clone the repository, enter it, and install it in editable mode:

git clone https://github.com/ofalltrades/jaketts.git
cd jaketts
python -m pip install -e .

Editable mode means changes to jaketts.py are used immediately without reinstalling the package. Re-run python -m pip install -e . after changing package metadata or dependencies.

If you prefer an isolated virtual environment:

python3.12 -m venv .venv
source .venv/bin/activate
python -m pip install -e .

To update a source checkout later:

git pull --ff-only origin main

If the update changed dependencies or package metadata, follow it with:

python -m pip install -e .

Usage

Launch the desktop GUI

Run either command with no arguments:

jaketts

or:

jtts

The GUI launches in its own process, so the terminal prompt is returned immediately while the desktop window remains open.

Speak text using the default voice

jtts "Three Rings for the Elven-kings under the sky."

Choose a voice

Voice IDs are passed directly without a --voice flag:

jtts af_sarah "Hello from an American female voice."
jtts am_adam "Hello from an American male voice."

The voice can appear before or after the text:

jtts "This also uses Adam." am_adam

If no recognized voice ID is supplied, bm_george is used.

Japanese voices

Japanese voices work without a separate setup command:

jtts jf_alpha "こんにちは世界"

On the first Japanese invocation only, jaketts downloads the full UniDic dictionary automatically. Later Japanese invocations reuse the downloaded dictionary.

Read a text file

jtts story.txt

With an explicit voice:

jtts am_adam story.txt

Save to the default output file

A bare -o or --output saves to output.wav:

jtts -o "Save this narration."

This also works when a voice immediately follows -o:

jtts -o am_adam "Save this using Adam."

Save to a custom WAV file

jtts -o narration.wav "Save this narration."

or:

jtts --output narration.wav am_adam "Save this narration."

Equals syntax is also supported:

jtts --output=narration.wav "Save this narration."

Change speech speed

jtts -s 1.25 "Speak this a little faster."
jtts --speed 0.9 am_adam "Speak this a little slower."

Equals syntax is supported as well:

jtts --speed=1.1 "Slightly faster speech."

Flexible argument ordering

The CLI normalizes recognized options and voice IDs before handing them to argparse, so these layouts are valid:

jtts am_adam "Hello" -o hello.wav
jtts -o hello.wav "Hello" am_adam
jtts "Hello" -s 1.1 am_adam -o hello.wav
jtts am_adam "Hello" -o

Show the installed version

-v is the version flag:

jtts -v

or:

jtts --version

Voice reference

Some commonly useful Kokoro voices include:

Voice ID Family Description
bm_george British English Default narrator
bm_lewis British English Male British voice
bf_emma British English Female British voice
af_heart American English Expressive female voice
af_sarah American English Female American voice
am_adam American English Male American voice
ff_sixtine French Female French voice
jf_alpha Japanese Female Japanese voice
pf_doris Portuguese Female Portuguese voice
zf_xiaobei Chinese Female Chinese voice

The complete supported voice list is defined in VOICE_WHITELIST inside jaketts.py and is also available in the desktop GUI.

Testing

The repository includes an integration test matrix covering output routing, flexible argument ordering, speed options, version flags, text-file input, default voice behavior, and multilingual voice routing.

Run it with:

./test_app.sh

The test script creates temporary WAV/text artifacts and removes them automatically when the test run exits.

Development

Install the clone in editable mode:

python -m pip install -e .

The package version is defined in setup.py. jaketts.py reads the installed package metadata using importlib.metadata, so the runtime version output does not need a second hardcoded version string.

Before building a release:

./test_app.sh
rm -rf dist build *.egg-info
python -m build
python -m twine check dist/*

License

See LICENSE for the project's license terms.

Metadata

Release files for jaketts 1.0.6

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for jaketts 1.0.6
File Size Uploaded
jaketts-1.0.6.tar.gz 15.2 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for jaketts 1.0.6
File Interpreter ABI Platform
jaketts-1.0.6-py3-none-any.whl Python 3 none any Details

Total release size: 30.3 kB

Release files / jaketts-1.0.6.tar.gz

Download URL jaketts-1.0.6.tar.gz
Size 15.2 kB
Tags Source
SHA-256 checksum
How to use checksums
5aef90ee7bc8a2e5cef007164a77049618a80ca0aa36662f6a01066a963f3805
BLAKE2b-256 checksum
How to use checksums
43f88186493d6f7dbd7d61712fa63377629e712d04bbabfd96f8a8a328aea3c7
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.12.14

Release files / jaketts-1.0.6-py3-none-any.whl

Download URL jaketts-1.0.6-py3-none-any.whl
Size 15.1 kB
Tags Python 3
SHA-256 checksum
How to use checksums
ed0d26415d1b7b4adc4d5cc17956647b88086733faad22cf4243ff096f29b661
BLAKE2b-256 checksum
How to use checksums
1ddd49a2e6d2ada26934b3110cdc10f710a9b3e34e095ba0e841b9543e08fb16
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.12.14

Release history Release notifications | RSS feed

1.0.9

2 release files

1.0.8

2 release files

1.0.7

2 release files

This release

1.0.6 This release

2 release files

1.0.5

2 release files

1.0.4

2 release files

1.0.3

2 release files

1.0.2

2 release files

1.0.1

2 release files

1.0.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page