--- language: - fa license: mit pipeline_tag: text-to-speech base_model: Reza2kn/Gooya-RizehPizeh-v1.5 library_name: piper model_type: text-to-speech tags: - audio - text-to-speech - piper - vits - persian - farsi - negara pretty_name: Gooya RizehPizeh v2 --- # Gooya RizehPizeh v2 Persian (Farsi) single-speaker Piper/VITS2 voice fine-tuned on approved Gemini TTS Wikipedia audio. The model uses a case-sensitive Negara-style phonetic/Finglish frontend and produces 22,050 Hz mono audio. ## Selected checkpoint This release selects the checkpoint at **global step 50,000** (`val_mel = 0.3951`). Training continued to 100,000 global steps, but later validation was worse, so the terminal state is intentionally not promoted. - Generator parameters: approximately 23.7M - Full trainable checkpoint: `checkpoint/gooya-rizehpizeh-v2-step50000-val_mel0.3951.ckpt` - Checkpoint SHA-256: `0c2d22718894e20fb6361c7bf2d75ee54d61db3a167983ce5d843ff6ed438938` - Sample rate: 22,050 Hz - Speakers: 1 - Phoneme type: `text` - Symbol inventory: 256 IDs ## Model lineage The original v1.5 production ONNX did not have a matching resumable checkpoint. A trainable hybrid checkpoint was reconstructed by copying all 350 inference-time generator tensors from the production ONNX into a compatible Mana Piper training checkpoint. Training-only branches absent from ONNX came from that Mana template. Before fine-tuning, a fresh ONNX round-trip matched the production model on 19/19 deterministic test rows: - Worst maximum absolute error: `1.0348856449127197e-05` - Minimum SNR: `110.0768 dB` - Minimum correlation: `0.999999999995` The complete recovery and parity receipts are under `training/`. ## Fine-tuning data The parent corpus came from approved rows in [`Reza2kn/Wikipedia-FA-EN-DeepSeek-V4-Flash-0731`](https://huggingface.co/datasets/Reza2kn/Wikipedia-FA-EN-DeepSeek-V4-Flash-0731). - Requested parent clips: 4,186 (`3,517` train, `669` sealed eval) - Successfully aligned parents: 4,116 - Rejected during alignment: 70 - Materialized segments: 30,965 - Training segments consumed: 26,053 - Sealed eval segments, not consumed by training: 4,912 - Total materialized duration: 68.9853 hours - Segment duration: mean `8.0203s`, min `0.6307s`, max `21.6656s` Audio timing came from AvaSanj v1 CTC forced alignment. Training phoneme labels came from Negara v7.1. Parent-level train/eval boundaries were preserved. ## Training - Precision: BF16 mixed precision - Generator learning rate: `1e-5` - Discriminator learning rate: `5e-6` - Batch size: 1 - Selected validation metric: `val_mel` - Selected checkpoint: global step 50,000, `val_mel = 0.3951` The 100K run was resumed from a successful 2K signal checkpoint. The sealed 669-parent eval split was not used for checkpoint selection. ## Inference and long-form use Input must already be case-sensitive Negara-compatible phonetic text. Example: ```bash echo "zurxAneye vahdat yek makAne varzeSi dar Sahre borujerd ast." | \ piper --model gooya-rizehpizeh-v2.onnx \ --config gooya-rizehpizeh-v2.onnx.json \ --output_file output.wav ``` For long-form narration, do not send an article as one model input. Split at semantic sentence/clause boundaries into substantial spans, synthesize each span independently, trim quiet waveform edges, and join with boundary-aware pauses. The final output duration can be arbitrarily long even though each model invocation remains bounded. ## Limitations - Lower validation mel loss did not guarantee universally better pronunciation. Human listening found some words, including proper nouns, better at the earlier 2K checkpoint or the original v1.5 model. - G2P/Finglish quality remains the dominant source of pronunciation errors. - Very long single-pass phoneme sequences can collapse or omit content; use chunked synthesis. - Overly small chunks sound breathy and robotic. Prefer substantial semantic spans instead of fixed tiny fragments. - This release has not yet been promoted over v1.5 on Gouya.app. ## License MIT. See `LICENSE`.