|
import tempfile |
|
from typing import Optional |
|
from TTS.config import load_config |
|
import gradio as gr |
|
import numpy as np |
|
import os |
|
import json |
|
from TTS.utils.manage import ModelManager |
|
from TTS.utils.synthesizer import Synthesizer |
|
|
|
|
|
MAX_TXT_LEN = 100 |
|
|
|
SPEAKERS = ['f_cen_05', 'f_cen_81', 'f_occ_31', 'f_occ_de', 'f_sep_31', 'm_cen_08', 'm_occ_44', 'm_val_89'] |
|
|
|
def tts(text, speaker_idx): |
|
if len(text) > MAX_TXT_LEN: |
|
text = text[:MAX_TXT_LEN] |
|
print(f"Input text was cutoff since it went over the {MAX_TXT_LEN} character limit.") |
|
print(text) |
|
|
|
model_path = os.getcwd() + "/best_model.pth" |
|
config_path = os.getcwd() + "/config.json" |
|
speakers_file_path = os.getcwd() + "/speakers.pth" |
|
speakers_maping_path = os.getcwd() + "/speaker_map.json" |
|
vocoder_path = None |
|
vocoder_config_path = None |
|
|
|
synthesizer = Synthesizer( |
|
model_path, config_path, speakers_file_path, None, vocoder_path, vocoder_config_path, |
|
) |
|
|
|
|
|
with open(speakers_maping_path, 'r') as fp: |
|
maping = json.load(fp) |
|
|
|
speaker_idx = maping[speaker_idx] |
|
|
|
|
|
if synthesizer is None: |
|
raise NameError("model not found") |
|
wavs = synthesizer.tts(text, speaker_idx) |
|
|
|
with tempfile.NamedTemporaryFile(suffix=".wav", delete=False) as fp: |
|
synthesizer.save_wav(wavs, fp) |
|
return fp.name |
|
|
|
|
|
description=""" |
|
1️⃣ Introdueix el text a sintetitzar. |
|
|
|
2️⃣ Selecciona una veu en el desplegable. |
|
|
|
3️⃣ Gaudeix! |
|
""" |
|
article= "" |
|
|
|
iface = gr.Interface( |
|
fn=tts, |
|
inputs=[ |
|
gr.inputs.Textbox( |
|
label="Text", |
|
default="L'Èlia i l'Alí a l'aula. L'oli i l'ou. Lulú olorava la lila.", |
|
), |
|
gr.inputs.Dropdown(label="Selecciona un parlant", choices=SPEAKERS, default=None) |
|
], |
|
outputs=gr.outputs.Audio(label="Output",type="filepath"), |
|
title="🗣️ TTS Català Multi Parlant - VITS 🗣️", |
|
theme="grass", |
|
description=description, |
|
article=article, |
|
allow_flagging="never", |
|
flagging_options=['error', 'bad-quality', 'wrong-pronounciation'], |
|
layout="vertical", |
|
live=False |
|
) |
|
iface.launch(share=False) |
|
|