Что это решает
Час записи созвона стоит часа чужого внимания, и поэтому архив звонков никто не слушает. Whisper переводит записи встреч, звонков и голосовых сообщений в текст с таймкодами, включая русский, без ручной расшифровки и без отправки каждой минуты на биржу фрилансеров. Текст дальше ищется, режется на цитаты, превращается в резюме и задачи. Отдельная выгода достаётся архиву: записи, которые лежали годами и не читались, за ночь становятся поисковым индексом.
Как устроено
Модель
Аудио приводится к 16 кГц и одному каналу, режется на окна фиксированной длины по тридцать секунд, каждое окно превращается в лог-мел-спектрограмму — картинку из частот и времени. Энкодер сжимает её в последовательность внутренних представлений, декодер авторегрессивно выдаёт токены текста, слово за словом.
Кроме слов декодер предсказывает служебные токены: какой язык звучит, какая задача решается (расшифровка на языке оригинала или перевод), нужны ли метки времени. Из этой конструкции растут два свойства. Язык определяется автоматически по первым секундам, и на музыкальной заставке в начале записи определяется неверно. Перевод модель умеет только в английский, обратное направление она не делает.
Авторегрессивный декодер объясняет и главный дефект: когда во входном окне ничего осмысленного нет, модель всё равно продолжает генерировать текст. Так появляются вежливые фразы и обрывки титров, которых в записи не было.
Размеры и реализации
Линейка идёт от tiny до large: чем крупнее, тем точнее и медленнее, и тем больше нужно памяти. Реализаций несколько, и выбор между ними влияет на стоимость эксплуатации сильнее, чем выбор размера:
- оригинальная реализация на PyTorch — эталон поведения, самая прожорливая;
- faster-whisper на движке CTranslate2 — заметно экономнее по памяти и быстрее при тех же весах;
- whisper.cpp — работает на процессоре и на Apple Silicon, удобна для ноутбука и для сервера без видеокарты;
- облачный эндпоинт — разворачивать нечего, но файл уезжает наружу, у запроса есть предел на размер, и длинные записи всё равно приходится резать.
Рабочий контур
Шаги, из которых собирается обработка, одинаковы почти в любом продукте:
- Приём файла и нормализация:
ffmpeg -i call.m4a -ac 1 -ar 16000 -c:a pcm_s16le call.wav. Один канал, 16 кГц, без экзотических кодеков. - Детектор речи (VAD) вырезает тишину и делит запись на реплики. Этот шаг убирает большую часть выдуманного текста ещё до модели.
- Очередь заданий. Распознавание длится минуты, синхронный HTTP-запрос столько не живёт.
- Распознавание чанками с перекрытием и сборка транскрипта с таймкодами.
- Постобработка: замена терминов по словарю, приведение названий и артикулов к принятому написанию.
- Сохранение в базу и поисковый индекс, ссылка на позицию в аудио.
- Языковая модель поверх текста: резюме, решения, задачи, темы обращения.
Что подкручивают
- Подсказка в начале (
initial_prompt): список терминов, названий продуктов, фамилий, которые встретятся. Самый дешёвый способ поднять качество на доменной лексике. - Явное указание языка, когда язык известен заранее. Снимает риск ошибочной автодетекции.
- Откат по температуре: при плохих признаках сегмента (низкая уверенность, подозрительная сжимаемость текста) декодирование повторяется с другими параметрами.
- Пословные метки времени и принудительное выравнивание отдельным инструментом — нужны для субтитров и перехода к точной секунде в записи.
- Диаризация, то есть разметка «кто говорит», делается отдельной моделью. Whisper этого не умеет вообще.
Форматы вывода
Простой текст годится для поиска и для передачи в языковую модель. Форматы субтитров (srt, vtt) нужны видеоредактору и плееру. Подробный json — то, на чём строится вся автоматическая проверка качества: там лежат сегменты с началом, концом, текстом и служебными признаками — средняя уверенность модели по сегменту, оценка вероятности того, что речи в нём нет вовсе, и коэффициент сжимаемости текста. Последние три поля используются как фильтр: сегмент с высокой вероятностью тишины и низкой уверенностью выбрасывается до того, как выдуманная фраза попадёт в отчёт клиенту.
Хранить разумно всё сразу: полный json как источник истины, текст в поисковом индексе, субтитры генерировать по требованию. Повторное распознавание архива стоит машинного времени, и делать его из-за смены формата обидно.
Полезные сценарии
- Расшифровка звонков с клиентами и автоматическое резюме с решениями и задачами, чтобы менеджер не писал отчёт руками.
- Поиск по архиву переговоров: текст в индексе, результат — ссылка на таймкод в записи.
- Субтитры к роликам в форматах srt и vtt, где руками правится только терминология.
- Голосовые заметки на ходу, которые превращаются в структурированные задачи в трекере.
- Выборочный контроль поддержки: темы, обещания и жалобы ищутся по тексту вместо сплошного прослушивания.
Ограничения
- На тишине, шуме и музыке модель дописывает несуществующие фразы. Типичный вид — повторяющиеся вежливые формулы и фрагменты титров. Лечится детектором речи и отбраковкой сегментов по уверенности.
- Наложение речи, несколько участников и перебивания без диаризации дают сплошной текст без указания говорящих, по которому непонятно, кто что обещал.
- Редкие фамилии, названия, артикулы и аббревиатуры распознаются с систематическими ошибками. Словарь подсказок и постобработка заменами обязательны.
- Метки времени у сегментов приблизительны; пословная точность требует отдельного шага выравнивания.
- Реального времени из коробки нет: модель батчевая, потоковая расшифровка собирается обвязкой из детектора речи и коротких окон, с задержкой и с ошибками на стыках.
- Крупная модель требует видеопамяти. На процессоре она работает медленнее реального времени, и очередь надо планировать по фактическому замеру, а не по надежде.
- Запись разговора — персональные данные. Согласие на запись, срок хранения и доступ к транскриптам регулируются так же строго, как доступ к самому аудио.
- Смешанная речь на двух языках в одной фразе распознаётся хуже, чем каждый язык по отдельности.
Как проверить результат
- Взять 10–20 минут своих типичных записей, расшифровать эталон вручную и посчитать WER: сумма замен, вставок и пропусков, делённая на число слов эталона. Это единственное число, по которому сравниваются модели и настройки между собой.
- Отдельно прогнать фрагмент тишины и фрагмент с музыкой. В выводе не должно появиться ни одного предложения.
- Поискать в транскрипте одну и ту же строку, повторённую подряд несколько раз: признак зацикливания декодера.
- Сверить последний таймкод с длительностью файла. Расхождение означает потерянный хвост записи.
- Проверить стыки чанков: слово на границе не должно пропадать или дублироваться.
- Замерить RTF — время обработки, делённое на длительность аудио, — на целевом железе. Из этого числа считается пропускная способность очереди и нужное количество воркеров.
- Прогнать список доменных терминов до и после подсказки и посчитать, сколько распозналось правильно в каждом случае.
Правило: качество распознавания измеряется WER на собственных записях и поведением на тишине; размер модели и обещания карточки к делу не относятся.
