ozzy4's picture
Update app.py
1670477 verified
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]
)