Spaces:
Running
Running
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 |