MozilLaz / demo.py
Anadilorg's picture
Upload folder using huggingface_hub
a75e3ff verified
Raw
History Blame Contribute Delete
5.08 kB
#!/usr/bin/env python3
"""
MozilLaz — Gradio Interactive Demo
Bu demo, tarayıcı üzerinden Lazca TTS deneyimi sağlar.
Yüklemek için: pip install gradio
Çalıştırma:
python demo.py
python demo.py --port 7861
python demo.py --share
Ardından tarayıcınızda http://localhost:7860 adresine gidin.
"""
import argparse
import json
import sys
import warnings
from pathlib import Path
import numpy as np
import soundfile as sf
warnings.filterwarnings("ignore", category=UserWarning)
warnings.filterwarnings("ignore", category=FutureWarning)
try:
import gradio as gr
except ImportError:
print("❌ Gradio yüklenmemiş. Kurmak için: pip install gradio")
print("\nYa da CLI kullanın: python inference.py --text '...'")
sys.exit(1)
# inference.py'deki doğrulanmış yükleyiciyi yeniden kullan
from inference import DEFAULT_BASE_MODEL, load_model, resolve_device
# Lazca örnek cümleler
LAZCA_SAMPLES = [
"[speaker:spk_tmp_001 language:lzz] Nanışkimi uç den ikayme.",
"[speaker:spk_tmp_001 language:lzz] Dido ini on.",
"[speaker:spk_tmp_001 language:lzz] Ğormotik gamaǩç̌ǩvidan.",
"[speaker:spk_tmp_001 language:lzz] Aya lemşik va duç̌vinasinon.",
"[speaker:spk_tmp_001 language:lzz] Lazuri vao, fendo vao.",
]
def load_model_once():
"""Modeli hafızada tut (her seferinde tekrar yükleme)."""
if not hasattr(load_model_once, "_model"):
script_dir = Path(__file__).parent
config_path = script_dir / "config.json"
base_model_name = DEFAULT_BASE_MODEL
if config_path.exists():
with open(config_path, encoding="utf-8") as f:
base_model_name = json.load(f).get("base_model", DEFAULT_BASE_MODEL)
load_model_once._model = load_model(
base_model_name,
lora_config_path=script_dir / "lora_config.json",
lora_weights_path=script_dir / "lora_weights.safetensors",
device=resolve_device("auto"),
)
return load_model_once._model
def synthesize(text: str, timesteps: int, cfg_value: float):
"""Metinden ses üret ve WAV dosya yolu döndür."""
if not text.strip():
return None
model = load_model_once()
audio = model.generate(
text=text,
inference_timesteps=int(timesteps),
cfg_value=float(cfg_value),
)
audio = np.asarray(audio).squeeze()
sample_rate = getattr(getattr(model, "tts_model", None), "sample_rate", 48000)
tmp_path = "/tmp/mozilaz_demo.wav"
sf.write(tmp_path, audio, sample_rate)
return tmp_path
def gradio_interface(port: int = 7860, share: bool = False):
"""Gradio UI oluştur."""
examples = LAZCA_SAMPLES
with gr.Blocks(title="MozilLaz — Lazca TTS", theme=gr.themes.Soft()) as demo:
gr.Markdown("""
# 🎙️ MozilLaz — Lazca Text-to-Speech
**Lazca açık kaynak TTS modeli** (VoxCPM2 + LoRA, ~21.000 eğitim örneği)
> *İpucu:* Aşağıdaki örneklerden birine tıklayın veya kendi Lazca metninizi yazın!
""")
with gr.Row():
with gr.Column():
text_input = gr.Textbox(
label="Lazca Metin",
placeholder="[speaker:spk_tmp_001 language:lzz] Metin burada...",
value=examples[0]
)
timesteps_slider = gr.Slider(
minimum=5, maximum=30, value=10, step=1,
label="Inference Adımları (daha yüksek = daha kaliteli ama yavaş)"
)
cfg_slider = gr.Slider(
minimum=1.0, maximum=4.0, value=2.0, step=0.1,
label="CFG Value (konuşma kalitesi)"
)
btn = gr.Button("🎙️ Ses Üret", variant="primary")
with gr.Column():
audio_output = gr.Audio(label="Çıktı Ses", type="filepath")
gr.Examples(
examples=examples,
inputs=text_input,
label="Lazca Örnek Cümleler"
)
btn.click(
fn=synthesize,
inputs=[text_input, timesteps_slider, cfg_slider],
outputs=audio_output
)
gr.Markdown(f"""
### Teknik Detaylar
- **Base Model:** [VoxCPM2 (OpenBMB)](https://huggingface.co/openbmb/VoxCPM2)
- **LoRA Rank:** 32, **Alpha:** 32
- **Eğitim Verisi:** ~21.000 Mozilla Lazca segment
- **Sample Rate:** 48 kHz
- **Speaker:** spk_tmp_001
### Kurulum
```bash
pip install torch torchaudio soundfile safetensors numpy voxcpm gradio
git clone https://huggingface.co/Anadilorg/MozilLaz
cd MozilLaz
python demo.py
```
""")
demo.launch(server_port=port, share=share)
if __name__ == "__main__":
parser = argparse.ArgumentParser(description="MozilLaz Gradio Demo")
parser.add_argument("--port", type=int, default=7860, help="Port numarası")
parser.add_argument("--share", action="store_true", help="Public share link oluştur")
args = parser.parse_args()
gradio_interface(port=args.port, share=args.share)