Бесплатная расшифровка без облака: черновик субтитров сразу во встречу, чистовик после встречи в хорошем качестве

Это продолжение моей статьи «Число vCPU ничего не говорит: как я считал, нужен ли свой ASR-сервер вместо Deepgram». Читать первую часть не обязательно, всё нужное я коротко перескажу.

Вечером в день публикации первой статьи в комментарии пришёл @pahaz. Оказалось, что в тот же день у него вышла статья «Транскрибация аудио в текст бесплатно и без облаков: почему мне не хватило одной модели», и он посоветовал добавить в сравнение Parakeet: сам он пришёл к каскаду GigaAM + Parakeet. Я прочитал его статью и это подтолкнуло меня на идею попробовать каскад и для онлайн транскрибации: T-one во время встречи делает быстро текст черновик разговора (с задержкой менее 2с превращает аудио в текст), а после встречи GigaAM вычитывает его, исправляет ошибки и делает чистовик.
Я загорелся идеей и уже через три дня у меня были готовы цифры замеров на своем тестовом стенде. Сама схема сработала, но два места меня удивили, и о них эта статья больше, чем о моделях:
эталон, по которому я считал качество, ошибался в каждом четвёртом спорном месте и подыгрывал моделям, из которых был собран;
каскад «вторая модель правит термины», который у @pahaz давал минус 5 п.п. WER, на моих созвонах в лучшем случае ничего не дал, а в худшем добавил 7 п.п.
Коротко о первой части
В первой части я выбирал движок для живых субтитров и формировании текста из аудио в онлайн, в созвоне 121 (один на один) преимущественно на русском языке. Главной причиной экспериментов для меня был вопрос - можно ли уйти с облачного Deepgram на свой сервер без видеокарты. Главный вывод был в первой статье был про железо: Xeon 2013 года без AVX2 держит в 6–8 раз меньше живых дорожек, чем современный процессор с похожим числом vCPU. Моя машина B (6 vCPU Xeon E5-2680 v2, 11 ГБ RAM) держит две встречи одновременно: T-one отдаёт фразу через 1,08 с (p50) и 1,2 с (p95) после паузы.
Там же остался хвост, с которого начинается эта статья. T-one не ставит пунктуацию и по словам уступает и облаку, и GigaAM, а GigaAM работает только по готовой записи. Последняя фраза выводов звучала так: «для чистового текста после встречи нужна другая модель». Эту модель я и ставлю в свой каскад транскрибаций и подготовки чистовика текста по встрече.
Что изменилось с первой части
Задача осталась той же: звонок в браузере, дорожки участников приходят на сервер раздельно, поэтому диаризация не нужна. Требования из первой части я тоже оставил:
фраза в субтитрах не позже 2 с (p95);
предсказуемая цена часа;
аудио не покидает сервер в России.
Добавилось одно требование: после встречи нужен итоговый текст с пунктуацией, который не стыдно отправить, по качеству не хуже облака. Я продолжаю гореть идеей сделать сервис для встреч один на один с расшифровкой в моменте и качественным доком по итогу, и в итоговом тексте важнее всего суммы, сроки и имена.
Методику я тоже поменял. Слабые места первой части я сам перечислял в оговорках, это прежде всего эталон, которым там служил Deepgram и как я посчитал у меня было мало живых рабочих созвонов для теста - в этот раз я их добавил и вычитал до эталона:
Первая часть | Эта часть | |
Данные | 51 с колл-центра из пакета T-one и 29 мин коучинговой сессии | 4 записи рабочих созвонов, 2 ч 21 мин, 14 970 слов |
Эталон | согласие движков на образце, текст Deepgram nova-3 на сессии | согласованный текст трёх систем с ручной правкой терминов, плюс выборочное прослушивание |
Движки | T-one, GigaAM-v3, Vosk, Deepgram nova-2 и nova-3 | T-one (greedy и KenLM), GigaAM-v3 e2e, Parakeet TDT 0.6B v3, Deepgram nova-3 |
Метрики | WER | WER, WERx, ошибки в числах, точность терминов, и пунктуации |
Вопрос | что тянет CPU в реальном времени | как поделить работу между двумя моделями и сколько это стоит |
Почему одной модели мало
У меня две модели, и каждая хороша в своём.
T-one потоковая. Фраза приходит примерно через секунду после паузы, но без пунктуации, а на живой рабочей речи с WER около 22%, то есть ошибка примерно в каждом пятом слове.
GigaAM-v3 e2e среди того, что я пробовал, лучшая по качеству и сама ставит пунктуацию. Но она пакетная: ей нужен весь кусок звука сразу.
В первой части я сравнивал их как альтернативы. У @pahaz две модели работают вместе, но обе в пакетном режиме. Здесь у моделей разные роли и разное время работы: T-one пишет черновик во время звонка, GigaAM после звонка делает чистовик.
Как это устроено

