File size: 5,466 Bytes
56064c3
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import os
import gradio as gr
import json
from wrapper import GeminiTTSWrapper
from dotenv import load_dotenv

load_dotenv()
# Константы
# CONFIG_DIR = "config"
# CONFIG_FILE = f"{CONFIG_DIR}/config.json"
DEFAULT_OUTPUT_FILE = None  # Позволяет обертке генерировать имя файла с временной меткой

# os.makedirs(CONFIG_DIR, exist_ok=True)

# Загрузка сохраненного API ключа, если существует
def load_config():
    api_key = os.getenv("GOOGLE_API_KEY", "")
    return {"api_key": api_key}

# Сохранение API ключа
# def save_config(api_key):
#     with open(CONFIG_FILE, 'w') as f:
#         json.dump({"api_key": api_key}, f)

# Инициализация с сохраненной конфигурацией
config = load_config()
tts_wrapper = GeminiTTSWrapper(config.get("api_key", ""))

def update_api_key(api_key):
    """Обновление API ключа и сохранение его в файл конфигурации."""
    # save_config(api_key)
    tts_wrapper.set_api_key(api_key)
    return "API ключ обновлен и сохранен"

def generate_speech(api_key, model, voice, instructions, text, mp3_format):
    """Генерация речи с помощью обертки."""
    if not api_key:
        return None, "Требуется API ключ"
    
    if not text:
        return None, "Требуется текст"
    
    try:
        # Обновление API ключа, если он изменился
        if api_key != tts_wrapper.api_key:
            tts_wrapper.set_api_key(api_key)
            # save_config(api_key)
        
        # Генерация речи
        output_path = tts_wrapper.generate_speech(
            text=text,
            model=model,
            voice=voice,
            instructions=instructions,
            output_file=DEFAULT_OUTPUT_FILE,
            convert_to_mp3=mp3_format
        )
        
        return output_path, f"Сгенерированная речь сохранена в {output_path}"
    except Exception as e:
        return None, f"Ошибка: {str(e)}"

# Получение списка доступных голосов
available_voices = tts_wrapper.list_available_voices()

# Создание интерфейса Gradio
with gr.Blocks(title="Google Gemini TTS") as app:
    # Ввод API ключа
    print(os.getenv("GOOGLE_API_KEY", ""))
    api_key_input = gr.Textbox(
                label="API ключ Gemini", 
                value=os.getenv("GOOGLE_API_KEY", ""),
                type="password"
            )
    gr.Markdown("# Преобразование текста в речь Google Gemini")
    with gr.Row():
        with gr.Column(scale=1):      
                        
            # Ввод инструкций
            instructions_input = gr.TextArea(
                label="Инструкции для голоса (необязательно)",
                placeholder="например, 'Говорить спокойно и медленно', 'Говорить взволнованным тоном'"
            )
            
            # Флажок MP3 формата
            mp3_checkbox = gr.Checkbox(
                label="Конвертировать в MP3 формат",
                value=True,
                visible=False
            )

            text_input = gr.Textbox(
                label="Текст для преобразования в речь",
                placeholder="Введите ваш текст здесь...",
                lines=15
            )


            # Выбор голоса
            voice_dropdown = gr.Dropdown(
                label="Голос",
                choices=available_voices,
                value="Laomedeia"
            )
            
            # Выбор модели
            model_dropdown = gr.Dropdown(
                label="Модель",
                choices=[
                    "gemini-2.5-pro-preview-tts",
                    "gemini-2.5-flash-preview-tts"
                ],
                value="gemini-2.5-flash-preview-tts"
            )
                
        with gr.Column(scale=1):
            # Вывод сгенерированного аудио
            audio_output = gr.Audio(label="Сгенерированная речь")
            generation_status = gr.Textbox(label="Статус генерации", interactive=False)
            
            # Кнопка генерации
            generate_btn = gr.Button("Сгенерировать речь", variant="primary")
    
    # Настройка обработчиков событий
    api_key_input.change(
        update_api_key,
        inputs=[api_key_input],
        outputs=[generation_status]
    )
    
    generate_btn.click(
        generate_speech,
        inputs=[
            api_key_input,
            model_dropdown,
            voice_dropdown,
            instructions_input,
            text_input,
            mp3_checkbox
        ],
        outputs=[
            audio_output,
            generation_status
        ]
    )

if __name__ == "__main__":
    app.queue()
    app.launch(server_name="0.0.0.0", server_port=7567)