Spaces:
Running
Running
# -*- 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) |