3-transformers / app.py
Ulyha's picture
Update app.py
cea02fb verified
import gradio as gr
from transformers import pipeline
import torch
# Проверка доступности GPU
device = 0 if torch.cuda.is_available() else -1
print("Loading models...")
# 1. Speech-to-Text (Whisper)
transcriber = pipeline(
"automatic-speech-recognition",
model="openai/whisper-small",
device=device
)
# 2. Summarization
summarizer = pipeline(
"summarization",
model="Falconsai/text_summarization",
device=device
)
# 3. Text Classification (Zero-shot для определения темы)
classifier = pipeline(
"zero-shot-classification",
model="facebook/bart-large-mnli",
device=device
)
print("Models loaded successfully!")
# Категории тем для классификации
CATEGORIES = [
"Complaint / Problem",
"Question / Information Request",
"Gratitude / Thanks",
"Order / Purchase",
"Technical Support",
"Delivery / Logistics",
"Finance / Payment",
"General Conversation",
"Weather / Climate Information",
]
def analyze_audio(audio_file):
"""
Анализирует аудио через три этапа:
1. Транскрипция (Speech-to-Text)
2. Краткая выжимка (Summarization)
3. Определение темы (Classification)
"""
if audio_file is None:
return "Please upload an audio file", "", ""
try:
# 1. Speech-to-Text
print("Transcribing audio...")
transcription_result = transcriber(audio_file)
transcription = transcription_result['text']
if not transcription or len(transcription.strip()) < 10:
return transcription, "Текст слишком короткий для суммаризации", "Не удалось определить тему"
# 2. Summarization
print("Summarizing text...")
# Ограничиваем длину текста для суммаризации
max_input_length = 1024
text_for_summary = transcription[:max_input_length] if len(transcription) > max_input_length else transcription
summary_result = summarizer(
text_for_summary,
max_length=100,
min_length=20,
do_sample=False
)
summary = summary_result[0]['summary_text']
# 3. Text Classification (используем оригинальную транскрипцию)
print("Classifying topic...")
classification_result = classifier(
transcription,
candidate_labels=CATEGORIES,
multi_label=False
)
# Форматируем результаты классификации
top_category = classification_result['labels'][0]
top_score = classification_result['scores'][0]
# Показываем топ-3 категории
category_text = f"**Основная тема:** {top_category} ({top_score:.1%})\n\n"
category_text += "**Другие возможные темы:**\n"
for label, score in zip(classification_result['labels'][1:3],
classification_result['scores'][1:3]):
category_text += f"- {label}: {score:.1%}\n"
return transcription, summary, category_text
except Exception as e:
error_msg = f"Error during analysis: {str(e)}"
print(error_msg)
return error_msg, "", ""
# Создание интерфейса Gradio
with gr.Blocks(title="Voice Message Analyzer", theme=gr.themes.Soft()) as demo:
gr.Markdown(
"""
# 🎙️ Voice Message Analyzer
Анализатор голосовых сообщений для менеджеров и службы поддержки.
**Возможности:**
1. **Транскрипция** - преобразование аудио в текст
2. **Краткая выжимка** - суть сообщения в паре предложений
3. **Определение темы** - автоматическая категоризация обращения
---
"""
)
with gr.Row():
with gr.Column(scale=1):
audio_input = gr.Audio(
type="filepath",
label="Загрузите аудио файл",
sources=["upload", "microphone"]
)
analyze_btn = gr.Button("🔍 Анализировать", variant="primary", size="lg")
gr.Markdown(
"""
### 💡 Совет:
- Используйте аудио на английском языке для лучших результатов
- Длительность: 10 секунд - 5 минут
- Форматы: WAV, MP3, M4A
"""
)
with gr.Column(scale=1):
transcription_output = gr.Textbox(
label="1️⃣ Транскрипция",
placeholder="Полный текст голосового сообщения появится здесь...",
lines=5
)
summary_output = gr.Textbox(
label="2️⃣ Краткая выжимка",
placeholder="Краткое содержание появится здесь...",
lines=3
)
category_output = gr.Markdown(
value="_Категория обращения появится здесь..._"
)
gr.Markdown(
"""
---
### 🤖 Используемые модели:
- **Speech-to-Text**: OpenAI Whisper-small (3.4M загрузок)
- **Summarization**: Falconsai/text_summarization
- **Classification**: Facebook BART-large-mnli (Zero-shot)
### 🎯 Применение:
- Обработка голосовых обращений клиентов
- Быстрый анализ голосовых сообщений
- Автоматическая категоризация запросов
- Создание конспектов встреч и звонков
"""
)
# Обработчик события
analyze_btn.click(
fn=analyze_audio,
inputs=audio_input,
outputs=[transcription_output, summary_output, category_output]
)
# Запуск приложения
if __name__ == "__main__":
demo.launch()