Руководство

Почему транскрипт повторяет одну и ту же фразу снова и снова

Дело не в вашей записи и не в битой загрузке. Так Whisper ведёт себя, когда никто не говорит, — и есть конкретные способы это прекратить.

Вы транскрибируете длинную запись, открываете транскрипт — и где-то в середине он превращается в это:

[ Silence ]
[ Silence ]
[ Silence ]
[ Silence ]

Или хуже: он берёт настоящее предложение из более раннего места файла и повторяет его сорок раз с правдоподобными таймкодами, как будто кто-то и правда говорил «спасибо за просмотр» раз в секунду целую минуту.

Это самая частая претензия к автоматической транскрибации, и почти у каждого инструмента на основе Whisper от OpenAI есть та или иная её версия. Стоит понимать причину, потому что решение — не «купить модель побольше».

Что происходит на самом деле #

Whisper — языковая модель. Она не «слышит слова и записывает их», а предсказывает наиболее вероятный следующий кусок текста, исходя из аудио и всего, что уже написала.

Такая постановка объясняет и сбой. Когда в аудио есть речь, самый вероятный следующий текст — произносимые слова. Когда в аудио речи нет — пауза, звучание помещения, музыка на удержании, аплодисменты, лектор идёт к доске, — модель всё равно должна что-то выдать. Токена «здесь ничего не произошло» не существует.

Поэтому она отступает к тому, что языковые модели делают при отсутствии сигнала: повторяется. Она только что написала предложение, статистически самое вероятное продолжение — похожее предложение, и, поскольку в аудио нет ничего, что опровергло бы эту догадку, она ходит по кругу. Whisper обрабатывает аудио 30-секундными окнами, так что, если окно попало в цикл, вы получаете одну и ту же строку на всё окно; следующее окно начинается заново — и часто делает то же самое.

Именно поэтому проблема проявляется по очень характерной схеме:

  • Длинные записи — в них больше тишины.
  • Середина и конец файлов — когда интересное закончилось, а диктофон всё ещё пишет.
  • Музыка и аплодисменты — плотный звук без слов.
  • Записи с тихим говорящим и громким помещением, где модель не может отделить одно от другого.

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

Почему «[ Silence ]» и «[BLANK_AUDIO]» — отдельный симптом того же самого #

В обучающие данные Whisper входили транскрипты с пометками в скобках — [ Silence ], [BLANK_AUDIO], (music), ♪♪♪. Поэтому, наткнувшись на участок без речи, модель с высокой вероятностью выдаёт одну из этих пометок, снова и снова.

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

Четыре способа это исправить #

Примерно в порядке эффективности.

1. Детекция речевой активности (настоящее решение) #

Детекция речевой активности — VAD — это небольшая отдельная модель, которая запускается до транскрибации и отмечает, в каких участках аудио есть человеческая речь. Транскрайберу затем отдают только эти участки.

Это решает проблему в корне, потому что цикл возникает только тогда, когда Whisper получает аудио без речи. Если тишина до модели не доходит, галлюцинировать не над чем. Заодно длинные файлы обрабатываются быстрее, потому что вы больше не платите за декодирование двадцати минут пустой комнаты.

Широко используется Silero VAD, и свежие версии whisper.cpp поддерживают его напрямую. Если в вашем приложении есть VAD или опция «пропускать тишину», включите её. Если нет — это разумная вещь, чтобы попросить её у разработчика.

2. Обрежьте тишину сами #

Если в вашем инструменте нет VAD, можно сделать грубую версию вручную: подрежьте запись с начала и с конца до транскрибации, чтобы двадцать минут шума сборов вообще не обрабатывались.

Подойдёт любой аудиоредактор. Это муторно и никак не помогает с тишиной в середине файла, но для очень частого случая «диктофон долго работал в конце» занимает тридцать секунд и убирает худшее.

3. Отфильтруйте пометки постфактум #

Если ваш транскрипт полон [ Silence ] и ♪♪♪, их легко убрать через поиск и замену, потому что это целые строки узнаваемого вида.

Одна осторожность: удаляйте только те строки, которые целиком состоят из пометки. Строка вроде «и тут — (смеётся) — мы это выпустили» — настоящая речь, и её нужно сохранить. Именно это правило хорошее приложение должно применять за вас.

4. Разбейте файл #

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

Это обходной путь, а не решение. Он уменьшает радиус поражения, но не мешает модели галлюцинировать над тишиной.

Что не помогает #

Модель побольше. Переход с Base на Large стоит вам массы времени и места на диске и цикл не убирает, потому что причина не в нехватке ёмкости, а в том, что модель просят расшифровать нечто, где нет речи. Крупные модели тоже зацикливаются. (Подробнее о компромиссе размера.)

Облачный сервис. Хорошие облачные инструменты используют VAD и постобработку в своём конвейере, поэтому сталкиваются с этим реже. Механизм внизу тот же, и многие из них по-прежнему выдают «спасибо» пятьдесят раз на тихом файле. Плата за минуту не покупает вам другой декодер.

Прогнать заново. Сэмплирование в Whisper не полностью детерминировано, поэтому вторая попытка может зациклиться в другом месте. Это не исправление, а подбрасывание монетки.

Что с этим делаем мы #

Скажем конкретно, потому что расплывчатый ответ здесь бесполезен.

Offline Transcription запускает Silero VAD перед транскрибацией, так что тихие участки и участки без речи до декодера не доходят. Вдобавок пометки, занимающие сегмент целиком, — вроде [ Silence ] и одиночных нотных символов — отфильтровываются из результата, а строки, которые лишь содержат вставку в скобках, сохраняются, потому что это настоящая речь.

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

Честная оговорка: это делает проблему повторяющейся фразы очень редкой, а не невозможной. Любой инструмент на основе Whisper, включая наш, — это языковая модель, делающая предсказания, а предсказывающая модель может ошибиться. Если вы транскрибируете что-то, где точность важна, сверяйте транскрипт с аудио в тех частях, на которые собираетесь опираться, — быстрый способ описан в нашем руководстве по интервью.

Коротко #

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

Скачать Offline Transcription

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

macOS 13.0 or higher · iOS 16.4 or higher