File size: 5,726 Bytes
66bb2ef
e69631b
 
 
 
 
66bb2ef
e69631b
 
 
779f9f6
e69631b
66bb2ef
779f9f6
66bb2ef
e69631b
779f9f6
66bb2ef
 
 
 
 
 
 
 
 
 
e69631b
66bb2ef
e69631b
66bb2ef
 
 
 
e69631b
66bb2ef
 
 
 
 
 
 
 
 
 
 
 
e69631b
 
66bb2ef
 
 
 
e69631b
66bb2ef
 
 
e69631b
66bb2ef
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
779f9f6
5467c51
66bb2ef
 
 
 
 
 
 
779f9f6
66bb2ef
 
779f9f6
66bb2ef
 
 
 
 
 
 
 
 
 
 
 
e69631b
66bb2ef
 
779f9f6
 
66bb2ef
779f9f6
 
 
66bb2ef
 
 
 
 
 
 
 
 
 
 
 
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
# -*- coding: utf-8 -*-
import torch
import gradio as gr
import yt_dlp as youtube_dl
from transformers import pipeline
from transformers.pipelines.audio_utils import ffmpeg_read
from huggingface_hub import login

import tempfile
import os
import time

# --- Конфигурация ---
HF_TOKEN = os.getenv("HF_ACCESS_TOKEN")
MODEL_NAME = "artyomboyko/whisper-small-ru-v4"
BATCH_SIZE = 8
# FILE_LIMIT_MB = 1000

# --- Инициализация ---
try:
    if HF_TOKEN:
        login(token=HF_TOKEN)
        print("Успешный вход в Hugging Face Hub.")
    else:
        print("HF_ACCESS_TOKEN не найден. Запуск в оффлайн-режиме или с публичными моделями.")
except Exception as e:
    print(f"Не удалось войти в Hugging Face Hub: {e}")

# Определение устройства для вычислений (GPU или CPU)
device = 0 if torch.cuda.is_available() else "cpu"
if device == 0:
    print("GPU доступен, вычисления будут производиться на GPU.")
else:
    print("GPU не доступен, вычисления будут производиться на CPU.")

# Загрузка модели распознавания речи
try:
    pipe = pipeline(
        task="automatic-speech-recognition",
        model=MODEL_NAME,
        chunk_length_s=30,
        device=device,
    )
    print(f"Модель {MODEL_NAME} успешно загружена.")
except Exception as e:
    print(f"Ошибка при загрузке модели {MODEL_NAME}: {e}")
    exit()


# --- Функции ---
def transcribe(filepath, task):
    """
    Транскрибирует аудиофайл с помощью загруженной модели Whisper.

    Args:
        filepath (str): Путь к аудиофайлу.
        task (str): Задача для модели ("transcribe" или "translate").

    Returns:
        str: Распознанный текст.
    """
    if filepath is None:
        # Используем gr.Warning вместо gr.Error для неблокирующего уведомления
        gr.Warning("Аудиофайл не предоставлен! Пожалуйста, загрузите или запишите аудио перед отправкой запроса.")
        return "Ошибка: Аудиофайл не предоставлен." # Возвращаем строку ошибки

    print(f"Начало транскрибации файла: {filepath}, Задача: {task}")
    try:
        result = pipe(filepath, batch_size=BATCH_SIZE, generate_kwargs={"task": task}, return_timestamps=True)
        text = result["text"]
        print("Транскрибация завершена успешно.")
        return text
    except Exception as e:
        print(f"Ошибка во время транскрибации: {e}")
        # Используем gr.Error для вывода серьезной ошибки
        raise gr.Error(f"Произошла ошибка при обработке аудио: {e}")


# --- Создание интерфейса Gradio ---
with gr.Blocks(theme=gr.themes.Default(primary_hue="blue", secondary_hue="neutral")) as demo:
    gr.Markdown(
        f"""
        # Whisper: Транскрибация аудио
        Транскрибируйте длинные аудиозаписи (с микрофона или из файла) одним нажатием кнопки!
        Демо использует модель OpenAI Whisper [{MODEL_NAME}](https://huggingface.co/{MODEL_NAME})
        через библиотеку 🤗 Transformers для распознавания речи.
        """
    )

    # Создание вкладок
    with gr.Tabs():
        
        # Вкладка 1: Транскрибация с микрофона
        with gr.TabItem("Микрофон"):
            with gr.Row():
                mic_input = gr.Audio(sources=["microphone"], type="filepath", label="Запись с микрофона")
                task_mic = gr.Radio(["transcribe", "translate"], label="Задача", value="transcribe")
            output_mic = gr.Textbox(label="Результат", lines=7) # Увеличили количество строк для текста
            mic_button = gr.Button("Транскрибировать с микрофона")

        # Вкладка 2: Транскрибация из файла
        with gr.TabItem("Аудиофайл"):
            with gr.Row():
                file_input = gr.Audio(sources=["upload"], type="filepath", label="Загрузить аудиофайл")
                task_file = gr.Radio(["transcribe", "translate"], label="Задача", value="transcribe")
            output_file = gr.Textbox(label="Результат", lines=7)
            file_button = gr.Button("Транскрибировать файл")


    # --- Привязка функций к кнопкам ---
    
    # Связываем кнопку "Транскрибировать с микрофона" с функцией transcrib
    mic_button.click(
        fn=transcribe,                     
        inputs=[mic_input, task_mic],      
        outputs=output_mic                 
    )

    # Связываем кнопку "Транскрибировать файл" с функцией transcribe
    file_button.click(
        fn=transcribe,
        inputs=[file_input, task_file],
        outputs=output_file
    )

# --- Запуск приложения ---
print("Запуск интерфейса Gradio...")
demo.queue().launch(debug=True, share=False)