Text-to-Speech
CosyVoice
ONNX
Safetensors
Catalan
catalan
conversational
cosyvoice3
laughter

A glass of vermouth with orange and olive says: Fem un vermut? [laughter]. Its voice is a sound wave drawn as red bars on gold, the Catalan colours.

vermut-tts: Catalan conversational TTS

Catalan that sounds like a chat, not the evening news.

vermut-tts is a text-to-speech model for casual Central Catalan, fine-tuned from Fun-CosyVoice3-0.5B-2512. It is named after fer el vermut, the weekend aperitif where friends meet for a vermouth and a chat: that is the Catalan it was built to speak. It comes with a voice, and takes yours instead from a 3–10 s recording; the model brings the Catalan.

  • 🗣️ Talks, doesn't read. Catalan TTS voices are usually trained on read speech. vermut-tts learned its register from recorded Catalan conversations, with the rhythm and intonation of people talking.
  • 😄 Laughs when asked. Write [laughter] where you want the laugh.
  • 🌍 A new language for CosyVoice 3. Catalan is not among Fun-CosyVoice3's nine languages; the first training stage taught it, with about 65 h of Catalan speech.

Licence: CC BY-NC-SA 4.0, free for non-commercial use.

En català. vermut-tts és un model de síntesi de veu per al català central col·loquial: parla com en una conversa, no com en un telenotícies, i riu quan li ho demanes amb [laughter]. Porta una veu de sèrie, o hi poses la teva amb una gravació de 3 a 10 segons; el model hi posa el català. Llicència CC BY-NC-SA 4.0, per a ús no comercial.

Listen

An introduction, the Quick start lines and the banner line, synthesised with the shipped voice (seed 7):

  • Hola! Com estàs? Soc el vermut-TTS, un model d'intel·ligència artificial de síntesi de veu, entrenat per Fabrício Carraro per ser un model obert al servei de la societat catalana. Moltes gràcies per ajudar-me a tenir veu!

  • Bon dia! Com estàs?

  • Vinga, va, que t'ho dic de debò. [laughter]

  • hola

  • Fem un vermut? [laughter]

Quick start

pip install -U huggingface_hub
hf download fabriciocarraro/vermut-tts --local-dir vermut-tts && cd vermut-tts
git clone --recursive https://github.com/FunAudioLLM/CosyVoice && (cd CosyVoice && git checkout 074ca6dc9e80a2f424f1f74b48bdd7d3fea531cc && git submodule update --init --recursive)
pip install torch torchaudio        # or the build for your platform from https://pytorch.org
pip install -r requirements.txt     # the inference dependencies of CosyVoice and of this wrapper
export PYTHONPATH=$PWD/CosyVoice:$PWD/CosyVoice/third_party/Matcha-TTS
python synthesize.py --model-dir . --text "Bon dia! Com estàs?" --out out.wav
python synthesize.py --model-dir . --text "Vinga, va, que t'ho dic de debò. [laughter]" --out laugh.wav
python synthesize.py --model-dir . --text "hola" --out hola.wav
python synthesize.py --model-dir . --ref-wav my_voice.wav --text "Bon dia! Com estàs?" --out mine.wav   # your own voice

In Python, from the same folder and with CosyVoice on PYTHONPATH:

from synthesize import Vermut
import soundfile as sf

tts = Vermut(".")                                           # loads the model once
wav, sr = tts.say("Bon dia! Com estàs?")                    # shipped voice; float32 mono, 24 kHz
sf.write("out.wav", wav, sr)
wav, sr = tts.say("Fem un vermut? [laughter]", ref_wav="my_voice.wav", seed=3, tempo="normal")

say() takes the same options as the command line (ref_wav, tempo, seed, instruct, carrier, polish, spell_acronyms); tts.last holds the normalised text, the mode and the aligned end of the last call.

The first run downloads the MMS_FA aligner weights through torchaudio. CosyVoice also tries to fetch its own text-frontend resources from ModelScope and, when that fails (a 403 in our runs), prints no frontend is avaliable: harmless, the wrapper does not use that frontend. The output is a 24 kHz mono WAV. GPU recommended; CPU inference was not tested.

