Skip to main content

ptts for Python

Python bindings for the Phonon Rust runtime.

To try it with uv, run:

uvx ptts --lang en "Hello world" -o out.wav

uvx handles the isolated Python environment and package dependencies. The first run downloads the default model, Phonon 31m, and caches it. --model accepts a local checkpoint directory or a Hugging Face repo as hf://owner/name, such as hf://gradium/phonon-40m-fr with --lang fr.

To use the Python API in your own environment, install the package:

pip install ptts

The wheel contains no model weights. Without a model argument, TTS downloads the default model on first use and caches it:

import ptts

tts = ptts.TTS(lang="en")
print(tts.voices)
tts.save("out.wav", "Hello world")

For a source install, use uv add /path/to/xn-ptts/ptts-pyo3 or pip install /path/to/xn-ptts/ptts-pyo3. Source builds need Rust installed; supported CPython wheels do not. See the development guide for repository build commands.

model, the first argument, names a local directory, a config.json, or a Hugging Face repo as "hf://owner/name" or "hf://owner/name@revision". Left out, it is ptts.DEFAULT_MODEL. Local paths download nothing. Gated repos, such as the Phonon 40m models, need their terms accepted on the model's Hugging Face page, then HF_TOKEN set or hf auth login. Rust examples, Python, and both servers use the shared checkpoint resolver. Every checkpoint supplies its own config.json and tokenizer.json. q8 prefers model.q8.gguf and q4k model.q4k.gguf; other formats prefer model.safetensors. Voices come from voices/ or embeddings/, plus default-voice.safetensors as default. Hub downloads use the revision after @ for all files. config= and revision= still work but are deprecated.

lang is required: en, fr, de, es or pt picks how numbers, symbols and abbreviations are spelled out, ar, hi, ko, pl, sv, fi, no, it, nl, ja, zh, da and tr spell out symbols only; none uses the text as written. ptts.normalize("It costs $5.", lang="en") shows that reading, "It costs 5 dollars.", without loading a model, and takes the same rewrites.

Speech and voices

Reuse tts across requests. Use synth for an array, save for a WAV, or stream for chunks as they are decoded:

voice = tts.voices[0]
pcm = tts.synth("Hello", voice=voice)  # 1-D float32 NumPy array
seconds = tts.save("out.wav", "Hello", voice=voice)
with tts.stream("A longer sentence.", voice=voice) as audio:
    for chunk in audio:
        print(chunk.shape)  # process each PCM chunk as it arrives

tts.sample_rate is the PCM sample rate; save writes a mono 16-bit WAV and returns its duration. Leaving the with block stops a stream early and waits for its workers to finish. Streaming keeps bounded audio and latent buffers: leaving a stream unread pauses generation once they fill, and consuming chunks lets it resume.

tts.voices lists the voices that were found, and tts.languages the languages the checkpoint's config says it was trained for. When no voice is given, the checkpoint's configured default is used, then default if present, then the first by name. Pass voice="name" to any speech method to select one. A name the checkpoint does not have is looked up in the voice catalog, by name in any case and with or without accents, or by its voice ID. Only that voice is downloaded, on first use, and then joins tts.voices. The catalog is ptts.DEFAULT_VOICE_CATALOG, gradium/phonon-voices, unless voice_catalog= names another: an hf://owner/name[@revision] repo, or a local voices.jsonl or a folder holding one. tts.add_voice("NAME", "voice.safetensors") adds a voice file, such as one from the Gradium Studio scripts. ptts.catalog_voices() lists it without loading a model, and ptts.catalog_voices(catalog) another one. To change the speaking rate, pass conditions={"duration_delta": -0.3} to speak faster, or a positive value to speak slower.

Command line

The package also provides the ptts command:

python -m ptts --lang en "Hello world" -o out.wav

--model loads another model, as TTS's first argument does. --voice selects a voice of the checkpoint or of --voice-catalog, and --list-voices prints the catalog's voices. Run with --help for the remaining options. The package ships type stubs and py.typed.

