Spaces:
Build error
Build error
| 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] | |
| ) |