Три решения, к которым я пришёл по ходу замеров (подробности ниже):
Черновик и чистовик лежат в одной карточке встречи, и пользователь видит, что текст «уточнился». Чистовик меняет от 17 до 26% текста, такое трудно не заметить, и интерфейс должен это объяснять.
Чистовик стоит в очереди с низким приоритетом. Живые субтитры важнее.
Словарь терминов у каждого пользователя свой. И я допускаю, что тут можно пополнять спорными словами свой словарь через специальный интерфейс.
Стенд и методика
Железо. Та же машина B: 6 vCPU Xeon E5-2680 v2 (2013 год, только AVX, без AVX2 и FMA), 11 ГБ RAM. В день замера соседи по хосту забирали 5–20% процессора (steal), и пакетные проходы шли на 30–40% медленнее, чем 18.10 на той же машине.
Данные. Четыре записи моих рабочих созвонов:
Запись | Длительность |
разговор один на один | 25 мин |
разговор один на один | 34 мин |
обсуждение процесса с командой | 59 мин |
дейли на 15+ человек | 23 мин |
всего | 2 ч 21 мин, 14 970 слов |
Дорожек две: мой микрофон и системный звук. Качество я считал по смешанной дорожке. Эталон размечен репликами примерно по 20 секунд, и если голоса пересекаются, честно развести такую реплику по дорожкам нельзя: текст уезжает не туда.
Метрики.
WER после нормализации: числа приводятся к одному виду, «ё» заменяется на «е», порядковые числительные тоже нормализуются.
WERx, то есть WER по звучанию: латиница переводится в кириллицу так, как слышится, например Cloud-MD = «клауд эм ди». Без этого модель, которая написала термин кириллицей, получает ошибку за правильно услышанное слово.
Ошибки в числах, точность терминов, пунктуации против эталона.
Эталон: главная оговорка этой статьи
Эталона, вычитанного человеком, на 2 ч 21 мин у меня нет. Этот эталон собран как согласованный текст трёх систем: GigaAM-v3 e2e с каскадом Parakeet, Whisper large-v3-turbo и Whisper large-v3. Термины я поправил руками.
У такого эталона есть очевидная проблема: GigaAM входит в число его источников. Значит, её WER будет занижен, а отрыв от Deepgram завышен.
Сколько стоит эта проблема в цифрах, я проверил прослушиванием. Взял запись с самым надёжным эталоном (один на один, 25 мин, в источниках все три модели). В ней 517 мест, где хотя бы один движок разошёлся с эталоном. Из них я переслушал случайные 40, а заодно 29 мест, которые составитель эталона сам пометил как спорные.
Результат:
эталон ошибся в 10 местах из 40, то есть в 25% (95% ДИ 14–40%);
на всю запись это примерно 129 ошибок (73–208), собственный WER эталона около 4,5% (2,6–7,3%);
в 14 из 29 спорных мест первый вариант составителя оказался верным. Правка эталона по этим местам сдвинула WER всех движков всего на 0,1–0,2 п.п.
Дальше я пересчитал WER каждого движка. Если в каком-то месте прав был движок, а не эталон, ошибку движку засчитали зря, и её надо вычесть. Если движок повторил ошибку эталона, ошибку ему не засчитали, и её надо добавить.
Движок | WER против эталона, % | Поправка, п.п. | После поправки, % |
Deepgram nova-3 | 15,9 | −1,4 | 14,5 |
GigaAM-v3 e2e | 13,5 | +1,4 | 14,9 |
T-one + KenLM | 21,7 | +0,5 | 22,2 |
Parakeet v3 | 21,1 | +2,7 | 23,8 |
Вышло ровно то, что следовало из состава эталона. Модели-источники (GigaAM и Parakeet) получили поправку вверх, Deepgram вниз. После поправки GigaAM и Deepgram на этой записи равны в пределах погрешности: каждая поправка посчитана по 2–6 местам, и погрешность у неё ±1,5 п.п. и больше. Отрыв T-one от обоих, около 7–8 п.п., остался на месте.
Остальные три записи собраны из двух моделей, а не из трёх, и перекос в пользу GigaAM там, скорее всего, не меньше. Поэтому дальше я держусь простого правила: сводная таблица по четырём записям считается «против согласованного эталона», а выводы о GigaAM против облака я делаю только по переслушанной записи.

