Автоматическая транскрибация звонков: как это работает
Колл-центры тонут в записях: 500 часов ежедневно, ручной разбор одного звонка — 15 минут. Менеджеры тратят до 70% времени на прослушивание, а процент ошибок ручной расшифровки достигает 10–15%. Мы автоматизируем этот процесс — конвертируем аудио в структурированный текст с разметкой по ролям. Время обработки снижается до нескольких минут после окончания звонка.
Главная сложность — не в распознавании речи, а в подготовке аудио: узкая полоса 8 кГц, кодеки PCMA, шумы канала. Без предобработки точность STT падает ниже 60% WER. Мы научились выжимать максимум из Whisper large-v3, доводя WER до 8–10% на реальных записях — вдвое лучше облачных решений вроде Google Speech-to-Text. Средняя экономия бюджета на ручном разборе составляет 500 000 рублей в год при потоке 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%.
Детали настройки VAD
VAD-фильтр (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 показывает лучший баланс точности и скорости для русского языка.
Как мы внедряем транскрибацию: пошагово
- Аудит телефонии: собираем образцы записей, определяем кодек и частоту дискретизации.
- Развёртывание STT: устанавливаем Whisper large-v3 на GPU с поддержкой INT8 квантизации для снижения latency.
- Настройка диаризации: калибруем PyAnnote под количество спикеров и тип взаимодействия.
- Интеграция с CRM: пишем REST API, который принимает аудио и возвращает JSON с разметкой.
- Пилотное тестирование: прогоняем 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 звонках.







