Представим юридическую фирму, у которой за несколько месяцев накопились сотни часов аудиозаписей. В них нужно искать фамилии, даты, показания и детали конкретных эпизодов. Пока записи существуют только в виде файлов, нужный фрагмент приходится искать почти вслепую, с ручкой и блокнотом в руках. Открывать аудио, перематывать и слушать.

Подкрадывается очевидное решение. Отправить запись в сервис расшифровки и через несколько минут получить готовый текст. Но для материалов с чувствительными данными такой сценарий подходит не всегда. Передача файла во внешнюю систему может противоречить внутренним правилам компании, а сам факт отправки означает, что появилась ещё одна копия записи, и за доступ к ней теперь отвечает кто-то другой.

Поэтому я собрал локальное решение на базе Whisper. Аудио обрабатывается на своей машине, а на выходе остаются текст и таймкоды.

В этой статье разберём, откуда взялся Whisper, как он превращает звук в текст, что умеет официальная консольная версия без дополнительных модификаций и как я применил эту технологию на практике.


❯ Whisper: начало

21 сентября 2022 года, релиз
21 сентября 2022 года, релиз

OpenAI представила Whisper. Вместе со страницей релиза компания открыла код и веса моделей в общий доступ. Модель обучена на 680 000 часах многозадачных и многоязычных данных собранных со всего интернета. При этом, сам обучающий набор данных не выкладывали. Поэтому корректнее говорить об открытых моделях и коде, а не об открытом датасете.

Модель многозадачна. Одна и та же сеть умеет распознавать речь, определять язык говорящего
и переводить иностранную речь сразу в английский текст

После релиза технология не стояла на месте:

Декабрь 2022

Вышла версия large-v2: улучшили обучение, добавили методы регуляризации; ошибок стало примерно на 5% меньше на английском и на 10% на других языках

Март 2023

Запустили Whisper API: разработчики могут отправлять аудио в облако OpenAI и получать текст, не покупая мощные видеокарты;
цена на старте — $0,006 за минуту

Ноябрь 2023

Вышла large-v3: частотных каналов стало 128 вместо 80, добавили кантонский. Обучили на 1 млн часов слабо размеченных данных и 4 млн часов, которые разметила large-v2. На языках, где ошибка large-v3 на Common Voice 15 и Fleurs ниже 60%, ошибок стало на 10–20% меньше, чем у large-v2.

Сентябрь
2024

Вышла turbo-версия: декодер сократили с 32 до 4 слоёв, что дало большой прирост скорости; точность осталась близкой к large-v2, но на некоторых языках (тайский, кантонский) чуть хуже

Ставка на масштаб вместо новой архитектуры

Whisper не принёс новой архитектуры. Авторы взяли обычный encoder-decoder Transformer и проверяли другую гипотезу. Что будет, если вместо аккуратного дообучения под каждый датасет просто скормить модели очень много разнородного аудио с уже готовыми расшифровками.

Чтобы понять, почему это было спорным решением, нужен контекст.
К 2022 году сильные системы распознавания речи обычно строились так: сначала предобучение на неразмеченном аудио, потом обязательный этап дообучения под конкретную задачу. Проблема в том, что дообучение требует человека, который умеет его готовить, а результат хорошо ложится на знакомый тест и хуже переживает смену микрофона, акцента или тематики.

Авторы Whisper ссылаются на собственный опыт с CLIP. Дообучение на ImageNet подняло точность на 9,2%, а средняя точность на семи других датасетах не выросла вообще.
Отсюда их формулировка цели: система распознавания речи должна надёжно работать «из коробки» в широком диапазоне условий, без отдельного дообучения под каждый отдельный сценарий.

Данные не были «без учителя»

У каждого фрагмента аудио была текстовая пара. Просто эти пары брали из интернета и не проверяли вручную строка за строкой.

Всего собрали 680 000 часов аудио. Если слушать такой архив без остановки, он закончится примерно через 78 лет.