Результаты
Качество: сводная таблица
Смешанная дорожка, 4 записи, 14 970 слов, эталон согласованный (с оговоркой выше). В колонке «по записям» порядок такой: 1-на-1 25 мин / 1-на-1 34 мин / обсуждение 59 мин / дейли 23 мин.
Движок | Роль | WER, % | По записям | Ошибок в числах (из 262) | точки / запятые |
GigaAM-v3 e2e fp32, 16 кГц | чистовик | 11,0 | 13,4 / 9,0 / 9,6 / 16,2 | 17 | 87 / 90 |
то же + словарь из одного термина | чистовик | 10,9 | — / — / 9,2 / — | 17 | 87 / 90 |
Deepgram nova-3 (облако) | контроль | 16,0 | 15,7 / 13,9 / 15,4 / 22,4 | 32 | 79 / 81 |
T-one + KenLM | черновик | 21,8 | 21,7 / 19,4 / 21,7 / 27,4 | 34 | — |
T-one greedy | черновик | 23,3 | 24,1 / 20,0 / 23,2 / 29,6 | 37 | — |
Parakeet TDT 0.6B v3 int8 | вторая модель каскада | 22,8 | 21,1 / 21,1 / 22,5 / 30,0 | 38 | 71 / 76 |
Что я из неё вынес:
Отрыв GigaAM от Deepgram здесь получился из-за эталона. На переслушанной записи они равны (14,9 против 14,5). Правильная формулировка такая: чистовик на своём сервере догоняет облако. Обгоняет ли он его, эта таблица не доказывает.
Числа. Чистовик ошибается в них вдвое реже черновика и облака: 17 ошибок против 32–34 из 262. Для итогов встречи, где важны суммы и сроки, это для меня самая важная строка таблицы.
Дейли хуже всех записей у всех движков, на 6–7 п.п.: 15+ человек, перебивания, плохие микрофоны.
KenLM к T-one стабильно даёт минус 1,5 п.п. На коучинговой записи из первой части было минус 0,9–1,7.
Рабочая речь тяжелее коучинговой. На записи из первой части (эталоном там был Deepgram) WER T-one был 10,6–11,2%. Здесь, с терминами и групповыми созвонами, 21,8%.
Что увидит пользователь, когда черновик заменится чистовиком
Мне было важно понять, сколько текста поменяется у человека на глазах и не станет ли от этого хуже.
Запись | Исправлено | Испорчено | Меняется текста |
1-на-1, 25 мин | 11,1% | 1,8% | 18,4% |
1-на-1, 34 мин | 11,1% | 1,1% | 16,6% |
обсуждение, 59 мин | 12,4% | 1,3% | 20,6% |
дейли, 23 мин | 13,4% | 2,6% | 25,9% |
всего | 11,9% | 1,5% | 17–26% |
«Испорчено» — это слова, в которых черновик был прав, а чистовик ошибся. На каждую такую порчу приходится почти восемь исправлений. Поэтому я заменяю черновик целиком и не пытаюсь склеить из двух текстов лучшие куски.
Для сравнения: на коучинговой записи 16.10 чистовик исправил 6,6% слов, испортил 1,6% и поменял 11,8% текста. Чем тяжелее речь, тем больше чистовик переписывает.
Отсюда же требование к интерфейсу. Если без предупреждения поменять пятую часть текста, это выглядит как сбой. Резко поменять такую часть текста может быть не понятно пользователю в моменте - поэтому тут как решение - подсветить места в документе что на что изменилось.
Каскад «вторая модель правит латиницу»: отрицательный результат

