cy_en_GB-bu_tts-bangor — Welsh/English Bilingual Neural TTS
A bilingual Welsh (Cymraeg) + English neural text-to-speech model (VITS / Piper architecture) with three professional studio voices.
Unlike a Welsh-only voice, this model pronounces English natively (not Welsh-accented) and handles code-switched cy/en text within a sentence, because it is phonemized with the permissive Bangor Welsh G2P rather than eSpeak.
Developed by: Uned Technolegau Iaith (Language Technologies Unit), Bangor University Model type: Multi-speaker neural TTS (VITS), 3 voices Languages: Welsh (cy) + English (en), bilingual Format: ONNX (+ safetensors checkpoint)
Model details
- Architecture: Piper VITS, medium quality
- Speakers: 3 (professional studio voices; speaker ids
0,1,2) - Sample rate: 22,050 Hz
- Symbols: 256
- Phonemizer: permissive Bangor Welsh G2P —
backend: bangor,english_mode: native,data_version: 9e36c64538890406 - Model size: ~77 MB (ONNX)
What makes this model different
- Native English pronunciation. English words use native English phones (not folded to the nearest Welsh sound), so English and code-switched text sound genuinely English.
- Punctuation-aware pauses. Full-stops, commas, question/exclamation marks etc. are emitted as pause tokens, giving natural phrasing and intonation.
- No eSpeak / GPL at inference. Phonemization is the Bangor G2P, so the runtime stack is permissively licensed.
⚠️ Important: phonemization
This model was trained with the Bangor G2P, so it will not produce correct pronunciation through the default eSpeak-based piper command. You must phonemize with the matching front-end:
- Python reference: piper-cy-local
core/phonemize—BangorG2P(english_mode="native") - C runtime: libcy_phonemize (same repo)
Both emit the exact phoneme-id sequence the model was trained on; the runtime asserts data_version == 9e36c64538890406.
Usage (Python + ONNX Runtime + Bangor G2P)
import numpy as np, onnxruntime as ort, wave, sys
sys.path.insert(0, "piper-cy-local/core/phonemize")
from bangor_g2p import BangorG2P
g2p = BangorG2P(english_mode="native")
sess = ort.InferenceSession("cy_en_GB-bu_tts-bangor-medium.onnx")
scales = np.array([0.667, 1.0, 0.8], dtype=np.float32) # noise, length, noise_w
def synth(text, sid=0, path="out.wav"):
ids = g2p.text_to_ids(text)
audio = sess.run(None, {
"input": np.array([ids], dtype=np.int64),
"input_lengths": np.array([len(ids)], dtype=np.int64),
"scales": scales,
"sid": np.array([sid], dtype=np.int64),
})[0].squeeze()
audio = (audio * (32767 / max(0.01, np.max(np.abs(audio))))).astype("<i2") # peak-normalize
with wave.open(path, "wb") as w:
w.setnchannels(1); w.setsampwidth(2); w.setframerate(22050); w.writeframes(audio.tobytes())
synth("Bore da. Sut wyt ti'n teimlo heddiw?", sid=0) # Welsh
synth("Good morning. How are you feeling today?", sid=1) # English
synth("Nes i fwcio'r tickets ar-lein, so we're all set.", 2) # code-switched
Training
This release is warm-started from a mature English Piper checkpoint for high audio fidelity and native English, then adapted to Welsh:
- Warm-start — the full VITS model (vocoder, flow, encoders and discriminator) is initialised from
en_GB-vctk-medium(rhasspy/piper-checkpoints, Piper's VCTK model, ~1.5 M steps), and only the phoneme-embedding table is reinitialised for the 256 Bangor phonemes. - Fine-tune — trained to convergence on the 3 professional
talentau-llaisstudio voices from techiaith/bu-tts-cy-en-expanded (~46 h), all phonemized with the Bangor G2P (english_mode=native).
Warm-starting from VCTK gives the vocoder a large-scale English acoustic foundation — cleaner, more natural audio and native-sounding English — while Welsh pronunciation is learned from the clean studio data via the Bangor G2P. This supersedes the earlier from-scratch pretrain→SFT model with noticeably better fidelity and English.
Model files
cy_en_GB-bu_tts-bangor-medium.onnx— the TTS model (ONNX)cy_en_GB-bu_tts-bangor-medium.onnx.json— config (phoneme id-map, speaker map,phonemizerblock)cy_en_GB-bu_tts-bangor-medium.safetensors— the training checkpoint, shared pickle-free (safetensors) for safe distribution
Intended use
Screen readers and assistive technology, Welsh/bilingual language-learning apps, and local/offline TTS. Best on general conversational Welsh, English, and mixed cy/en text.
Limitations
- Medium quality — suitable for assistive tech, not studio-grade mastering.
- OOV/technical terms, rare place names, and unusual spellings may mispronounce.
- Neutral/informative tone; limited emotional range.
Licence
Released under CC0-1.0 (public domain) — free to use, modify, and distribute for any purpose without restriction. The model-code (Piper/VITS) is MIT.
Citation
@misc{cy_en_GB_bu_tts_bangor,
author = {{Language Technologies Unit, Bangor University}},
title = {cy\_en\_GB-bu\_tts-bangor: Bilingual Welsh/English Neural TTS (native English, Bangor G2P)},
year = {2026},
publisher = {Hugging Face},
howpublished = {\url{https://huggingface.co/techiaith/cy_en_GB-bu_tts}}
}
Acknowledgments
Built on Piper / the Rhasspy community (VITS training + runtime) and the Bangor pronunciation dictionaries (geiriadur-ynganu-bangor). This model is warm-started from the VCTK Piper checkpoint (en_GB-vctk-medium, rhasspy/piper-checkpoints); the VCTK corpus is © the Centre for Speech Technology Research, University of Edinburgh, and is distributed under CC BY 4.0. Thanks to the wider open-source speech-synthesis community.
Developed to support Welsh-language accessibility and genuinely bilingual Welsh/English speech technology.