Wheels

Linux and Windows x86_64 wheels target x86-64-v3 (AVX2, FMA and F16C); older x86 CPUs need a source build. The macOS x86_64 wheel does not need AVX.

Released wheels are cp39-abi3, so one per platform covers every CPython from 3.9 on, and a new CPython release needs no new wheel. Free-threaded CPython and PyPy cannot load an abi3 extension, so those two install from the sdist and compile the Rust runtime, which needs a Rust toolchain and takes a few minutes.

License

MIT or Apache-2.0, at your option. The model weights are not part of the package and come with their own licenses: Phonon 31m is under Apache 2.0, and Phonon 40m and Phonon 40m multilingual are under CC BY-NC 4.0. See each model's page on Hugging Face.

Metadata

Release files for ptts 0.6.0

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

Source distribution (sdist)

Source distribution for ptts 0.6.0
File Size Uploaded Provenance Actions
ptts-0.6.0.tar.gz 308.5 kB Without provenance Details for ptts-0.6.0.tar.gz

Built distributions (wheels)

Table of built distributions (wheels) for ptts 0.6.0
File Actions
ptts-0.6.0-cp39-abi3-win_arm64.whl CPython 3.9 abi3 Windows ARM64 Details for ptts-0.6.0-cp39-abi3-win_arm64.whl
ptts-0.6.0-cp39-abi3-win_amd64.whl CPython 3.9 abi3 Windows x86-64 Details for ptts-0.6.0-cp39-abi3-win_amd64.whl
ptts-0.6.0-cp39-abi3-musllinux_1_2_x86_64.whl CPython 3.9 abi3 Linux musl 1.2+ x86-64 Details for ptts-0.6.0-cp39-abi3-musllinux_1_2_x86_64.whl
ptts-0.6.0-cp39-abi3-musllinux_1_2_aarch64.whl CPython 3.9 abi3 Linux musl 1.2+ ARM64 Details for ptts-0.6.0-cp39-abi3-musllinux_1_2_aarch64.whl
ptts-0.6.0-cp39-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl CPython 3.9 abi3 Linux glibc 2.17+ x86-64 Details for ptts-0.6.0-cp39-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
ptts-0.6.0-cp39-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl CPython 3.9 abi3 Linux glibc 2.17+ ARM64 Details for ptts-0.6.0-cp39-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl
ptts-0.6.0-cp39-abi3-macosx_11_0_arm64.whl CPython 3.9 abi3 macOS 11.0+ ARM64 Details for ptts-0.6.0-cp39-abi3-macosx_11_0_arm64.whl
ptts-0.6.0-cp39-abi3-macosx_10_12_x86_64.whl CPython 3.9 abi3 macOS 10.12+ x86-64 Details for ptts-0.6.0-cp39-abi3-macosx_10_12_x86_64.whl

Total release size: 56.3 MB

Release files / ptts-0.6.0.tar.gz

Download URL ptts-0.6.0.tar.gz
Size 308.5 kB
Tags Source
SHA-256 checksum
How to use checksums
5fcddd13b99a97d704e5b48ff29673429fe279cb8a358e7c61093275f50f4582
BLAKE2b-256 checksum
How to use checksums
12c95bf790a2f345ea839afd156a2ee9c294c3556eea9ad75521db8dc00ee95d
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Release files / ptts-0.6.0-cp39-abi3-win_arm64.whl

Download URL ptts-0.6.0-cp39-abi3-win_arm64.whl
Size 6.6 MB
Tags CPython 3.9 Windows ARM64 abi3
SHA-256 checksum
How to use checksums
9d319ffb543d2caacc8d6cfa2f247034854b19eea6c68b9f4222ee9fcd657e3e
BLAKE2b-256 checksum
How to use checksums
c806c471eb730a3cc75bd6c2b0d785abbfd6c6d0d5b592f590c93953ce602951
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Release files / ptts-0.6.0-cp39-abi3-win_amd64.whl

