import gradio as gr from TTS.api import TTS import os import logging # Настройка логирования logging.basicConfig(level=logging.INFO) logger = logging.getLogger(__name__) # Установка переменной окружения для обхода запроса лицензии os.environ["COQUI_TOS_AGREED"] = "1" def process_audio(audio, language, custom_text): try: if not custom_text: return "Ошибка: Пожалуйста, введите текст для синтеза." if not audio: return "Ошибка: Пожалуйста, загрузите аудиофайл." # 1. Проверка входного аудио logger.info("Проверка аудиофайла...") audio_path = audio if not os.path.exists(audio_path): return "Ошибка: Аудиофайл не найден." # 2. Синтез речи с клонированием голоса logger.info("Синтез речи с клонированием голоса...") lang_map = { "Inglês": "en", "Espanhol": "es", "Francês": "fr", "Alemão": "de", "Italiano": "it", "Português": "pt", "Polonês": "pl", "Turco": "tr", "Russo": "ru", "Holandês": "nl", "Tcheco": "cs", "Árabe": "ar", "Chinês (Simplificado)": "zh-cn", "Japonês": "ja", "Húngaro": "hu", "Coreano": "ko", "Hindi": "hi" } target_lang = lang_map.get(language, "ru") try: logger.info("Загрузка модели XTTS-v2...") tts = TTS( model_name="tts_models/multilingual/multi-dataset/xtts_v2", progress_bar=True, gpu=False ) except Exception as e: logger.error(f"Ошибка загрузки модели XTTS-v2: {e}") return f"Ошибка: Не удалось загрузить модель TTS. Детали: {str(e)}" output_audio = "cloned_audio.wav" try: logger.info("Синтез речи...") tts.tts_to_file( text=custom_text, speaker_wav=audio_path, language=target_lang, file_path=output_audio ) except Exception as e: logger.error(f"Ошибка синтеза речи: {e}") return f"Ошибка: Не удалось синтезировать речь. Детали: {str(e)}" # Проверка результата if os.path.exists(output_audio): logger.info("Синтез завершён успешно.") return output_audio else: return "Ошибка: Выходной файл не создан." except Exception as e: logger.error(f"Общая ошибка: {e}") return str(e) # Gradio интерфейс audio = gr.Audio(label="Загрузите аудиофайл", type="filepath") dropdown = gr.Dropdown(choices=["Inglês", "Espanhol", "Francês", "Alemão", "Italiano", "Português", "Polonês", "Turco", "Russo", "Holandês", "Tcheco", "Árabe", "Chinês (Simplificado)", "Japonês", "Húngaro", "Coreano", "Hindi"], label="Idioma de Destino для синтеза", value="Russo") custom_text_input = gr.Textbox(label="Введите текст для синтеза (обязательно)", placeholder="Например: Привет, это тестовое аудио!") iface = gr.Interface( fn=process_audio, inputs=[audio, dropdown, custom_text_input], outputs=gr.Audio(label="Синтезированное аудио"), title="Синтез аудио с клонированием голоса", description="Загрузите аудиофайл и введите текст для синтеза с клонированием голоса с использованием XTTS-v2." ) if __name__ == "__main__": try: logger.info("Запуск Gradio-приложения...") iface.launch(server_name="0.0.0.0", server_port=7860) except Exception as e: logger.error(f"Ошибка запуска Gradio: {e}") raise