YAML Metadata Warning:empty or missing yaml metadata in repo card
Check out the documentation for more information.
Gooya 0.1
Gooya 0.1 is a Persian neural TTS model — a LoRA fine-tune of MOSS-TTS-Nano (100M) trained
on 48k Persian clips phonemized with the Gooya clean G2P (Reza2kn/negara-g2p-clean).
The point of this release is correct Persian pronunciation from phonemes: the model reads the
clean Repr.1 phoneme stream (char-spaced MOSS text) and speaks it naturally, including the
greeting-interjection ezafe rule (سلام من → salAm man, not salAme man).
Quickstart
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer
model = AutoModelForCausalLM.from_pretrained("Reza2kn/gooya-0.1", trust_remote_code=True)
tokenizer = AutoTokenizer.from_pretrained("Reza2kn/gooya-0.1", trust_remote_code=True)
model.to(device="cuda", dtype=torch.bfloat16).eval()
# char-spaced phonemes for "سلام من رضا هستم" (use Gooya G2P to produce this)
phonemes = "s a l A m m a n r e z A h a s t a m"
...
Full inference requires the MOSS-Audio-Tokenizer-Nano codec to decode the 16 codebook streams
back to 48 kHz audio. See MOSS-TTS-Nano for the
reference inference path; the codec is OpenMOSS-Team/MOSS-Audio-Tokenizer-Nano.
How to phonemize Persian text
Gooya 0.1 is a phoneme→speech model. It does not accept raw Persian graphemes. Convert text with the Gooya clean G2P before synthesis:
python scripts/negara_tts_phonemize.py "سلام من رضا هستم"
# سلام من رضا هستم salAm man rezA hastam
Reza2kn/negara-g2p-clean— the T5 G2P that emits word-spaced Repr.1 directly.fix_salame_manpost-processing strips the spurious greeting ezafe (سلام خوبی→salAm xubi) while preserving the legitimate possessive (سلام من را→salAme man rA).- The phoneme string is char-spaced (each phoneme separated by a space) to match MOSS's SentencePiece tokenization.
Training
| Base model | MOSS-TTS-Nano-100M (OpenMOSS-Team/MOSS-TTS-Nano-100M) |
| Data | Reza2kn/gooya-v7-chizzled-multispeaker (raw Persian + audio, ~54k rows) |
| Phonemes | Reza2kn/negara-g2p-clean + fix_salame_man, char-spaced MOSS text |
| Ref voices | same-speaker derangement (each clip paired with another clip from the same speaker) |
| Method | LoRA (r=16, α=32, dropout 0.05) on 48 transformer.h.* linears (1.97% of params) |
| Epochs | 3 |
| Optimizer | AdamW (β1 0.9, β2 0.95), cosine LR 1e-4 → 0, 3% warmup |
| Precision | bf16 mixed precision |
| Hardware | 2× NVIDIA RTX PRO 6000 (96 GB), distributed over 2 GPUs |
| Batch | 8 per device, grad accumulation 2 → effective 32 |
| Steps | 4,524 |
| Held-out | 200 rows (seed 41), used for Gate C eval |
| Final loss | ~5.1 |
Evaluation (Gate C)
For 6 held-out rows, the model synthesizes the row's phoneme text in two timbres:
gate_c/*_manaref.wav— pronunciation + base voice.gate_c/*_demoref.wav— pronunciation + a cross-voice clone (speaker ≠ training speaker).
A Gate C clip passes if pronunciation is correct and voice cloning survives (timbre tracks the
reference, not collapsed to a single speaker). The gate_c/ folder in this repo holds the clips.
Contents
config.json model config (MossTTSNanoForCausalLM)
configuration_moss_tts_nano.py custom config
modeling_moss_tts_nano.py custom model
tokenization_moss_tts_nano.py custom tokenizer
tokenizer.model SentencePiece vocab (16,384)
pytorch_model.bin merged LoRA weights (285 MB)
finetune_config.json exact training hyperparameters
gate_c/ Gate C evaluation clips
License / status
Experimental. Pronunciation quality is good but not production-perfect; the manaref clips are audibly better than the demoref clones. Voice cloning works but is imperfect. Use accordingly.
- Downloads last month
- -