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()