File size: 6,227 Bytes
6cb7e59
 
 
 
 
1670477
6cb7e59
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1670477
 
 
 
 
 
 
 
 
 
 
 
 
6cb7e59
 
 
 
 
 
1670477
6cb7e59
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1670477
6cb7e59
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1670477
6cb7e59
1670477
 
6cb7e59
 
 
 
 
 
 
1670477
6cb7e59
 
 
1670477
6cb7e59
 
 
 
 
1670477
 
 
 
 
 
 
 
 
 
 
 
 
 
6cb7e59
 
1670477
 
 
6cb7e59
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
import sys
import traceback
import logging
import warnings
import os
import gradio as gr

# Придушення попереджень
warnings.filterwarnings('ignore')

# Налаштування логування
logging.basicConfig(
    level=logging.INFO,
    format='%(asctime)s - %(levelname)s: %(message)s',
    handlers=[
        logging.StreamHandler(sys.stdout),
        logging.FileHandler('app_log.txt', mode='w')
    ]
)
logger = logging.getLogger(__name__)

# Безпечний імпорт модулів
try:
    import torch
    import torchaudio
    import g4f
    from transformers import pipeline
    from TTS.api import TTS
    from gtts import gTTS
    logger.info("All modules imported successfully")
except Exception as e:
    logger.error(f"Error importing modules: {e}")
    logger.error(traceback.format_exc())

# Функція для перекладу через g4f
def neural_translate(text, target_language, source_language):
    try:
        prompt = f"Translate the following text from {source_language} to {target_language} keeping the original meaning and emotional tone: '{text}'"

        response = g4f.ChatCompletion.create(
            model="gpt-3.5-turbo",  # Using 3.5-turbo instead of gpt-4 for better compatibility
            messages=[{"role": "user", "content": prompt}],
            stream=False
        )

        return response.strip()
    except Exception as e:
        logger.error(f"Помилка нейронного перекладу: {e}")
        return text

# Функція для створення TTS з використанням gTTS
def gtts_synthesize(text, target_language, output_filename='output_gtts.wav'):
    try:
        # Створення TTS
        tts = gTTS(text=text, lang=target_language)
        tts.save(output_filename)

        return output_filename
    except Exception as e:
        logger.error(f"Помилка gTTS: {e}")
        return None

# Безпечна транскрипція
def safe_transcribe_audio(audio_path):
    try:
        asr = pipeline("automatic-speech-recognition", model="openai/whisper-tiny")  # Using tiny model for faster loading
        result = asr(audio_path)
        return result['text']
    except Exception as e:
        logger.error(f"Помилка транскрипції: {e}")
        return f"Помилка транскрипції: {str(e)}"

# Маппінг мов
LANGUAGE_MAP = {
    'uk': 'ru',  # Ukrainian -> Russian (closest in gTTS)
    'zh-cn': 'zh-cn',
    'hi': 'hi'
}

# Безпечний синтез мовлення
def safe_clone_and_synthesize(audio_path, source_language, target_language):
    try:
        # Перевірка вхідних даних
        if not audio_path:
            return None, "Помилка: Не завантажено аудіо", ""

        # 1. Транскрипція аудіо
        original_text = safe_transcribe_audio(audio_path)
        logger.info(f"Транскрибований текст: {original_text}")

        # 2. Нейронний переклад тексту
        translated_text = neural_translate(original_text, target_language, source_language)
        logger.info(f"Перекладений текст: {translated_text}")

        # 3. Вибір методу синтезу
        mapped_language = LANGUAGE_MAP.get(target_language, target_language)

        # Спроба використати клонування голосу для підтримуваних мов
        output_path = None
        try:
            logger.info("Attempting to use TTS for voice cloning")
            tts = TTS(model_name="tts_models/multilingual/multi-dataset/your_tts")
            output_path = "output_cloned.wav"
            tts.tts_to_file(
                text=translated_text,
                file_path=output_path,
                speaker_wav=audio_path,
                language=mapped_language
            )
            logger.info("Voice cloning successful")
        except Exception as e:
            logger.warning(f"Помилка клонування голосу: {e}. Використання gTTS.")
            output_path = gtts_synthesize(translated_text, mapped_language)
            logger.info("gTTS synthesis successful")

        return output_path, original_text, translated_text

    except Exception as e:
        logger.error(f"Загальна помилка: {e}")
        logger.error(traceback.format_exc())
        return None, f"Помилка: {str(e)}", ""

# Інформація про можливі помилки
def show_error_info():
    return """
    # Важлива інформація!
    
    Якщо ви отримали помилку, це може бути через:
    1. Обмеження пам'яті в Hugging Face Spaces
    2. Проблеми з моделлю TTS
    
    Спробуйте використати менші аудіофайли або змінити налаштування.
    """

# Створення Gradio інтерфейсу
with gr.Blocks(title="VoiceClone Translator Pro") as demo:
    gr.Markdown("# 🎙️ VoiceClone Translator Pro")
    gr.Markdown(show_error_info())

    with gr.Row():
        input_audio = gr.Audio(label="Вхідне Аудіо", type="filepath")
        source_language = gr.Dropdown(
            label="Вхідна Мова",
            choices=["en", "uk", "ru", "fr", "de", "es", "it", "pl", "hi", "zh-cn"],
            value="en"
        )
        target_language = gr.Dropdown(
            label="Цільова Мова",
            choices=["en", "uk", "ru", "fr", "de", "es", "it", "pl", "zh-cn", "ja", "ko", "hi"],
            value="en"
        )

    submit_btn = gr.Button("Клонувати та Перекласти")

    with gr.Row():
        output_audio = gr.Audio(label="Результат")
        original_text = gr.Textbox(label="Оригінальний Текст")
        translated_text = gr.Textbox(label="Перекладений Текст")

    submit_btn.click(
        safe_clone_and_synthesize,
        inputs=[input_audio, source_language, target_language],
        outputs=[output_audio, original_text, translated_text]
    )