Данные для обучения распределены так:

  • 438 000 часов, или 65% — английская речь с английской расшифровкой;

  • 126 000 часов, или 18% — неанглийская речь с переводом на английский;

  • 117 000 часов, или 17% — неанглийская речь с расшифровкой на исходном языке.

Как чистили эту гору

Главной угрозой были не опечатки, а чужие машины. Значительная часть субтитров в интернете написана не человеком, а другой системой распознавания речи. Учиться на них означало учиться повторять чужие ошибки. Для этого артефакта авторы придумали название transcript-ese и собрали набор эвристик, чтобы его вычистить.

Как отличить машинные субтитры от человеческого

Старые системы распознавания почти не умели нормальную пунктуацию. Они редко ставили запятые, точки с запятой и вопросительные знаки, не делили текст на абзацы и часто писали всё одним регистром. Человек так почти не пишет. Поэтому расшифровку целиком в ВЕРХНЕМ или целиком в нижнем регистре считали машинной.
То же самое с текстом, где за всю реплику нет ни одной запятой. Если рядом ещё нет абзацев и нормальных предложений, шанс, что это чужая модель, а не разметчик, становится очень высоким.

Язык проверяли дважды. Аудио прогоняли через детектор на VoxLingua107, текст через CLD2. Если языки не совпадали, пару обычно выбрасывали, но не всегда.

Если текст был английским, а речь нет, пару не удаляли, а клали в данные для перевода. Так и набрались те самые 126 000 часов X→en .

Был и второй подход
Сначала обучили первую модель, посчитали ошибку по каждому источнику и вручную открыли те, где ошибка высокая и объём большой. Там нашлись кривые расшифровки, съехавшая синхронизация и машинные субтитры, которые простые проверки не поймали. Такие источники удаляли целиком.

Фрагменты без речи не выбрасывали. Их оставили в обучении, но брали в десять раз реже обычных, и использовали как данные для детекции голоса. Модель училась и слышать речь, и молчать, когда её нет.


❯ Whisper под капотом

Снаружи всё просто: на входе аудиофайл, на выходе текст. Внутри между этими двумя точками пять этапов:
аудиофайл -> моно 16 кГц -> log-Mel-спектрограмма -> encoder -> decoder -> текст и таймкоды

Сначала звук приводят к одному виду

Whisper не умеет работать с mp3, m4a, flac и другими форматами напрямую. Официальная версия запускает FFmpeg как отдельный процесс и просит его отдать «сырой» звук в единственном понятном ей формате — моно, 16 кГц, 16-битные целые числа. Потом эти числа делятся на 32768 и превращаются в дробные значения примерно от -1 до 1, с ними Whisper уже и работает.

Отсюда и растёт ошибка «FFmpeg не найден», с которой сталкивается почти каждый на первом запуске. Whisper не подключает FFmpeg как библиотеку, он его именно вызывает. Не указан в PATH, нет распознавания.

Дальше запись режут на окна по 30 секунд. Это не настройка и не эвристика, а предел модели. 30 секунд при 16 кГц дают ровно 480 000 отсчётов, и энкодер рассчитан именно на этот размер.
Если файл короче, его остаток добивают нулями.
Если файл длиннее, его проходят окно за окном.

Звуковая волна для модели неудобна.
Поэтому следующий шаг — log-Mel спектрограмма, это карта звука. По горизонтали идёт время, по вертикали расположены частотные диапазоны, а яркость каждой точки показывает, сколько в этот момент было энергии на этой частоте.

Логарифм нужен, чтобы сжать разницу громкости. Между шёпотом и криком в обычном масштабе пропасть. В логарифмическом разница становится обозримой. Шкала Mel делает другое. Она расставляет частоты так, как их слышит человек. Внизу диапазона разницу в сто герц слышно хорошо, наверху почти нет. Mel это повторяет.

Карту считают короткими окошками по 25 миллисекунд, сдвигаясь каждые 10 миллисекунд, окошки перекрываются. На 30 секунд получается ровно 3000 срезов по времени.

Encoder: слушает

