File size: 6,196 Bytes
67ee63e | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 | ---
license: cc-by-sa-4.0
base_model: FunAudioLLM/CosyVoice2-0.5B
tags:
- nanites
- tts
- text-to-speech
- cosyvoice2
- anonymized-voice
- british-isles
- scottish
- irish
- welsh
- dialect
language:
- en
pipeline_tag: text-to-speech
---
# nanites-isles-speech-{hamish,maisie,seamus,tegan,rhys}
Anonymized, dialect+gender-pooled British Isles English text-to-speech
voices β Scottish, Irish, and Welsh English as crowdsourced in the
**OpenSLR 83** dataset (Google, 2018β19). Built on
[CosyVoice2-0.5B](https://huggingface.co/FunAudioLLM/CosyVoice2-0.5B)
(Apache-2.0, from FunAudioLLM), fine-tuned separately per pool.
## Personas
Pooled voices ship under dialect-appropriate codenames so each identity
is a *persona*, never a single OpenSLR speaker:
| Persona | Dialect/gender | Pool | WER (medium.en) | Anon max cos |
|---|---|---|---|---|
| **Maisie** | Scottish female | 6 speakers / 54.4 min | 26%* | 0.911 |
| **Hamish** | Scottish male | 6 speakers / 53.4 min | 22%* | 0.782 |
| **Seamus** | Irish male | 3 speakers / 22.7 min (thin) | 4.2% | 0.895 |
| **Tegan** | Welsh female | 6 speakers / 60.1 min | 8.9% | 0.871 |
| **Rhys** | Welsh male | 6 speakers / 59.8 min | 0.0% | 0.883 |
\* Scots lines are deliberately written in Scots orthography (e.g.
"dinna fash", "ged your tea"); whisper normalizes them to standard
spelling, so WER is inflated by orthography, not speech errors. The
Irish/Welsh lines use standard English spelling and their WERs are
reflective.
In code/config the voices keep the functional names
`isles-speech-scottish-female` etc. (engine + dialect + gender are
metadata); the codenames are the display/persona names.
**Hugging Face repos are persona-named** (a persona gets its own repo;
a future voice gets a new codename, not a gender suffix):
- `Nanite-Labs/nanites-isles-speech-hamish` (Scottish male)
- `Nanite-Labs/nanites-isles-speech-maisie` (Scottish female)
- `Nanite-Labs/nanites-isles-speech-seamus` (Irish male)
- `Nanite-Labs/nanites-isles-speech-tegan` (Welsh female)
- `Nanite-Labs/nanites-isles-speech-rhys` (Welsh male)
## Why this approach
- **Engine.** Same rationale as the sister `smoky` suite: modern line is
**CosyVoice 2.0** (FunAudioLLM), Apache-2.0. **XTTS is retired** in
this project (dormant, CPML license, poor clustering/cloning control).
- **Identity.** A *regional anon voice* must not replicate any single
OpenSLR speaker. CosyVoice2 SFT collapses each dialect+gender pool
into **one pooled speaker ID** (`<|{pool}_pool|>`), so no single
speaker is recoverable at synthesis time.
- **Anonymization.** Generation feeds the pooled campplus embedding
(average of the pool's members) β no reference audio from any
individual. Max cosine of the pooled embedding to the closest member
is reported per voice above (0.78β0.91; smoky reference ~0.89β0.91).
**Seamus's pool is thin** (3 speakers β the smallest OpenSLR set; the
Irish female pool does not exist in OpenSLR 83, so Irish female is
not offered): its anonymization margin and training-data size are
inherently smaller than the 6-speaker pools.
## Stable persona (zero-shot anchoring)
SFT mode conditions identity only through the pooled embedding, and the
base speech flow can leak timbre from the token sequence β some
short/locked-phrase sentences **deterministically** land in a different
timbre region (diagnosed on Hamish: one sentence regen 3Γ identical but
cosine 0.58 from his anchor). Fix, adopted for all five voices:
**zero-shot anchoring.** Each voice dir carries `anchor.wav` +
`anchor.txt` (a pooled-blend clip chosen by the listener, so the anchor
is itself anonymized); `cosyvoice_infer` clones that clip's timbre for
every new sentence (cosine 0.83β0.94 vs the anchor across novel lines).
Inference is therefore persona-consistent per codename.
## Data & license
- **OpenSLR 83** β "Crowdsourced high-quality UK and Ireland English
Dialect speech data set" (Google, 2018β19), **CC BY-SA 4.0**.
Citation: Demirsahin et al., "Open-source Multi-speaker Corpora of
the English Accents in the British Isles", LREC 2020.
- **CC BY-SA carries over to these voices**: derivatives (incl.
synthesized redistribution) inherit share-alike. This differs from
smoky (public-domain Hall corpus).
- OpenSLR 83 offers 6 dialects Γ male/female; this release covers
Scottish (f+m), Irish (male), Welsh (f+m). The Irish female set is
not offered because OpenSLR 83 only ships `irish_english_male.zip`.
- Audio: 48 kHz mono studio recordings β pooled 24 kHz clean sets with
light spectral-gate denoise, energy-VAD trim, SNR β₯ 8 dB filter,
per-pool caps (6 speakers / ~60 min / 10 min per speaker).
## Training
- **Base:** `FunAudioLLM/CosyVoice2-0.5B` (llm + flow + hift).
- **Data:** pooled chunk sets β kaldi-style dirs (10% cv) β campplus
embeddings + speech tokens β parquet β
`cosyvoice/bin/train.py` (`--model llm`, 1ΓGPU, bf16 AMP,
constant-lr 1e-5, 60 epochs). One speaker ID per pool.
- **Guarding (8 GB GPU):** bitsandbytes AdamW8bit; non-LLM params
frozen; bf16; gradient checkpointing; `KEEP_CKPT=12` in-run pruning
of checkpoints (multi-speaker SFT writes ~1 GB/epoch β ~60 GB if
unpruned).
- **Outputs:** `llm_avg.pt` per voice (**best-8 by val loss** via
`average_model.py --val_best`); final voice dirs assembled with base
flow/hift + baked `spk2info.pt` + anchor + samples.
## Evaluation
- WER: whisper `medium.en` on novel pool dialect lines (see table;
target <12%; Scots lines orthography-inflated).
Tools: `experts/isles/eval_wer.py`, `eval_texts.py`.
- Anonymization: `check_anon.py` β pooled embedding max cosine to a
member, per voice (see table).
- Persona consistency: anchor-mode synthesis lands at cosine 0.83β0.94
vs the anchor across novel lines (vs 0.58 drift pre-fix).
## Report to User
- [x] Whisper WER < 12% on held-out lines (per voice; see table)
- [x] Anonymization check (max cos 0.78β0.91)
- [x] Persona-consistent anchored synthesis (0.83β0.94 vs anchor)
- [x] All five voices signed off by listening; training data pruned
- [ ] Publish zips via `publish_cosyvoice.py --voice ...` (or all) |