Download URL ptts-0.6.0-cp39-abi3-win_amd64.whl
Size 6.9 MB
Tags CPython 3.9 Windows x86-64 abi3
SHA-256 checksum
How to use checksums
786d5222af8764133ee52c82a8088cce5d2f0cf1b8de05e10f62670327aec0da
BLAKE2b-256 checksum
How to use checksums
c730608151c24f51553408bdb3a5458dcf34b400577c2fdf6db8cba647edb659
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Release files / ptts-0.6.0-cp39-abi3-musllinux_1_2_x86_64.whl

Download URL ptts-0.6.0-cp39-abi3-musllinux_1_2_x86_64.whl
Size 7.5 MB
Tags CPython 3.9 Linux musl 1.2+ x86-64 abi3
SHA-256 checksum
How to use checksums
4510a3c2269b31708843ea64cc5144deea4fd299afa5cf686bf2f9c45d0aa18f
BLAKE2b-256 checksum
How to use checksums
5206c18550c9ab5a14fad86234629687d5f10a2544f356ee3e7abf1a95e9befb
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Release files / ptts-0.6.0-cp39-abi3-musllinux_1_2_aarch64.whl

Download URL ptts-0.6.0-cp39-abi3-musllinux_1_2_aarch64.whl
Size 7.0 MB
Tags CPython 3.9 Linux musl 1.2+ ARM64 abi3
SHA-256 checksum
How to use checksums
2cd86e007eb4af0eb80802300d5b96939d84bf01e6cee05e93be0d38c60f1448
BLAKE2b-256 checksum
How to use checksums
54258cbda25e376556ddb261687b3a616d572a13055ae2feb16d4f176027d335
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Release files / ptts-0.6.0-cp39-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl

Download URL ptts-0.6.0-cp39-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
Size 7.5 MB
Tags CPython 3.9 Linux glibc 2.17+ x86-64 abi3
SHA-256 checksum
How to use checksums
6efb197e73af258e278e90fcc771f36022c5123e9ecca2fca50ae90472caa60c
BLAKE2b-256 checksum
How to use checksums
625f2c68115af9499a1c8d4395850eb758efd95aca20bc351c8d969962a39c53
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Release files / ptts-0.6.0-cp39-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl

Download URL ptts-0.6.0-cp39-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl
Size 6.8 MB
Tags CPython 3.9 Linux glibc 2.17+ ARM64 abi3
SHA-256 checksum
How to use checksums
2dcfc6f2e9775f62536396b7018ee2b390998064b63b7cd1291c931d9e8b3cf5
BLAKE2b-256 checksum
How to use checksums
4c4994af8a54ac3da90adf633cc6bb1c9221cbe901b104a932279dac25f36e06
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Release files / ptts-0.6.0-cp39-abi3-macosx_11_0_arm64.whl

Download URL ptts-0.6.0-cp39-abi3-macosx_11_0_arm64.whl
Size 6.9 MB
Tags CPython 3.9 abi3 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
28ca52dceb36e128b040dc6d566975e01a5fe4f8b297d4d87165ec51c65be88c
BLAKE2b-256 checksum
How to use checksums
8401267cffc824f868d59af59d9251456cf8f3b17a63f1b4012cde6afacf2fc6
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Release files / ptts-0.6.0-cp39-abi3-macosx_10_12_x86_64.whl

Download URL ptts-0.6.0-cp39-abi3-macosx_10_12_x86_64.whl
Size 6.9 MB
Tags CPython 3.9 abi3 macOS 10.12+ x86-64
SHA-256 checksum
How to use checksums
f956979b39d9471f69d6e1dcde5c4ec1bc5b4f77379c8b3c39919b0cee44140b
BLAKE2b-256 checksum
How to use checksums
e0daa8fd38fbea256613dc5493626c671bc6699a7522b86063563438ae928a74
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Security for ptts 0.6.0

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

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