---
language:
- bho
- hi
license: apache-2.0
tags:
- text-to-speech
- tts
- mlx
- parler-tts
- bhojpuri
- lora
- apple-silicon
- indic-languages
base_model: ai4bharat/indic-parler-tts
---
# Indic Parler TTS — Bhojpuri LoRA (MLX)
**First MLX implementation of Parler TTS**, fine-tuned for Bhojpuri language on Apple Silicon.
This is a LoRA adapter on top of [`ai4bharat/indic-parler-tts`](https://huggingface.co/ai4bharat/indic-parler-tts).
The base model supports 18 Indian languages — this adapter teaches it Bhojpuri phoneme patterns.
## Highlights
- Runs **natively on Apple Silicon** (M1/M2/M3/M4) via [MLX](https://github.com/ml-explore/mlx)
- **First Parler TTS port to MLX** — no PyTorch required
- Fine-tuned on the [IISc SYSPIN Bhojpuri corpus](https://spiredatasets.ee.iisc.ac.in/syspincorpus) (CC-BY-4.0)
- LoRA rank-8 adapter — only 4.3M trainable params out of 920M total (0.47%)
- All 69 base model speakers can now speak Bhojpuri
## Model Details
| Property | Value |
|---|---|
| Base model | `ai4bharat/indic-parler-tts` |
| Training data | IISc SYSPIN Bhojpuri Female (5,537 clips) |
| LoRA rank | 8, alpha 16 |
| LoRA targets | Decoder self-attn, cross-attn Q/V, FFN |
| Trained on | MacBook Pro (Apple Silicon) |
| Framework | MLX |
| Training steps | ~1,400 (2 epochs) |
## Audio Samples
> **"ई बहुत नीमन बा। हम कल जाइब।"** — Bhojpuri (short)
| | Base model | Fine-tuned |
|---|---|---|
| Divya | | |
| Generic | | |
> **"रउरा के राम राम। आज हम एही गाँव में रहीला। का हाल बा रउरा के?"** — Bhojpuri (long)
| | Base model | Fine-tuned |
|---|---|---|
| Divya | | |
| Generic | | |
> **"नमस्ते, आप कैसे हैं? मैं बहुत अच्छा हूँ।"** — Hindi sanity check (should sound similar on both)
| | Base model | Fine-tuned |
|---|---|---|
| Divya | | |
| Generic | | |
## Usage
```bash
pip install mlx mlx-lm soundfile
```
```python
import sys
sys.path.insert(0, "path/to/mlx-audio-train")
from models.indic_parler_tts.generate import load_model, generate
from train.lora import apply_lora, load_adapters, LoRAConfig
import soundfile as sf
import mlx.core as mx
from huggingface_hub import snapshot_download
# 1. Load base model
model, tokenizers = load_model("ai4bharat/indic-parler-tts")
# 2. Apply LoRA and load adapter
adapter_dir = snapshot_download("akashicmarga/indic-parler-tts-bhojpuri-lora")
lora_config = LoRAConfig(
rank=8, alpha=16.0, dropout=0.0,
target_modules=[
"decoder.layers.*.self_attn.q", "decoder.layers.*.self_attn.k",
"decoder.layers.*.self_attn.v", "decoder.layers.*.self_attn.out",
"decoder.layers.*.cross_attn.q", "decoder.layers.*.cross_attn.v",
"decoder.layers.*.fc1", "decoder.layers.*.fc2",
],
model_type="indic_parler_tts",
)
apply_lora(model, lora_config)
load_adapters(model, f"{adapter_dir}/adapters.safetensors")
mx.eval(model.parameters())
# 3. Generate Bhojpuri speech
audio = generate(
model, tokenizers,
description="A female speaker delivers speech at a moderate pace. The recording is of very high quality.",
text="रउरा के राम राम। आज हम एही गाँव में रहीला।",
)
sf.write("bhojpuri.wav", audio, 44100)
```
Any speaker description supported by the base model works:
```python
# Divya speaking Bhojpuri
audio = generate(
model, tokenizers,
description="Divya's voice is slightly expressive and very animated. She speaks at a moderate pace.",
text="ई बहुत नीमन बा। हम कल जाइब।",
)
```
## Training
Trained using [mlx-audio-train](https://github.com/akashicmarga/mlx-audio-train) on Apple Silicon.
```bash
python scripts/train.py --config configs/indic_parler_bhojpuri.yaml
```
## Dataset
[IISc SYSPIN Corpus](https://spiredatasets.ee.iisc.ac.in/syspincorpus) — Bhojpuri Female Speaker
License: CC-BY-4.0
## License
Adapter weights: Apache 2.0
Base model: Apache 2.0 (ai4bharat/indic-parler-tts)
Training data: CC-BY-4.0 (IISc SYSPIN)