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] )