Spaces:
Sleeping
Sleeping
File size: 6,674 Bytes
f9f2762 4396382 f9f2762 4396382 f9f2762 4396382 f9f2762 0dc0529 4396382 d4f7b0b 4396382 f9f2762 0dc0529 4396382 f9f2762 4396382 f9f2762 0dc0529 3e60f44 cea02fb 0dc0529 f9f2762 0dc0529 4396382 0dc0529 4396382 0dc0529 4396382 d4f7b0b 0dc0529 4396382 0dc0529 4396382 0dc0529 4396382 0dc0529 4396382 0dc0529 4396382 0dc0529 4396382 f9f2762 4396382 0dc0529 4396382 0dc0529 4396382 0dc0529 4396382 f9f2762 4396382 0dc0529 4396382 0dc0529 4396382 0dc0529 4396382 0dc0529 4396382 f9f2762 4396382 0dc0529 4396382 0dc0529 4396382 f9f2762 4396382 f9f2762 0dc0529 f9f2762 4396382 | 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 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 | 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()
|