Карта частот сначала проходит через два простых слоя, которые сжимают её по времени. Второй слой берёт каждый второй срез и укорачивает последовательность вдвое. 3000 срезов становятся 1500 позициями.

Отсюда простая арифметика. Одна позиция энкодера покрывает 20 миллисекунд звука. Это число ещё вернётся у меток времени.

Дальше внутри блока звук сравнивают сам с собой. Модель смотрит, где начался звук, что было рядом, какой общий контекст у всего куска. Информацию о порядке позиций ей дают заранее подготовленные числа, которые просто прибавляют к признакам.

На выходе энкодера нет ни слова текста. Там числовое представление звука, к которому дальше будет обращаться вторая половина модели.

Decoder: пишет

А вот декодер это, по сути, языковая модель. Он генерирует результат последовательно, токен за токеном, и на каждом шаге смотрит в две стороны. На уже написанный текст, и на описание звука из первой половины .

Поэтому Whisper устроен не как словарь «звук -> слово». Он ближе к модели, которая пишет правдоподобный текст, опираясь на услышанное. Из этого сразу следует главная проблема Whisper, но к ней вернёмся позже.

Семейство моделей

Семейство Whisper содержит шесть основных размеров. Меньшие быстрее и легче, большие точнее и тяжелее.

Ниже находится таблица, там расписаны все основные характеристики каждой модели. Касаемо скорости, она считается относительно large модели.

Модель

параметры

размер

видеопамять

скорость

tiny

39 млн

~75 МБ

~1 ГБ

~10x

base

74 млн

~142 МБ

~1 ГБ

~7x

small

244 млн

~466 МБ

~2 ГБ

~4x

medium

769 млн

~1.5 ГБ

~5 ГБ

~2x

turbo

809 млн

~1.6 ГБ

~6 ГБ

~8x

large (v1-v3)

1550 млн

~2.9 ГБ

~10 ГБ

1x

Таймкоды: откуда они берутся

Модель не измеряет время секундомером. Она его угадывает так же, как слова.

В его словаре есть 1501 служебный токен, обозначающий позиции от 0 до 30 секунд с шагом 20 мс. Например, токен <|12.34|> означает: следующая часть фразы относится к моменту примерно 12,34 секунды в текущем 30-секундном фрагменте аудио. Во время обучения такие токены ставили в расшифровку рядом с текстом, поэтому модель учится предсказывать их вместе со словами.

Но шаг 20 мс не означает точность до 20 мс. Это лишь временная сетка, на которую модель выбирает ближайшую позицию. Поэтому граница сегмента может попасть в паузу, немного опередить речь или объединить несколько коротких фраз. Для субтитров этого часто достаточно, но воспринимать такие метки как точную разметку каждого слова не стоит.

Пословные таймкоды в официальном Whisper получают иначе. После распознавания модель анализирует cross-attention: какие участки аудио были наиболее важны при генерации каждого текстового токена. Затем эти данные сглаживают и выравнивают с аудио алгоритмом Dynamic Time Warping, чтобы оценить начало и конец отдельных слов.

Сегментные метки модель предсказывает напрямую, а метки отдельных слов вычисляются после распознавания как дополнительная оценка.

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

На генерации действуют жёсткие правила. Таймкоды идут строго парами, не могут убывать, сегмент обязан иметь ненулевую длину, а самая первая метка обязана попасть в первую секунду окна. Последнее ограничение авторы добавили специально, чтобы модель не проглатывала начало записи.

Что происходит с записью длиннее 30 секунд

Модель видит только одно окно. Всё остальное, это обвязка вокруг неё.

За один запуск модель обрабатывает не более 30 секунд аудио. Длинную запись внешняя функция разбивает на такие окна и передаёт их модели одно за другим. При этом следующее окно начинается не обязательно ровно через 30 секунд. Позицию сдвигают по последнему предсказанному таймкоду. Так обработчик не пропускает остаток фразы, если модель распознала только часть окна.

Текст из предыдущего окна по умолчанию добавляют в контекст следующего. Это помогает сохранять единый стиль, например одинаково писать имена, термины и продолжать фразы на стыке фрагментов