option what it does
--ref-wav 3–10 s recording of the target voice; it sets the timbre only. Default: voices/default.wav, the voice shipped with the package (a volunteer speaker who authorised its use; see Licence). Use a voice you have the right to use.
--tempo normal (default), lent or ràpid: one of the three instructs used in training. The model was checked with normal.
--seed sampling seed (default 7), for repeatable output on the same setup
--carrier carrier phrase for single-word inputs (default Mira.; '' turns it off)
--no-align skips the MMS_FA aligner, and with it the carrier and the aligned fade
--no-polish skips the aligned fade at the end and the final peak normalisation
--keep-acronyms keeps acronyms as written (TTS) instead of spelling them letter by letter (te-te-essa); see Tips

--instruct takes a custom instruct ending in <|endofprompt|>; the model was trained and evaluated only on the three above. Inline tags: [laughter] is evaluated below; [breath] appears in the training data but was not evaluated.

Tips

  • Text. Write Catalan as you would type it in a chat; numbers, hours and ordinals are read by the normaliser (a les 8 → a les vuit). Acronyms are spelled letter by letter (TTS → te-te-essa), which works for some (TV3, DNI) and not for others. Try --keep-acronyms too, or write the acronym as words.
  • Length. The model was tuned and checked on short sentences (4–9 words), but lines of about 35 words usually come out perfectly in informal tests. For a longer paragraph, it may be better to synthesise one sentence at a time and join the WAVs with about 300 ms of silence.
  • Laughter. [laughter] right after a short question or exclamation laughs in nearly every take; at the very end of a long sentence it is missed about one time in ten. The laugh's length varies with the seed (0.5–3 s): generate three seeds and keep the one you like.
  • Takes. Sampling is random: the same text with another --seed is another take.
  • Your voice. 3–10 s of one speaker, clean, no music or other voices; any sample rate, mono or stereo. Only the timbre is taken; pronunciation and rhythm come from the model.

Requirements

  • Download: 5.4 GB.
  • GPU memory: about 5.5 GB at peak with the ONNX speech tokenizer and speaker encoder on CPU (the onnxruntime package); with onnxruntime-gpu the speech tokenizer takes its own GPU memory.
  • Software: Python 3.11, PyTorch 2.12 to 2.14 with CUDA 13.0, CosyVoice at commit 074ca6dc unchanged, and the packages in this folder's requirements.txt, tested together in a fresh environment on Linux aarch64. CosyVoice's own requirements.txt is for training and serving and pins an older PyTorch; it is not needed here.

How it works

Inference flow. Text goes through Catalan text prep (wrapper), then the fine-tuned language model with the instruct, then edge trimming (wrapper), then the unchanged Fun-CosyVoice3 flow and vocoder with the reference voice, then the aligned ending (wrapper), and out as a 24 kHz WAV.

The language model decides how the sentence is said: Catalan pronunciation, rhythm, register and laughter. It never hears your reference clip, which enters only at the flow-matching stage and gives the tokens your timbre.

Around the model, synthesize.py normalises the Catalan text, trims silence at both ends of the token sequence, pads it so that the vocoder does not click, ends the audio after the last aligned word, and says single words inside a carrier phrase that it cuts away.

part file in this release
wrapper: Catalan normaliser, edge trimming, aligner, carrier, fade synthesize.py, vermut/ new (Apache-2.0)
speech language model (Qwen2.5-0.5B backbone) llm.pt, CosyVoice-BlankEN/ fine-tuned; text vocabulary + 44 Catalan phone tokens
speech tokenizer (25 Hz, 6 561 codes) speech_tokenizer_v3.onnx upstream, unchanged
speaker encoder (CAM++) campplus.onnx upstream, unchanged
flow matching (tokens → mel spectrogram) flow.pt upstream, unchanged
vocoder (HiFT, 24 kHz) hift.pt upstream, unchanged

Training

