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 G2Pbackend: 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/phonemizeBangorG2P(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:

  1. 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.
  2. Fine-tune — trained to convergence on the 3 professional talentau-llais studio 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, phonemizer block)
  • 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.

Downloads last month

-

Downloads are not tracked for this model. How to track
Inference Providers NEW
This model isn't deployed by any Inference Provider. 🙋 Ask for provider support