Но контекст может переносить и ошибку: если модель начала повторяться или неверно распознала фразу, этот сбой иногда влияет на следующий участок.

Для таких случаев в Whisper предусмотрен сброс контекста после декодирования с температурным fallback.

Откуда берутся выдумки

Декодер не транскрибирует в прямом смысле. Он предсказывает правдоподобное продолжение текста, опираясь и на аудио, и на свои общие знания о языке. Пока в записи есть внятная речь, обе опоры тянут в одну сторону. Когда речь заканчивается: тишина, шум, неразборчивое бормотание. Остаётся только языковая опора. И модель продолжает писать связный текст, которого в записи не было.

В официальной model card прямо сказано: из-за обучения на слабых зашумленных парах аудио-текст модель может генерировать текст, которого нет в записи.
Чаще всего это происходит на тишине, фоновой музыке и длинных паузах, когда Whisper «дописывает» стандартные фразы вроде благодарностей, рекламных вставок или просто связные предложения.

Исследование «Careless Whisper» (FAccT 2024) прогнало через Whisper API 13 140 коротких фрагментов из корпуса AphasiaBank. Галлюцинации нашлись примерно в 1,4% сегментов. Из них около 38% содержали потенциально вредный текст. Выдуманные сцены насилия, ложные медицинские утверждения, приписанные спикерам слова. Это не любой локальный прогон и не юридические записи, а облачный API на речи с афазией и контрольной группой. На большом архиве даже 1–1,5% дают десятки мест, которых никто не говорил. Те 187 сегментов, которые сбоили в апреле–мае 2023, снова прогнали в декабре: проблемными остались 12. Модель улучшают, до нуля риск не падает.

На уровне генерации декодер по очереди выбирает токены: начало транскрипции, язык, режим, начальный таймкод, слова, конечный таймкод. Пока акустический сигнал сильный, выбор токенов жёстко привязан к звуку; когда сигнал слабый, распределение вероятностей «размывается», и модель чаще опирается на языковой prior, порождая связные, но выдуманные продолжения.

Что Whisper не умеет

Whisper не различает говорящих. В его мультизадачном формате есть расшифровка, перевод на английский, определение языка и детекция речи, но нет разметки «говорящий 1» и «говорящий 2». В словаре сегмента, который возвращает модель, поля для спикера просто не существует.

Так что для интервью, подкастов или записи заседаний диаризацию придётся строить отдельным слоем. Я уже закрыл эту проблему: в своём проекте подключил Nvidia NeMo для определения спикеров, а дальше сопоставил его сегменты со словами из Whisper. Ниже покажу этот проект и как именно в нём реализовано разделение говорящих.


❯ Как работать с «голым» Whisper

Под «голым» Whisper я имею в виду официальный пакет openai-whisper из репозитория OpenAI .

Установка Whisper и FFmpeg зависит от операционной системы, поэтому подробно разбирать её здесь не будем. Предполагается, что Python, пакет openai-whisper и FFmpeg уже установлены, а команда whisper --help выполняется без ошибок.

Дальше рассмотрим, что можно делать с уже работающим Whisper:

  • получать обычную расшифровку;

  • создавать субтитры;

  • сохранять сегментные и пословные таймкоды;

  • обрабатывать несколько файлов;

  • подсказывать модели термины и язык;

  • переводить речь на английский;

  • передавать результат в отдельный слой диаризации;

Первый запуск

Для первого запуска достаточно указать аудиофайл, модель и язык записи.

