|
Download README.md from elitexp/Swar: direct link, hf CLI and curl.
- Browser
- Download file 7.51 kB
-
https://huggingface.co/elitexp/Swar/resolve/main/README.md
- Command line
-
hf download hf://elitexp/Swar/README.md
-
curl -L -o README.md https://huggingface.co/elitexp/Swar/resolve/main/README.md
7.51 kB
| license: cc-by-nc-4.0 | |
| language: | |
| - ne | |
| - en | |
| pipeline_tag: text-to-speech | |
| library_name: pytorch | |
| tags: | |
| - text-to-speech | |
| - tts | |
| - nepali | |
| - styletts2 | |
| - kokoro | |
| - customer-service | |
| # Swar | |
| **Swar** (स्वर, "voice") is a small, experimental text-to-speech model for **Nepali and | |
| English**, including sentences that mix the two, tuned toward a calm customer-service manner | |
| of speaking. | |
| - **38.5 M parameters**, 16 kHz output. The architecture is derived from | |
| [Kokoro-82M](https://huggingface.co/hexgrad/Kokoro-82M) (StyleTTS2 family), built from its layer | |
| classes: non-autoregressive, so a sentence is generated in one pass. | |
| - Reads **Devanagari and Latin letters directly**: no phonemiser, no language switch. | |
| Numbers, currency ("Rs. 250", "रु ५००"), times and phone numbers are written out in words in | |
| the language of their sentence. | |
| - **Default voice: `bijaya`** (`voices/bijaya.pt`). Any 3-10 s clip of one speaker gives | |
| another voice. | |
| - Fast: about **15x real time on a desktop CPU** with all cores, about 6x on a single thread, | |
| and about 30x on a consumer GPU (measured on a Ryzen 9 5900X and an RTX 3090). | |
| Try it in the Space: [Nepali Call Center Experimental - Powered by Swar](https://huggingface.co/spaces/elitexp/Nepali-Swar-Call-Center-Experimental). | |
| ## Quick start | |
| ```bash | |
| pip install torch torchaudio transformers safetensors huggingface_hub soundfile | |
| ``` | |
| ```python | |
| import sys, soundfile as sf | |
| from huggingface_hub import snapshot_download | |
| folder = snapshot_download("elitexp/Swar") | |
| sys.path.insert(0, folder) | |
| from swar import Swar | |
| tts = Swar.from_pretrained(folder) # GPU if available, else CPU | |
| wav, sr = tts.synthesize("नमस्ते, ग्राहक सेवा केन्द्रमा यहाँलाई स्वागत छ।") # voice "bijaya" | |
| sf.write("hello.wav", wav, sr) | |
| # another voice from a reference clip, a little slower, with clear pauses at punctuation | |
| wav, sr = tts.synthesize("Your balance is Rs. 250. धन्यवाद।", | |
| voice="my_reference.wav", speed=0.95, pause_floor_ms=300) | |
| ``` | |
| From the command line, inside the downloaded folder: | |
| ```bash | |
| python -m swar.inference "नमस्ते, यहाँलाई स्वागत छ।" -o hello.wav | |
| ``` | |
| ### Options | |
| | argument | meaning | | |
| |---|---| | |
| | `voice` | a name from `voices/` (default `bijaya`), a `.pt` of style vectors, or an audio clip (wav / flac / mp3 / ogg) | | |
| | `speed` | 0.5-2.0, scales the predicted durations (1.0 = as predicted) | | |
| | `pause_floor_ms` | every comma / full stop / question mark *inside* a sentence lasts at least this long (0 = as predicted) | | |
| | `loanwords` | in a mostly-Nepali sentence, common English words are said the Nepali way ("recharge" -> रिचार्ज, "balance" -> ब्यालेन्स; list in `swar/loanwords.py`). Default on | | |
| | `sentence_pause_ms` | silence between two sentences (default 350); the start and end of each sentence are trimmed, so the first sound comes within about 0.1 s | | |
| | `return_info` | also return timing and the exact letters the model read | | |
| ## What is inside | |
| | part | params | role | | |
| |---|---|---| | |
| | PL-BERT (ALBERT, letters) + projection | 3.5 M | contextual letter features | | |
| | prosody predictor | 9.7 M | duration per letter, pitch and energy at 80 Hz | | |
| | prosodic style encoder | 3.5 M | manner of speaking from a reference clip | | |
| | text encoder | 3.2 M | letter features for the decoder | | |
| | decoder (iSTFTNet with harmonic source) | 15.1 M | waveform at 16 kHz | | |
| | acoustic style encoder | 3.5 M | timbre from a reference clip | | |
| A voice is two 128-d vectors: acoustic (timbre, read by the decoder) and prosodic (manner, | |
| read by the predictor). `voices/bijaya.pt` stores them as `{"s_ac", "s_pr"}`. | |
| Files: `swar.safetensors` (inference weights only), `config.json`, `swar/` (model, | |
| text front-end, mel, inference; Kokoro's layer code is vendored under `swar/kokoro/` with its | |
| Apache-2.0 licence), `voices/`. | |
| ## Training | |
| Trained from scratch in five stages, after the StyleTTS2 / Kokoro recipe adapted to letters at | |
| 16 kHz: | |
| 1. **PL-BERT** on Nepali and English text (masked letters). | |
| 2. **Letter aligner** (CTC) on both languages, for durations. | |
| 3. **Acoustic model**: text encoder, decoder and both style encoders, adversarial training with | |
| multi-period and multi-resolution discriminators (300 k steps). | |
| 4. **Prosody**: duration, pitch and energy predictors and the prosodic style encoder (100 k steps). | |
| 5. **Register**: a short fine-tune (6 k steps) of the prosody half on about 8 hours of | |
| customer-service style Nepali recordings, with general data replayed so the rest of the model | |
| does not drift. | |
| Data (acoustic and prosody stages): about 800 hours of Nepali speech from public corpora | |
| (including OpenSLR 43 and OpenSLR 143) and other licensed and in-house recordings, part of it | |
| synthetic, and about 570 hours of English speech synthesised with Kokoro-82M (`af_heart`). | |
| ## Evaluation | |
| - **Copy-synthesis intelligibility** (stage 3, durations and pitch taken from the real clip, | |
| recognised by the same ASR as the real recordings): Nepali character error rate through a | |
| G.711 telephone channel 0.199 against 0.220 for the real recordings (285 clips); English word | |
| error rate 0.097 against 0.098 (200 clips). | |
| - **Customer-service register** (stage 5): median pitch stays within 15 Hz of the reference | |
| voice. The pause rate (about 0.13 pauses per second, about 0.20 with `pause_floor_ms=300`) | |
| is still below the 0.30-0.45 target band: pauses are only lengthened where the text has | |
| punctuation. | |
| - Full text-to-speech intelligibility has not yet been measured with the same protocol. | |
| ## Limitations | |
| - Experimental. Rare words, names and some English spellings can be mispronounced; Nepali | |
| rhythm is less polished than English. | |
| - 16 kHz, telephone-oriented; not a studio-quality voice. | |
| - Voices from a reference clip copy that clip's recording conditions too; use clean audio. | |
| ## Responsible use | |
| Swar can speak in a voice taken from a short recording. Only use voices you have permission to | |
| use, label synthetic speech as synthetic where people could mistake it for a person, and do not | |
| use the model to impersonate anyone or to deceive. | |
| ## Acknowledgements | |
| Swar would not exist without **[Kokoro-82M](https://huggingface.co/hexgrad/Kokoro-82M)** by | |
| hexgrad. Its architecture is Swar's blueprint: the text encoder, the prosody predictor (duration, | |
| pitch and energy), the iSTFTNet decoder with its harmonic source and the split acoustic / prosodic | |
| style design all come from Kokoro, and Kokoro's own layer code is vendored in `swar/kokoro/`. Swar | |
| re-sizes that design for 16 kHz, reads letters instead of phonemes, adds trainable style encoders | |
| and is trained from scratch; Kokoro (voice `af_heart`) also generated Swar's English training | |
| speech. Kokoro in turn builds on [StyleTTS2](https://github.com/yl4579/StyleTTS2) (Li et al.), whose | |
| style encoder and PL-BERT recipe Swar also uses. | |
| ## License | |
| The Swar weights (`swar.safetensors`, `voices/`) and Swar's own code are released under | |
| **[CC BY-NC 4.0](https://creativecommons.org/licenses/by-nc/4.0/)**: free for research and other | |
| non-commercial use, with attribution. The vendored Kokoro code in `swar/kokoro/` stays under its | |
| original Apache-2.0 licence (`swar/kokoro/LICENSE`); the StyleTTS2 style encoder code is MIT. | |
| Training data includes [OpenSLR](https://www.openslr.org/) corpora under their own licences. | |