Instructions to use eigenhand/Articulatio-DE with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- PEFT
How to use eigenhand/Articulatio-DE with PEFT:
from peft import PeftModel from transformers import AutoModelForCausalLM base_model = AutoModelForCausalLM.from_pretrained("BreezeBlue/Breeze-TTS-2") model = PeftModel.from_pretrained(base_model, "eigenhand/Articulatio-DE") - Notebooks
- Google Colab
- Kaggle
Articulatio-DE
German text-to-speech with zero-shot voice cloning: a LoRA fine-tune of Breeze TTS 2.
Derived from Breeze TTS 2 by BreezeBlue and licensed for research and non-commercial use only.
Articulatio-DE is an independent community project. It is not affiliated with, endorsed by, or an official release of BreezeBlue or RESONIA, INC.
| Version | Repository | For |
|---|---|---|
| LoRA adapter | this repository | Python / PEFT, further training |
| GGUF Q8_0 and Q4_K | eigenhand/Articulatio-DE-GGUF | C++ engine articulatio.cpp: NVIDIA, AMD, Intel (Vulkan) or CPU |
| MLX 4 bit | eigenhand/Articulatio-DE-MLX | Apple Silicon with articulatio-mlx |
Sample
„Guten Morgen! Heute ist Donnerstag, der fünfundzwanzigste September. Draußen sind es achtzehn Grad, am Nachmittag zieht von Westen ein Gewitter auf. Vergiss also den Regenschirm nicht, wenn du später noch zum Bahnhof fährst.“
Synthetic speech, generated with Articulatio-DE (GGUF Q8_0, one sentence per piece, speed 1.25 with the pitch preserved, 150 ms pause between sentences) in a voice the model created itself; it belongs to no real person. The clip is an output of the model and falls under the same license.
What it does
- Speaks German naturally in the voice of a short reference recording (voice cloning) or in a voice described by an instruction (voice design).
- Keeps English: English data was part of every training stage after the first.
- Robust to poor references: cloned from a reverberant, noisy, hummy or telephone-band reference, the output stays clean (estimated SNR 38–41 dB, within 0–4.5 dB of cloning from the clean clip); the voice match drops somewhat (ECAPA similarity 0.66 instead of 0.73). A dedicated clean-studio instruction was trained in the last stages but has no measurable additional effect, so none is needed.
Everything else works as in Breeze TTS 2 — instructions, streaming — with one
exception: vocal event tags such as (laugh) or (sigh) have largely been
lost and only rarely produce the sound in German. See the
Breeze TTS 2 model card.
A delivery instruction on a cloned voice (for example "a gravelly old pirate
captain") only takes effect at cfg_scale 3; at 1 and 2 it made no audible
difference. The timbre stays that of the reference. Voice design without a
reference follows the instruction at 1 already. The fine-tune has considerably
weakened instruction following: instructions take effect much less strongly
than with Breeze TTS 2. The C++ engine defaults to cfg_scale 1 (guidance off).
Files
| File | Use |
|---|---|
adapter_model.safetensors, adapter_config.json |
LoRA adapter (PEFT) for the Breeze TTS 2 weights |
samples/demo.wav |
the sample above |
SHA256SUMS |
checksum of the adapter |
LICENSE |
BreezeBlue Research and Non-Commercial License Agreement |
NOTICE |
required notices and data attributions |
Usage
Input text
The training transcripts are plain words: numbers were written out, and symbols such as °, %, € or / do not occur. Digits and symbols in the input are therefore read unreliably. The German text frontend writes them out ("Am 3. Oktober um 14:30 Uhr, 23 °C" becomes "Am dritten Oktober um vierzehn Uhr dreißig, dreiundzwanzig Grad Celsius"), also ordinals, units, abbreviations and simple formulas, removes Markdown and emoji, and can run as a proxy in front of the server.
C++ engine (GGUF)
With a GGUF from Articulatio-DE-GGUF and articulatio.cpp, a fork of Breeze-TTS-2.cpp (Vulkan on NVIDIA, AMD and Intel GPUs, or CPU):
build/breeze-cli articulatio-de-q8_0.gguf \
--text "Guten Morgen, heute ist ein schöner Tag." \
--ref-audio reference.wav --ref-text "Exakter Wortlaut der Sprachprobe." \
--output out.wav
build/breeze-server articulatio-de-q8_0.gguf --host 127.0.0.1 --port 8080 --pause-ms 150
The server offers the HTTP API /v1/audio/speech and a WebSocket API for
incremental text from a chat model. The fork splits streamed text into one
sentence per piece and keeps the voice consistent across pieces; see
docs/inference.md in the repository.
Apple Silicon (MLX)
A 4-bit MLX conversion is in eigenhand/Articulatio-DE-MLX; run it with articulatio-mlx, faster than realtime on an M3 Pro. Pass one sentence at a time.
Python (PEFT)
The adapter needs the Breeze TTS 2 base weights. scripts/merge_lora.py in
articulatio-training
merges it into them (base model path from BREEZE_CKPT); infer.py then runs on the merged folder:
python scripts/merge_lora.py <adapter-dir> merged/
python infer.py merged/ --text "Guten Morgen." \
--ref-audio reference.wav --ref-text "Exakter Wortlaut der Sprachprobe." \
--output out.wav
Training
Method
- LoRA with rank 64, alpha 64, rank-stabilized scaling, on the q, k, v, o, gate, up and down projections of the backbone, the depth decoder and the text encoder: 148.3 million trainable parameters. The base weights, the audio tokenizer and the vocabulary are unchanged.
- 90 % of the examples are voice clones: the reference is a different recording of the same speaker, so the model learns the voice and not the recording. The other 10 % are conditioned on an instruction only.
- Batches of 8 with 4 accumulation steps (32 examples per optimizer step), warmup of 50 steps.
- Corpus weights: HUI and Thorsten-Voice 1.5, HiFiTTS-2 2.0, the broad Common Voice selection 0.6, everything else 1.0. Examples containing everyday German words that are rare in the data are drawn up to four times as often.
- Final stage: for the studio-quality corpora (HUI, Thorsten-Voice, HiFiTTS-2), 35 % of the references were degraded synthetically (colored noise, mains hum, synthetic room reverb, telephone band, MP3 and Opus artifacts, clipping, microphone coloration) and paired with the clean-studio instruction and the clean target. Another 25 % carry the instruction with a clean reference. No external noise recordings were used.
- Trained on one AMD Radeon AI PRO R9700 (32 GB).
Stages
Each stage continues from the adapter of the previous one.
| Stage | Data | Optimizer steps | Learning rate |
|---|---|---|---|
| 1 | CML-TTS German | 4,500 | 3e-5 |
| 2 | HUI, HiFiTTS-2 (English) | 2,500 | 3e-5 |
| 3 | stage 2 plus rare-word selections from Thorsten-Voice, CML-TTS and Common Voice | 1,000 | 3e-5 |
| 4 | full mix (table below), one epoch | 9,508 | 3e-5 |
| 5 | full mix, second epoch with degraded references, stopped after a third | 3,000 | 2e-5 |
| 6 | cooldown with the settings of stage 5 | 500 | 1.5e-5 → 0 (cosine) |
Data
About 630 hours in total; stages 4 and 5 used 338,055 clips (463.5 hours, clips up to about 10 seconds, 90/5/5 split into train, validation and test).
| Corpus | Language | Hours | License |
|---|---|---|---|
| Common Voice 27.0, broad selection (at most 100 clips per speaker) | de | 229.0 | CC0 1.0 |
| Common Voice 27.0, rare-word selection | de | 59.5 | CC0 1.0 |
| HUI-Audio-Corpus-German | de | 100.9 | CC0 |
| Thorsten-Voice TV-2021.02 and TV-2022.10, neutral, rare-word selection | de | 15.9 | CC0 1.0 |
| CML-TTS German (full set in stage 1, rare-word selection afterwards) | de | 174.3 | CC BY 4.0 |
| HiFiTTS-2 | en | 51.1 | CC BY 4.0 |
Common Voice clips were kept only if at least two listeners had validated them and none had rejected them, if they were 2.5 to 10 seconds long with a signal-to-noise ratio of at least 20 dB, little mains hum and a bandwidth of at least 10 kHz. In all corpora, transcripts were reduced to letters and basic punctuation with numbers written out, and clips with an implausible speaking rate (below 4 or above 30 characters per second) were dropped. No audio or text from these corpora is included in this repository.
Evaluation
130 utterances of the held-out test split (104 speakers, all six corpora), each cloned from a different recording of its speaker, scored with Whisper large-v3 (WER, text normalized) and ECAPA speaker similarity to the reference. "Recordings" are the real recordings of the same sentences: Whisper's own error rate and the similarity of two real clips of one speaker. 95 % bootstrap intervals in brackets; one seed per item, so differences between variants inside the intervals are sampling noise.
| WER German | WER English | Speaker similarity | |
|---|---|---|---|
| Recordings | 4.4 % (2.9–5.9) | 2.6 % (1.2–4.1) | 0.715 |
| GGUF Q8_0 (C++ engine) | 4.2 % (2.7–6.0) | 2.6 % (1.1–4.3) | 0.716 |
| GGUF Q4_K (C++ engine) | 5.8 % (3.4–8.6) | 2.6 % (1.1–4.2) | 0.714 |
| MLX, 4 bit (Articulatio-DE-MLX) | 4.6 % (3.1–6.3) | 3.1 % (1.6–4.6) | 0.706 |
- Long text in one piece derails after 15–40 s (WER 17–77 % on ~70 s passages). Split into sentences, as the C++ server does, the same passages reach 1.6–6.2 % WER over 71–82 s with a stable voice.
- Chinese: CER 58–73 % on ten sentences, i.e. no longer usable.
- Validation loss on 96 stratified validation items: 6.338 at the end of stage 4, 6.406 for the released model.
- Speed (real-time factor, lower is faster), with Vulkan: 0.49 (Q8_0) and 0.43 (Q4_K) on an NVIDIA RTX 4070, 0.69 and 0.65 on an AMD Radeon AI PRO R9700; 0.69 with the 4-bit MLX conversion on an Apple M3 Pro (articulatio-mlx).
Full method, all tables and the scripts: docs/RESULTS.md in the
training repository.
Limitations
- Vocal event tags (
(laugh),(sigh)and the like) only rarely work in German; the fine-tune trained on plain read speech without such events. - German and English only. Chinese, which Breeze TTS 2 also speaks, was not part of the fine-tune and no longer works (CER 58–73 %).
- Long passages must be generated sentence by sentence (see Evaluation).
- Instructions (tone, pace, character) take effect much less strongly than
with Breeze TTS 2; on cloned voices they need
cfg_scale3 (see What it does). - Text with digits, symbols or unusual abbreviations should be normalized first (see Input text).
Responsible use
Clone only voices whose speakers have explicitly agreed, and use the model and its outputs only non-commercially. The full terms, including what counts as misuse, are in the LICENSE (Sections 4 and 5).
License
The model is distributed under the BreezeBlue Research and Non-Commercial License Agreement, the license of Breeze TTS 2; see also NOTICE. The code of the C++ engine and of the training repository is licensed separately under Apache 2.0.
Breeze TTS 2 is licensed under the BreezeBlue Research and Non-Commercial License Agreement. Copyright (c) 2026 RESONIA, INC. All Rights Reserved.
Acknowledgements
- Breeze TTS 2 by BreezeBlue, the base model.
- Breeze-TTS-2.cpp by HoppouAI, the C++ engine this project builds on.
- The speakers and creators of the training corpora:
- R. Ardila et al., Common Voice: A Massively-Multilingual Speech Corpus, LREC 2020.
- P. Puchtler, J. Wirth, R. Peinl, HUI-Audio-Corpus-German: A High Quality TTS Dataset, KI 2021.
- T. Müller, Thorsten-Voice datasets, 10.5281/zenodo.5525342 and 10.5281/zenodo.7265581.
- F. S. Oliveira, E. Casanova, A. Cândido Júnior, A. S. Soares, A. R. Galvão Filho, CML-TTS: A Multilingual Dataset for Speech Synthesis in Low-Resource Languages, arXiv:2306.10097.
- R. Langman, X. Yang, P. Neekhara, S. Hussain, E. Casanova, E. Bakhturina, J. Li, HiFiTTS-2: A Large-Scale High Bandwidth Speech Dataset, Interspeech 2025.
- Downloads last month
- 18