--- language: - yue - zh - nl - en - fr - de - it - ja - ko - pl - es license: apache-2.0 base_model: - Audio8/Audio8-TTS-Preview-0.6b tags: - text-to-speech - tts - multilingual - onnx - phoonnx - arktts - voice-cloning pipeline_tag: text-to-speech library_name: phoonnx --- # phoonnx-audio8-tts ONNX export of **[`Audio8/Audio8-TTS-Preview-0.6b`](https://huggingface.co/Audio8/Audio8-TTS-Preview-0.6b)** — an 11-language text-to-speech model — packaged for the [phoonnx](https://github.com/OpenVoiceOS/phoonnx) `arktts` engine. Upstream ships PyTorch only. These graphs were exported with [`scripts/conversion/arktts/export_arktts_onnx.py`](https://github.com/OpenVoiceOS/phoonnx/tree/dev/scripts/conversion/arktts), using the same contract and the same tensor names as the official export of the model's Basque fine-tune, [`itzune/zortzi-tts-onnx`](https://huggingface.co/itzune/zortzi-tts-onnx), so graphs from either source are interchangeable. Languages: Cantonese, Chinese, Dutch, English, French, German, Italian, Japanese, Korean, Polish, Spanish. ## Usage ```python from phoonnx.model_manager import TTSModelManager from phoonnx.voice import TTSVoice voice = TTSVoice.load(TTSModelManager().get_voice("arktts/audio8-maider/en")) audio = voice.synthesize("The quick brown fox jumps over the lazy dog.") ``` Voice ids are `arktts/audio8-{maider,antton}/{yue,zh,nl,en,fr,de,it,ja,ko,pl,es}`. ## Files ``` slow_ar_fp16.onnx 24-layer backbone, KV-cached (1.35 GB) fast_ar_fp16.onnx 4-layer depth transformer (134 MB) codec_decoder_fp16.onnx 10 codebooks -> 44.1 kHz waveform (278 MB) tokenizer.json the model's own Qwen2 subword BPE voices/maider.json reference codes + transcription voices/antton.json reference codes + transcription runtime_manifest.json precision and architecture metadata ``` ## Voices, and where they come from Upstream ships **no reference voices** — Audio8 is a cloning model, and a voice is the codec codes of a short clip rather than an entry in a speaker table. To make it usable as a preset-voice engine, this mirror carries two voices encoded from the reference clips published in [`itzune/zortzi-tts`](https://huggingface.co/itzune/zortzi-tts): `voices/maider.wav` and `voices/antton.wav`. Those clips are from the **HiTZ-Aholab Basque TTS dataset** (CC BY 4.0). They condition **timbre, not language** — the model infers the language from the text — so both voices are offered for all eleven languages, and the WER table below is what they actually sound like in each. The clips are Basque, which is not one of Audio8's languages; that is fine for conditioning and is stated here so nobody has to work it out. The two checkpoints carry a byte-identical `codec.pth`, so re-encoding those clips with Audio8's own codec reproduces the codes upstream published for Zortzi: codebook 0 matches exactly, and all ten codebooks agree on 99.2 to 99.6 % of frames. The published Zortzi codes are shipped here for that reason — they are the reproducible artifact. To add your own voice, encode a clip offline with `scripts/conversion/arktts/mint_voice.py`. This mirror ships the codec **decoder** only; cloning at synthesis time would need the encoder, which is not exported. ## What was verified Checked against the PyTorch checkpoint (float32) with `scripts/conversion/arktts/verify_parity.py`, over 24 lockstep greedy decode steps: | Tensor | max abs diff | greedy agreement | note | |---|---|---|---| | prompt `[1, 11, T]` | — | exact | identical to upstream's own processor output | | slow AR logits | 0.118 | 24/24 | | | slow AR hidden | 0.039 | — | | | fast AR logits | 1.36 | 208/216 | every miss is a tie; worst margin 0.225 | | codec decoder | 6.3e-4 | — | correlation 0.999999 | The fast AR is noisier here than in the official Zortzi export because the half-precision graph accumulates its RMS norms in half precision rather than single — the explicit float32 round-trip upstream writes cannot survive the fp16 converter. It changes no greedy decision that was not already a tie. Intelligibility, one sentence per language per voice, transcribed with `onnx-community/whisper-large-v3-turbo` on CPU: | Language | WER | Note | |---|---|---| | en | 0.000 | | | de | 0.000 | | | es | 0.000 | | | it | 0.000 | | | nl | 0.125 | one clip, one recogniser slip | | pl | 0.143 | the recogniser wrote "10" for "dziesięć" | | fr | 0.333 | the recogniser heard a plural subject in both clips | Cantonese, Chinese, Japanese and Korean are **not** covered by this run. Whisper is the only model in `onnx-asr` that claims `yue` at all, and a Whisper-only Cantonese number would say more about the recogniser than about the voice; when those are measured they should be scored by character (CER), not by word. CPU real-time factor on twelve cores: **13.1x** (Maider), **14.3x** (Antton) — slower than the official Zortzi graphs at 8x, because this export carries the tied embedding matrix twice and is not otherwise optimised. This is not a real-time model on CPU. ## Licence and attribution Apache-2.0, from the base model. The model is by **Audio8**; this repository only exports and repackages it. The reference clips that carry the two voices are from the **HiTZ-Aholab Basque TTS dataset** (CC BY 4.0, [10.5281/zenodo.17952596](https://doi.org/10.5281/zenodo.17952596)), by way of [`itzune/zortzi-tts`](https://huggingface.co/itzune/zortzi-tts). That licence conditions the voices, so redistributing them *or audio generated with them* carries the attribution below. > The HiTZ-Aholab speech synthesis dataset was developed with funding from the Ministerio > para la Transformación Digital y de la Función Pública and Plan de Recuperación, > Transformación y Resiliencia — Funded by EU — NextGenerationEU within the framework of the > project ILENIA (ref. 2022/TL22/00215335), and by a grant from the Department of Culture > and Language Policy of the Basque Government (IKER-GAITU project). ```bibtex @dataset{navas_hernaez_2025_17952596, author = {Navas, Eva and Hernaez Rioja, Inmaculada and Saratxaga, Ibon and Sanchez, Jon and García Romillo, Víctor and Flores Ríos, Mariana and Bellanco, Aitor}, title = {{HiTZ-Aholab speech synthesis dataset in Basque}}, month = dec, year = 2025, publisher = {Zenodo}, version = {1.0}, doi = {10.5281/zenodo.17952596}, url = {https://doi.org/10.5281/zenodo.17952596} } ``` ## Known limitations Upstream's, carried over unchanged: - **Numbers are mispronounced** — spell them out in the text. - **No text normalization** — expand acronyms yourself ("TTS" as "te te ese"). - **Sampling is required** — greedy decoding never reaches end-of-speech. The engine's defaults (temperature 0.8, top-p 0.95) are upstream's. Specific to this export: - **Half precision only.** The codec decoder is the fp16 graph from `itzune/zortzi-tts-onnx`, which is valid here because both checkpoints carry the same `codec.pth`; it is verified above against *this* model's PyTorch codec. - **No codec encoder**, so cloning is an offline step. - **`slow_ar_fp16.onnx` is about 270 MB larger than it needs to be** — the tracer materialises the tied output projection separately from the embedding table.