GigaAM плохо пишет англицизмы и термины, поэтому тот же звук распознаётся ещё и Parakeet, а из Parakeet берётся только слово на латинице, если по звучанию оно похоже на фрагмент GigaAM (порог похожести 0,4). На смешанной русско-английской речи это дало минус 5 п.п. WER.
На моих четырёх записях вышло так:
Вариант | Замен по записям | WER, % |
только GigaAM | — | 11,0 |
каскад, только латиница | 4 / 1 / 46 / 12 | 11,1 |
каскад без требования латиницы | — | 18,3 |
С латиницей каскад ничего не дал. Без требования латиницы он заметно вредит.
Почему так, показывает одно слово. У меня в аудио было обсуждение процесса работы с «OpenSpec» и слово «OpenSpec» звучит 38 раз. GigaAM 26 раз пишет его кириллицей, «опенспек», и на слух это верно. Parakeet 18 раз пишет «OpenSpeak», и каскад честно переносит эту ошибку в чистовик: в итоге 17 раз «OpenSpeak» и ни одного «OpenSpec». Deepgram угадал написание 2 раза. Вторая модель знает термины пользователя ровно так же плохо, как и первая.
Сработала вещь куда проще: личный словарь поверх чистовика, без второй модели. Термин переводится в кириллический ключ по звучанию («OpenSpec» → «опенспек»). Слово чистовика с тем же ключом и падежным хвостом до трёх букв заменяется на термин. Словарь из одного слова дал 27 правильных «OpenSpec» из 38 вместо нуля, а WER этой записи снизился с 9,6 до 9,2. Вторую модель держать не нужно, так что по ресурсам это ничего не стоит.
Есть и минус: при замене теряется окончание, и получается «в OpenSpec» вместо «в опенспеке». Для поиска по расшифровке это удобно, а читать такое странновато.
Возможно, дело в характере речи: если в замере была смешанная русско-английская речь, а у меня рабочие созвоны на русском с отдельными терминами на английском. Там, где английского много, каскад вполне может работать.
Скорость: что помещается на одной машине
Что | Скорость на машине B | Память |
T-one + KenLM, офлайн | RTF 0,33 | 5,5 ГБ |
GigaAM-v3 e2e fp32, 16 кГц | 21 мин на час записи | 1,6 ГБ |
Parakeet v3 int8 | 39 мин на час | 1,3 ГБ |
Живые субтитры (из первой части) | 2 встречи на машину, фраза p50 1,08 / p95 1,2 с | 0,5 ГБ |
Отдельный сюрприз: Parakeet на русском на этом процессоре почти вдвое медленнее GigaAM (39 минут на час записи против 21), на ноутбучном i9 наоборот. Поколение процессора снова решает, как и в первой части.
Главный вопрос раздела: можно ли гонять чистовик на той же машине, где идут живые звонки, и не испортить субтитры? Я запускал 2 живые встречи (4 потока T-one через сервис) и параллельно чистовик GigaAM int8 на nice 19, по 10 минут на сценарий, два раза в разные дни.
Сценарий | Тик T-one p95, 18.10 (steal ~1%) | Тик p95, 20.10 (steal 15–33%) | Отставание фразы p50 / p95 | Чистовик |
только субтитры | 202 мс | 399 мс | 1,08 / 1,20 с | — |
+ чистовик на все ядра | 258 мс | 320 мс | 1,08 / 1,20 с | 40 мин на час (18.10) |
+ чистовик на 2 потока | 363 мс | 507 мс | 1,08–1,11 / 1,20 с | 31–38 мин на час |
Что я вижу в этой таблице:
Отставание фразы не изменилось ни в одном сценарии и ни в один из дней. Фраза приходит по паузе, и запаса до 2 секунд хватает даже при тике 500 мс.
Тик p95 на общем хосте шумный. В период тестирования соседи по серверу забирали до трети процессора, и сценарий «только субтитры» оказался хуже, чем «с чистовиком». Сравнивать тик можно только внутри одного дня.
Ограничение чистовика двумя потоками оба раза сделало тик хуже, чем запуск на все ядра. Моя гипотеза, пока не проверенная: два потока ORT у GigaAM дольше держат те же ядра, что и потоки T-one, а на всех ядрах проход быстрее заканчивается. Практический вывод от этого: ограничивать чистовик потоками на такой машине незачем и можно оставлять работу с чистовиком на ночь.

