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