import tempfile import gradio as gr from datetime import datetime from enum import Enum from ukrainian_tts.tts import TTS from torch.cuda import is_available class StressOption(Enum): AutomaticStress = "Автоматичні наголоси (за словником) 📖" AutomaticStressWithModel = "Автоматичні наголоси (за допомогою моделі) 🧮" class VoiceOption(Enum): Olena = "Олена (жіночий) 👩" Mykyta = "Микита (чоловічий) 👨" Lada = "Лада (жіночий) 👩" Dmytro = "Дмитро (чоловічий) 👨" Olga = "Ольга (жіночий) 👩" print(f"CUDA available? {is_available()}") badge = ( "https://visitor-badge-reloaded.herokuapp.com/badge?page_id=robinhad.ukrainian-tts" ) ukr_tts = TTS(use_cuda=is_available()) def tts(text: str, voice: str, stress: str): print("============================") print("Original text:", text) print("Voice", voice) print("Stress:", stress) print("Time:", datetime.utcnow()) autostress_with_model = ( True if stress == StressOption.AutomaticStressWithModel.value else False ) voice_mapping = { VoiceOption.Olena.value: "olena", VoiceOption.Mykyta.value: "mykyta", VoiceOption.Lada.value: "lada", VoiceOption.Dmytro.value: "dmytro", VoiceOption.Olga.value: "olga", } speaker_name = voice_mapping[voice] text_limit = 7200 text = ( text if len(text) < text_limit else text[0:text_limit] ) # mitigate crashes on hf space with tempfile.NamedTemporaryFile(suffix=".wav", delete=False) as fp: _, text = ukr_tts.tts(text, speaker_name, autostress_with_model, fp) return fp.name, text with open("README.md") as file: article = file.read() article = article[article.find("---\n", 4) + 5::] iface = gr.Interface( fn=tts, inputs=[ gr.components.Textbox( label="Input", value="Введіть, будь ласка, своє р+ечення.", ), gr.components.Radio( label="Голос", choices=[option.value for option in VoiceOption], value=VoiceOption.Olena.value, ), gr.components.Radio( label="Наголоси", choices=[option.value for option in StressOption], value=StressOption.AutomaticStress.value ), ], outputs=[ gr.components.Audio(label="Output"), gr.components.Textbox(label="Наголошений текст"), ], title="🐸💬🇺🇦 - Coqui TTS", description="Україномовний🇺🇦 TTS за допомогою Coqui TTS (щоб вручну поставити наголос, використовуйте + перед голосною)", article=article + f'\n
visitors badge
', examples=[ [ "Введіть, будь ласка, своє речення.", VoiceOption.Olena.value, StressOption.AutomaticStress.value, ], [ "Введіть, будь ласка, своє речення.", VoiceOption.Mykyta.value, StressOption.AutomaticStress.value, ], [ "Вв+едіть, будь ласка, св+оє реч+ення.", VoiceOption.Dmytro.value, StressOption.AutomaticStress.value, ], [ "Привіт, як тебе звати?", VoiceOption.Olga.value, StressOption.AutomaticStress.value, ], [ "Договір підписано 4 квітня 1949 року.", VoiceOption.Lada.value, StressOption.AutomaticStress.value, ], ], ) iface.launch(enable_queue=True)