Fine-tuned from Fun-CosyVoice3-0.5B-2512 in stages: Catalan (about 65 h of parliamentary and read speech: ParlamentParla v3, LaFresCat, Glissando-ca news), conversational register (Glissando-ca free and task dialogues, 24 speakers), then two rounds of preference tuning on the model's own takes, for laughter on request. The supervised stages used real recordings only; no other TTS system was involved.

Intended use

  • Good fit: non-commercial projects that need casual Catalan speech: research, teaching materials, prototypes of voice assistants, games and audio content.
  • Not allowed: commercial use (licence); cloning a real person's voice without their consent; imitating the speakers of the training corpora; passing synthetic speech off as real (disclose it; EU AI Act, art. 50).
  • Not evaluated: formal reading, and Catalan varieties other than Central.

Known limitations

  • Laughter: a short unnatural pause between speech and laugh remains in part of the outputs, sentences that start with a laugh sometimes have the end of speech cut short, and laughter is missing in about one request in ten, mostly at the very end of a sentence.
  • jo/ja are sometimes realised with [j] instead of [ʒ]. Final unstressed e is sometimes not reduced.
  • Occasional rising intonation at the end of statements, and an occasional clipped final phoneme or light breath at the end.
  • Single words are said inside a carrier phrase (Mira.); a faint click at the end remains in some takes.
  • Acronyms: the normaliser spells them letter by letter, which fails for some (TTS right in about 1 take in 5; with --keep-acronyms, about 1 in 2); two-letter acronyms such as IA came out wrong either way in an informal test. Numbers and hours are read correctly.
  • Tuned and evaluated for Central Catalan casual conversation; other varieties and formal reading were not evaluated.
  • Outputs carry no watermark.

Licence

  • Weights (llm.pt): CC BY-NC-SA 4.0, required by the training data: Glissando-ca (CC BY-NC-SA 3.0 Spain, whose ShareAlike clause allows a later version) and LaFresCat (CC BY-NC 4.0; commercial use only through licensing by the voice artists).
  • ParlamentParla v3 (projecte-aina/parlament_parla_v3, CC BY 4.0): stage 1 used a subset of the clean_train segments in their original, non-anonymised form, with the data holders' agreement to this release (the public release of the corpus is anonymised).
  • Code (synthesize.py, vermut/): Apache-2.0. Components redistributed from Fun-CosyVoice3-0.5B-2512 (flow, vocoder, tokenizers, CosyVoice-BlankEN/): Apache-2.0; modified files are listed in NOTICE. The wrapper downloads the MMS_FA aligner (CC BY-NC 4.0) at run time; --no-align avoids it. The tools used to prepare the training data are listed in NOTICE.
  • The Glissando-ca speakers agreed to the use of their recordings for non-profit research and teaching, also by third parties (confirmed by the corpus coordinator, October 2026). No speaker of the training corpora consented to voice cloning: no preset of a training speaker is shipped, and the model must not be used to imitate them.
  • The shipped voice (voices/default.wav) is a recording of a volunteer speaker who is in none of the training corpora and who authorised in writing its distribution with vermut-tts and its use as the model's reference voice. His name is not published.

Data attribution

  • Glissando-ca, a freely distributed corpus available at ELRA (ELRA-S0407) under a Creative Commons licence (CC BY-NC-SA 3.0 Spain). Garrido, J. M. et al. (2013). "Glissando: a corpus for multidisciplinary prosodic studies in Spanish and Catalan". Language Resources and Evaluation 47(4), 945–971. doi:10.1007/s10579-012-9213-0.
  • LaFresCat (projecte-aina/LaFresCat), CC BY-NC 4.0.
  • ParlamentParla v3 (projecte-aina/parlament_parla_v3), CC BY 4.0. Source: Parlament de Catalunya (plenary sessions); data processed for this model in September 2026.

All three were re-cut and re-punctuated for training; Glissando-ca transcripts were also partly respelled (jo/ja).

Author

Fabrício Carraro
fabricio@fabriciocarraro.com.br

Downloads last month
53
Inference Providers NEW
This model isn't deployed by any Inference Provider. 🙋 Ask for provider support

Model tree for fabriciocarraro/vermut-tts

Quantized
(29)
this model

Dataset used to train fabriciocarraro/vermut-tts