Чистовик можно гонять между звонками на той же машине, но ночью удобнее: на машине B ночь (14 ч) — это около 40 часов встреч. Либо выстроить в очередь на чистовую обработку в течении дня.
Деньги
Цены примерные на октябрь 2026, по курсу ЦБ. Deepgram nova-3 для русского (monolingual) тарифицирует каждый канал отдельно.
Сценарий в облаке | $ за час встречи | ₽ за час |
Стриминг, 2 дорожки, промо $0,0048/мин | 0,58 | 47,7 |
Стриминг, 2 дорожки, обычная цена $0,0077/мин | 0,92 | 76,6 |
Только итог по записи, 2 дорожки, $0,0043/мин | 0,52 | 42,8 |
Только итог по смешанной записи, $0,0043/мин | 0,26 | 21,4 |
Свой сервер с T-one и GigaAM стоит фиксированных денег: как пример расчета - взят Timeweb 8 vCPU / 12 ГБ за 2 790 ₽ в месяц.
Против стриминга Deepgram сервер окупается примерно с 59 часов встреч в месяц по промо-цене и с 36 по обычной. В первой части выходило 57 и 36 часов? но там сдвиг в моменте из -за сдвига курса валют.
Если в облаке делать только итоговый текст по записи, без живых субтитров, порог выше: около 65 часов при двух дорожках и около 130 при смешанной записи.
Ёмкость машины B: живые субтитры для 2 встреч одновременно, чистовик примерно на 40 часов встреч за ночь. Порог окупаемости по ёмкости машина проходит, но при росте упрётся в живые потоки, чистовик её не ограничивает.
На современном CPU с AVX2 та же конфигурация держит в 6–8 раз больше живых потоков (это из первой части). Пороги окупаемости от этого не меняются, растёт потолок.
В расчёт не вошли разработка и поддержка, резервный сервер (он удваивает пороги) и хранение записей.
Грабли
Эталон, собранный моделями, хвалит свои модели-источники. Перед тем как верить красивой цифре, посмотрите, из чего собран эталон. Пятнадцати минут прослушивания выборки мне хватило, чтобы «GigaAM лучше облака» превратилось в «GigaAM наравне с облаком».
Длинные реплики эталона нельзя честно развести по дорожкам. При пересечении голосов текст попадает не туда, поэтому считать пришлось по смешанной дорожке.
Вторая модель не знает ваших терминов. Каскад переносит её ошибку («OpenSpeak»). Без требования латиницы каскад ещё и добавляет 7 п.п. WER.
Чистовик меняет 17–26% текста. Интерфейс должен показывать, что текст уточнился, иначе это выглядит как сбой.
Steal соседей по хосту съедает до трети скорости пакетного прохода. Смотрите колонку st в vmstat перед замером, я наступил на это второй раз.
Parakeet на русском не быстрее GigaAM на старом CPU (39 против 21 минуты на час записи). На ноутбуке с i9 было наоборот.
Что я бы посоветовал
Если вам нужны и живые субтитры, и нормальный итоговый текст на русском:
Делите работу по времени. Потоковая модель пишет черновик во время звонка, пакетная переписывает его после. Черновик заменяйте целиком, не склеивайте: при соотношении восемь исправлений к одной порче склейка не окупится.
Не ограничивайте чистовик потоками на слабой машине. Ставьте nice 19 и по возможности переносите его на ночь. Живые субтитры от соседства с ним не страдают, отставание фразы осталось 1,08–1,20 с.
Термины чините личным словарём, а не второй моделью. Если речь в основном русская, а термины одиночные, вторая модель повторяет ту же ошибку другими буквами.
Не верьте эталону, собранному из нескольких моделей, пока не переслушали выборку. Сорок случайных мест хватило, чтобы увидеть перекос в 1,5–3 п.п. в пользу моделей-источников.
Считайте отдельно ошибки в числах. Средний WER их не показывает, а в итогах встречи цена ошибки в сумме или сроке выше, чем в любом другом слове.
Свой сервер имеет смысл примерно с 36–59 часов встреч в месяц или если аудио обязано оставаться в России. При меньшем объёме дешевле и проще облако.
Вопрос к читателям
На сколько Вам было бы интересно проводить 1-2-1 созвон с онлайн транскрибацией в моменте?
Если вы проводите 1-2-1 и к вам пришел сотрудник который много всего рассказывает или это Ваш 1-2-1 с вашим руководителем который накидывает Вам сразу с десяток поручений в диалоге - то как вы фиксируете все услышанное?
Все числа получены прогонами stt-lab на узле B. Код стенда: GitHub, GitVerse.
KioskNews shows a cleaned-up reading view extracted from the publisher’s page — the original always lives on their site, not ours.