Spaces:
Running
Running
Upload 2 files
Browse files- app.py +82 -0
- requirements.txt +4 -0
app.py
ADDED
@@ -0,0 +1,82 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import gradio as gr
|
2 |
+
from TTS.api import TTS
|
3 |
+
import os
|
4 |
+
|
5 |
+
def process_audio(audio, language, custom_text):
|
6 |
+
try:
|
7 |
+
if not custom_text:
|
8 |
+
return "Ошибка: Пожалуйста, введите текст для синтеза."
|
9 |
+
if not audio:
|
10 |
+
return "Ошибка: Пожалуйста, загрузите аудиофайл."
|
11 |
+
|
12 |
+
# 1. Проверка входного аудио
|
13 |
+
print("Проверка аудиофайла...")
|
14 |
+
audio_path = audio
|
15 |
+
if not os.path.exists(audio_path):
|
16 |
+
return "Ошибка: Аудиофайл не найден."
|
17 |
+
|
18 |
+
# 2. Синтез речи с клонированием голоса
|
19 |
+
print("Синтез речи с клонированием голоса...")
|
20 |
+
lang_map = {
|
21 |
+
"Inglês": "en", "Espanhol": "es", "Francês": "fr", "Alemão": "de",
|
22 |
+
"Italiano": "it", "Português": "pt", "Polonês": "pl", "Turco": "tr",
|
23 |
+
"Russo": "ru", "Holandês": "nl", "Tcheco": "cs", "Árabe": "ar",
|
24 |
+
"Chinês (Simplificado)": "zh-cn", "Japonês": "ja", "Húngaro": "hu",
|
25 |
+
"Coreano": "ko", "Hindi": "hi"
|
26 |
+
}
|
27 |
+
target_lang = lang_map.get(language, "ru")
|
28 |
+
|
29 |
+
try:
|
30 |
+
tts = TTS(
|
31 |
+
model_name="tts_models/multilingual/multi-dataset/xtts_v2",
|
32 |
+
progress_bar=True,
|
33 |
+
gpu=False
|
34 |
+
)
|
35 |
+
except Exception as e:
|
36 |
+
print(f"Ошибка загрузки модели XTTS-v2: {e}")
|
37 |
+
return f"Ошибка: Не удалось загрузить модель TTS. Детали: {str(e)}"
|
38 |
+
|
39 |
+
output_audio = "cloned_audio.wav"
|
40 |
+
try:
|
41 |
+
tts.tts_to_file(
|
42 |
+
text=custom_text,
|
43 |
+
speaker_wav=audio_path,
|
44 |
+
language=target_lang,
|
45 |
+
file_path=output_audio
|
46 |
+
)
|
47 |
+
except Exception as e:
|
48 |
+
print(f"Ошибка синтеза речи: {e}")
|
49 |
+
return f"Ошибка: Не удалось синтезировать речь. Детали: {str(e)}"
|
50 |
+
|
51 |
+
# Проверка результата
|
52 |
+
if os.path.exists(output_audio):
|
53 |
+
return output_audio
|
54 |
+
else:
|
55 |
+
return "Ошибка: Выходной файл не создан."
|
56 |
+
except Exception as e:
|
57 |
+
print(f"Общая ошибка: {e}")
|
58 |
+
return str(e)
|
59 |
+
|
60 |
+
# Gradio интерфейс
|
61 |
+
audio = gr.Audio(label="Загрузите аудиофайл", type="filepath")
|
62 |
+
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")
|
63 |
+
custom_text_input = gr.Textbox(label="Введите текст для синтеза (обязательно)", placeholder="Например: Привет, это тестовое аудио!")
|
64 |
+
|
65 |
+
iface = gr.Interface(
|
66 |
+
fn=process_audio,
|
67 |
+
inputs=[audio, dropdown, custom_text_input],
|
68 |
+
outputs=gr.Audio(label="Синтезированное аудио"),
|
69 |
+
title="Синтез аудио с клонированием голоса",
|
70 |
+
description="Загрузите аудиофайл и введите текст для синтеза с клонированием голоса с использованием XTTS-v2."
|
71 |
+
)
|
72 |
+
|
73 |
+
with gr.Blocks() as demo:
|
74 |
+
iface.render()
|
75 |
+
gr.Markdown("""
|
76 |
+
**Примечания:**
|
77 |
+
- Загружайте аудиофайлы (.wav или .mp3) длительностью 3–10 секунд для лучшего качества.
|
78 |
+
- Обработка на CPU может занять 1–3 минуты.
|
79 |
+
- Используется Coqui TTS (XTTS-v2, поддерживает 17 языков, включая русский).
|
80 |
+
""")
|
81 |
+
|
82 |
+
demo.launch(debug=True)
|
requirements.txt
ADDED
@@ -0,0 +1,4 @@
|
|
|
|
|
|
|
|
|
|
|
1 |
+
coqui-tts==0.25.0
|
2 |
+
gradio>=4.44.1
|
3 |
+
numpy>=1.25.2,<2.0
|
4 |
+
torch>=2.0.0
|