|
|
import gradio as gr |
|
|
import torch |
|
|
from transformers import AutoProcessor, VitsModel |
|
|
from scipy.io.wavfile import write |
|
|
|
|
|
model_id = "facebook/mms-tts-nko" |
|
|
processor = AutoProcessor.from_pretrained(model_id) |
|
|
model = VitsModel.from_pretrained(model_id) |
|
|
model.to("cpu") |
|
|
|
|
|
|
|
|
nko_to_latin = { |
|
|
"ߞ": "k", "ߐ": "a", "ߣ": "n", "ߌ": "i", |
|
|
"ߔ": "b", "ߘ": "d" |
|
|
} |
|
|
|
|
|
def transliterate_nko(text): |
|
|
return ''.join(nko_to_latin.get(ch, ch) for ch in text) |
|
|
|
|
|
def tts_nko(text): |
|
|
try: |
|
|
latin_text = transliterate_nko(text) |
|
|
inputs = processor(text=latin_text, return_tensors="pt") |
|
|
inputs["input_ids"] = inputs["input_ids"].long() |
|
|
with torch.no_grad(): |
|
|
output = model(**inputs) |
|
|
audio = output.waveform[0].numpy() |
|
|
path = "nko.wav" |
|
|
write(path, rate=model.config.sampling_rate, data=audio) |
|
|
return f"✅ Phát âm: {latin_text}", path |
|
|
except Exception as e: |
|
|
return f"❌ Lỗi: {str(e)}", None |
|
|
|
|
|
with gr.Blocks() as demo: |
|
|
gr.Markdown("# 🔊 N'Ko TTS (ߞߐߣߌ ➝ /kani/)") |
|
|
text_input = gr.Textbox(label="Nhập văn bản bằng chữ N'Ko (VD: ߞߐߣߌ)") |
|
|
output_text = gr.Textbox(label="Ghi chú") |
|
|
output_audio = gr.Audio(label="Phát âm", type="filepath") |
|
|
button = gr.Button("Đọc") |
|
|
|
|
|
button.click(fn=tts_nko, inputs=[text_input], outputs=[output_text, output_audio]) |
|
|
|
|
|
demo.launch() |