File size: 4,259 Bytes
a7b6452
 
 
84502d4
 
 
 
 
 
 
 
a7b6452
 
 
 
 
 
 
 
 
84502d4
a7b6452
 
 
 
 
84502d4
a7b6452
 
 
 
 
 
 
 
 
 
84502d4
a7b6452
 
 
 
 
 
84502d4
a7b6452
 
 
 
84502d4
a7b6452
 
 
 
 
 
 
84502d4
a7b6452
 
 
 
84502d4
a7b6452
 
 
 
84502d4
a7b6452
 
 
 
 
 
 
 
 
 
 
 
 
 
 
84502d4
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
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