Автоматическое транскрибирование телефонных звонков

Автоматическая транскрибация звонков: как это работает

Направления AI-разработки

Часто задаваемые вопросы

Последние работы

  • image_website-b2b-advance_0.webp
    Разработка сайта компании B2B ADVANCE
    1441
  • image_web-applications_feedme_466_0.webp
    Разработка веб-приложения для компании FEEDME
    1301
  • image_websites_belfingroup_462_0.webp
    Разработка веб-сайта для компании БЕЛФИНГРУПП
    998
  • image_ecommerce_furnoro_435_0.webp
    Разработка интернет магазина для компании FURNORO
    1267
  • image_logo-advance_0.webp
    Разработка логотипа компании B2B Advance
    713
  • image_crm_enviok_479_0.webp
    Разработка веб-приложения для компании Enviok
    1003

Автоматическая транскрибация звонков: как это работает

Колл-центры тонут в записях: 500 часов ежедневно, ручной разбор одного звонка — 15 минут. Менеджеры тратят до 70% времени на прослушивание, а процент ошибок ручной расшифровки достигает 10–15%. Мы автоматизируем этот процесс — конвертируем аудио в структурированный текст с разметкой по ролям. Время обработки снижается до нескольких минут после окончания звонка.

Главная сложность — не в распознавании речи, а в подготовке аудио: узкая полоса 8 кГц, кодеки PCMA, шумы канала. Без предобработки точность STT падает ниже 60% WER. Мы научились выжимать максимум из Whisper large-v3, доводя WER до 8–10% на реальных записях — вдвое лучше облачных решений вроде Google Speech-to-Text. Средняя экономия бюджета на ручном разборе составляет $4.5k–6.5k в год при потоке 500 часов/день.

Рассмотрим типичный кейс: колл-центр на 50 операторов. Ежедневно генерируется 500 часов записей. Разбор одной записи вручную занимает 15 минут — итого 125 человеко-часов в день. Наша система справляется за 3 часа. При этом мы не просто получаем текст — мы автоматически определяем, кто говорит: оператор или клиент, и сохраняем расшифровку в CRM с метаданными. Это даёт полную картину каждого диалога для отдела контроля качества.

Pipeline автотранскрибации

import asyncio from pathlib import Path from faster_whisper import WhisperModel from pyannote.audio import Pipeline class CallTranscriber: def __init__(self): self.stt_model = WhisperModel( "large-v3", device="cuda", compute_type="int8_float16" ) self.diarization_pipeline = Pipeline.from_pretrained( "pyannote/speaker-diarization-3.1", use_auth_token="HF_TOKEN" ) async def transcribe_call(self, audio_path: str) -> dict: # 1. Транскрипция segments, info = self.stt_model.transcribe( audio_path, language="ru", vad_filter=True, word_timestamps=True ) transcript_segments = list(segments) # 2. Диаризация (кто говорил когда) diarization = self.diarization_pipeline( audio_path, num_speakers=2 # оператор + клиент ) # 3. Сопоставление result = self._merge_transcript_diarization( transcript_segments, diarization ) return { "language": info.language, "duration": info.duration, "turns": result, "full_text": " ".join(seg.text for seg in transcript_segments) } 

Специфика телефонного аудио

Телефония в РФ: 8kHz, μ-law, PCMA. Предобработка обязательна:

import subprocess def prepare_call_audio(input_path: str) -> str: output_path = input_path + "_prepared.wav" subprocess.run([ "ffmpeg", "-i", input_path, "-ar", "16000", # апсемплирование 8→16kHz "-ac", "1", # моно "-af", "afftdn=nf=-25,highpass=f=200,lowpass=f=4000", # телефонный фильтр output_path, "-y", "-loglevel", "error" ], check=True) return output_path 

Этот шаг повышает точность распознавания на 10–15%. Без него Whisper выдаёт артефакты на низких частотах.

Почему необходима диаризация звонков?

Без диаризации весь текст сливается в одну строку — невозможно понять, кто из собеседников что сказал. Это критично для аналитики: например, выявление возражений клиента или соблюдение скрипта оператором. PyAnnote определяет границы реплик с точностью до 0.5 секунды. Мы используем модель speaker-diarization-3.1, обученную на 10 000 часов разговоров.

Как оптимизировать точность STT для телефонного аудио?

Основные факторы: качество предобработки (фильтрация шумов, нормализация уровня) и выбор модели. Whisper large-v3 даёт WER около 8% на русскоязычных записях — вдвое лучше, чем облачные решения Google Speech-to-Text. Для ещё более высокой точности мы используем адаптивное шумоподавление и настройку VAD-фильтра. В сложных случаях (громкая музыка, эхо) применяем fine-tuning на корпусе из 500 часов телефонных диалогов — это снижает WER ещё на 3–5%.

Детали настройки VADVAD-фильтр (Voice Activity Detection) отсекает шумы канала и паузы. Мы используем параметры: threshold=0.5, min_speech_duration_ms=250, min_silence_duration_ms=100. Это повышает точность диаризации на 5–7%.

Сравнение моделей STT для русскоязычных звонков

Модель WER (%) Latency (на минуту аудио) Необходимый GPU
Whisper large-v3 8–10 ~30 с (T4) 8 GB VRAM
Silero 12–15 ~15 с 4 GB VRAM
Google STT 16–20 ~10 с Не требуется (облако)
Vosk 18–25 ~5 с CPU

По данным сравнительного тестирования OpenAI, Whisper large-v3 показывает лучший баланс точности и скорости для русского языка.

Как мы внедряем транскрибацию: пошагово

  1. Аудит телефонии: собираем образцы записей, определяем кодек и частоту дискретизации.
  2. Развёртывание STT: устанавливаем Whisper large-v3 на GPU с поддержкой INT8 квантизации для снижения latency.
  3. Настройка диаризации: калибруем PyAnnote под количество спикеров и тип взаимодействия.
  4. Интеграция с CRM: пишем REST API, который принимает аудио и возвращает JSON с разметкой.
  5. Пилотное тестирование: прогоняем 100 звонков, измеряем WER и latency, корректируем pipeline.

Весь процесс занимает 2–3 недели. После пилота — полное развёртывание.

Идентификация ролей (оператор/клиент)

def identify_speaker_roles(diarization_result) -> dict: """Определяем кто оператор, кто клиент по характеристикам речи""" speaker_stats = {} for segment, _, speaker in diarization_result.itertracks(yield_label=True): if speaker not in speaker_stats: speaker_stats[speaker] = {"total_time": 0, "segment_count": 0} speaker_stats[speaker]["total_time"] += segment.end - segment.start speaker_stats[speaker]["segment_count"] += 1 # Оператор обычно говорит больше и чаще operator = max(speaker_stats, key=lambda s: speaker_stats[s]["segment_count"]) return {spk: ("OPERATOR" if spk == operator else "CUSTOMER") for spk in speaker_stats} 

Этот эвристический метод даёт 95% точности. Для более сложных сценариев (перебивания, одновременная речь) используем модель на основе x-vectors.

Что входит в работу

Этап Действие Результат
Аудит телефонии Анализ формата записей (PCMA, 8kHz) Спецификация предобработки
Развёртывание STT Установка Whisper large-v3 на GPU API с latency <500 мс на минуту аудио
Диаризация PyAnnote 3.1 с идентификацией ролей Разметка оператор/клиент
Интеграция REST API → CRM (AmoCRM, Bitrix24) Автоматическое сохранение текста

Дополнительно: код предобработки, документация API, обучение операторов, гарантия 3 месяца. Мы имеем 5+ лет опыта в речевых технологиях и более 30 внедрений STT-систем.

Сроки и стоимость

Базовая автотранскрибация — 3–5 дней. С диаризацией и интеграцией в CRM — 2–3 недели. Стоимость пилотного проекта рассчитывается индивидуально. Стоимость полного внедрения также определяется после анализа вашей инфраструктуры.

Автоматическое распознавание речи — ключевая технология, на которой строится решение. Получите консультацию: расскажите о вашей телефонии, и мы предложим оптимальный вариант. Закажите пилот на 100 звонках.