Windows
whisper "recordings\example.mp3" `
  --model small `
  --language ru `
  --task transcribe `
  --output_format txt `
  --output_dir "result"
Linux и macOS
whisper "recordings/meeting.m4a" \
  --model small \
  --language ru \
  --task transcribe \
  --output_format txt \
  --output_dir result
Какой результат?

Пример вывода:

Detected language: ru
[00:00.000 --> 00:07.500]  Добрый день, коллеги.
[00:07.500 --> 00:15.200]  Начнём совещание с обсуждения результатов за неделю.
[00:15.200 --> 00:23.800]  Затем перейдём к плану работ.

А в каталоге result появится файл: meeting.txt
Его содержимое будет выглядеть так:

Добрый день, коллеги. Начнём совещание с обсуждения результатов за неделю. 
Затем перейдём к плану работ.

Вывод в терминале и файл отличаются. Терминал показывает прогресс и сегменты с временными границами, а txt содержит только сплошной текст без таймкодов. Формат файла определяется параметром --output_format.

Форматы результата

Одна и та же запись может быть сохранена в разных форматах. Меняется не сама расшифровка, а способ представления результата.

TXT: только текст

Команда:

whisper "recordings/meeting.m4a" \
  --model small \
  --language ru \
  --output_format txt \
  --output_dir result

В терминале:

Detected language: ru
[00:00.000 --> 00:07.500]  Добрый день, коллеги.
[00:07.500 --> 00:15.200]  Начнём совещание с обсуждения результатов за неделю.

Файл: result/meeting.txt
Содержимое:

Добрый день, коллеги. Начнём совещание с обсуждения результатов за неделю.

Этот формат подходит для чтения и передачи текста в другую программу.

SRT: субтитры

Команда:

whisper "recordings/meeting.m4a" \
  --model small \
  --language ru \
  --output_format srt \
  --output_dir result

Файл: result/meeting.srt
Содержимое:

1
00:00:00,000 --> 00:00:07,500
Добрый день, коллеги.

2
00:00:07,500 --> 00:00:15,200
Начнём совещание с обсуждения результатов за неделю.

SRT можно открыть в видеоплеере или монтажной программе.

VTT: субтитры для браузера

Команда:

whisper "recordings/meeting.m4a" \
  --model small \
  --language ru \
  --output_format vtt \
  --output_dir result

Файл: result/meeting.vtt
Содержимое:

WEBVTT

00:00.000 --> 00:07.500
Добрый день, коллеги.

00:07.500 --> 00:15.200
Начнём совещание с обсуждения результатов за неделю.

VTT часто используется в браузерных видеоплеерах.

TSV: таблица с таймкодами

Команда:

whisper "recordings/meeting.m4a" \
  --model small \
  --language ru \
  --output_format tsv \
  --output_dir result

Файл: result/meeting.tsv
Содержимое:

start	end	text
0	7500	Добрый день, коллеги.
7500	15200	Начнём совещание с обсуждения результатов за неделю.

Времена здесь указаны в миллисекундах. TSV удобно обрабатывать скриптом или открывать в табличном редакторе.

JSON: полный результат

Команда:

whisper "recordings/meeting.m4a" \
  --model small \
  --language ru \
  --output_format json \
  --output_dir result

Файл: result/meeting.json
Содержимое:

{
  "text": " Добрый день, коллеги. Начнём совещание с обсуждения результатов за неделю.",
  "segments": [
    {
      "id": 0,
      "seek": 0,
      "start": 0.0,
      "end": 7.5,
      "text": " Добрый день, коллеги.",
      "tokens": [ ... ],
      "temperature": 0.0,
      "avg_logprob": -0.31,
      "compression_ratio": 1.12,
      "no_speech_prob": 0.04
    }
  ],
  "language": "ru"
}

JSON нужен, если результат будет обрабатываться программно. В нём есть язык записи, общий текст, сегменты, таймкоды и диагностические поля.

Пословные таймкоды

Сегментные таймкоды показывают начало и конец целой фразы. Если нужно знать время каждого слова, добавьте --word_timestamps True.

Команда:

whisper "recordings/meeting.m4a" \
  --model small \
  --language ru \
  --task transcribe \
  --word_timestamps True \
  --output_format json \
  --output_dir result
Фрагмент вывода в терминал:
Detected language: ru
[00:00.000 --> 00:07.500]  Добрый день, коллеги.

Файл: result/meeting.json
Фрагмент JSON:

{
  "start": 0.0,
  "end": 7.5,
  "text": " Добрый день, коллеги.",
  "words": [
    {
      "word": " Добрый",
      "start": 0.0,
      "end": 1.1,
      "probability": 0.98
    },
    {
      "word": " день,",
      "start": 1.1,
      "end": 1.7,
      "probability": 0.97
    },
    {
      "word": " коллеги.",
      "start": 2.0,
      "end": 3.0,
      "probability": 0.95
    }
  ]
}

Это полезно для подсветки слов в плеере, перехода к найденной фамилии или сопоставления текста с диаризацией. При этом такие границы остаются оценкой модели. На шуме, перебиваниях и неразборчивой речи они могут смещаться. Режим word_timestamps в официальном CLI обозначен как экспериментальный.

Несколько файлов

Команда:

whisper "recordings/meeting-01.wav" \
  "recordings/meeting-02.mp3" \
  "recordings/interview.m4a" \
  --model small \
  --language ru \
  --output_format json \
  --output_dir result

Пример вывода:

processing meeting-01.wav
Detected language: ru
[00:00.000 --> 00:07.500]  Добрый день, коллеги.

processing meeting-02.mp3
Detected language: ru
[00:00.000 --> 00:05.800]  Обсудим следующий вопрос.

processing interview.m4a
Detected language: ru
[00:00.000 --> 00:09.100]  Расскажите, как начинался этот проект.

В каталоге появятся:

result/meeting-01.json
result/meeting-02.json
result/interview.json

Если один файл завершится ошибкой, CLI выведет traceback и перейдёт к следующему. Поэтому после пакетной обработки стоит проверить, что для каждого входного файла появился результат.

Подсказка для терминов

Редкие фамилии, аббревиатуры и названия продуктов можно передать в --initial_prompt.

whisper "recordings/meeting.m4a" \
  --model small \
  --language ru \
  --initial_prompt "Термины записи: ЕГРЮЛ, субсидиарная ответственность, арбитражный суд" \
  --output_format json \
  --output_dir result

Пример вывода:

Detected language: ru
[00:00.000 --> 00:06.400]  Сегодня обсуждаем ЕГРЮЛ и субсидиарную ответственность.
[00:06.400 --> 00:13.200]  Отдельно разберём вопрос арбитражного суда.

В результате появится: result/meeting.json

Подсказка не является словарём и не исправляет результат принудительно. Она только добавляет слова в контекст генерации. На плохой записи модель всё равно может выбрать другое написание.

Расшифровка и перевод

Пример:

whisper "recordings/meeting.m4a" \
  --model medium \
  --language ru \
  --task translate \
  --output_format txt \
  --output_dir translated

РЕЗУЛЬТАТ:
Today we will discuss the project results and the next steps.

--task translate переводит речь именно на английский. turbo для этого режима использовать не стоит: модель предназначена для транскрипции, а не для перевода. README официального репозитория отдельно предупреждает об этом ограничении.

Локально не значит защищено

После загрузки весов официальный пакет может работать без интернета и не отправляет аудио в OpenAI. Но исходная запись, кеш модели, временные файлы и расшифровка остаются на компьютере. Команда запуска ничего не шифрует и не удаляет.

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

❯ DotAudio: что пришлось построить вокруг Whisper

.аудио

Мне понадобилось расшифровывать записи, которые я не хотел отправлять в чужой облачный сервис. Консольный Whisper решал задачу для отдельного файла, но как повседневный инструмент был неудобен. Для каждого запуска нужно выбрать модель, вспомнить параметры, дождаться обработки, а потом отдельно разбирать таймкоды и складывать результаты.

Хотелось другого сценария. Нажать сочетание клавиш и надиктовать текст в уже открытое поле. Включить субтитры для звука с компьютера. Открыть длинную запись, перейти к нужной реплике, поправить ошибку и сохранить результат в подходящем формате. И всё это должно быть локально.

Так появился DotAudio. Это не новая модель и не форк Whisper, а настольная программа вокруг faster-whisper.

При первом запуске программа проверяет доступные ресурсы компьютера и предлагает подходящие модели. После выбора она загружает необходимые компоненты и выполняет первоначальную настройку. Доступна обработка через CPU и GPU. Есть определение голосов через NVIDIA NeMo и локальный ассистент по уже расшифрованному тексту.

Live: отображение субтитров в режиме реального времени

Речь идёт в историю, результат можно сохранить
Речь идёт в историю, результат можно сохранить

Живые субтитры показывают речь по мере того, как она звучит: микрофон или звук с компьютера, при желании отдельным окном поверх видео или созвона. Пока фраза ещё идёт, строка может измениться. После паузы она встаёт.

После Stop Live ещё раз прогоняет сессию как обычный файл и подменяет черновики итогом. Временный звук при этом ненадолго лежит на диске, потом удаляется.

Диктовка

Остров поверх окна, затем текст копируется в буфер обмена
Остров поверх окна, затем текст копируется в буфер обмена

Ctrl+Alt+Space. Приложение запоминает активное окно и показывает небольшой остров поверх остальных программ: уровень микрофона, черновой текст, стоп. Звук на диск не пишется. После остановки текст уточняется, к нему можно применить свой словарь терминов. Исходная расшифровка в истории остаётся отдельно. Финал всегда попадает в буфер обмена, и если окно не сменилось, ещё и вставляется.

Транскрибация аудио

Аудио и видео в текст с таймкодами, результат можно скачать
Аудио и видео в текст с таймкодами, результат можно скачать

Отдельная страница принимает аудио и видео в распространённых форматах. Копию себе приложение не делает, в истории путь к оригиналу. На выходе не один txt, а список реплик с таймкодами.

Клик по фразе перематывает запись, текущая подсвечивается. Можно менять скорость, зациклить кусок, править текст, искать и заменять, склеивать и резать реплики, двигать границы, помечать проверенное. Исходный вариант сегмента при правке не уничтожается.

Whisper не знает, кто говорит. Голоса считаются отдельным шагом. NeMo определяет анонимные роли вроде «Голос 1» исходя из полученного аудио, их можно переименовать.

Сохранение, работает как отдельное окно с предпросмотром. Обычный текст, одна строка, реплики по ролям, шаблон протокола, Markdown, SRT, VTT, CSV, JSON, LRC. Точность времени, имена, склейка соседних реплик одного человека, фильтр по голосу, только помеченное к проверке. Что видно справа, то и будет внутри файла.

Ассистент

Вопросы, темы и выжимка по расшифровке, локально на этой же машине
Вопросы, темы и выжимка по расшифровке, локально на этой же машине

Последний слой к Whisper напрямую не относится. Локальная языковая модель рядом с уже сохранённой расшифровкой: вопрос по записи, изложение, тезисы, задачи, темы. Таймкоды в ответе кликабельны и ведут к месту в сессии.

Короткую запись она видит целиком, длинную разбирает по частям специальным алгоритмом.

По умолчанию распознавание идёт на этой же машине. Черновики субтитров в базу не пишутся, диктовка держит звук в памяти, импортированные файлы не копируются, временный live-файл после обработки удаляется.

Доступ к интернету требуется только на этапе подготовки. Скачать модели Whisper, модель ассистента, FFmpeg, NeMo. Проект изначально проектировался так, чтобы ничего с компьютера не уходило в сеть.


❯ Итоги

Whisper вышел в 2022-м как обычный Transformer. Принципиально новой архитектуры там нет. Ставка была на количество данных, и она сработала: это видно и по тестам на разных условиях, и по тому, как быстро инструмент разошёлся.

Модель не превращает звук в текст. Она угадывает следующее слово. Иногда попадает, иногда пишет то, чего в записи не было.

На практике одной команды хватает для одного файла. Архив, поиск по фамилии, живые субтитры, правки — это уже обвязка. Её каждый собирает под себя.

Whisper делает записи искомыми, но полностью на его результат полагаться не стоит.


Ссылки
Источники
Может быть интересно:
Перейти ↩

Новости, обзоры продуктов и конкурсы от команды Timeweb.Cloud — в нашем Telegram‑канале 

Комментарии (9)