Как сжать 300+ часов D&D сериала в пересказ для актеров. asr.. asr. Claude.. asr. Claude. gigaam.. asr. Claude. gigaam. llm.. asr. Claude. gigaam. llm. opus.. asr. Claude. gigaam. llm. opus. python.. asr. Claude. gigaam. llm. opus. python. whisper.. asr. Claude. gigaam. llm. opus. python. whisper. база знаний.. asr. Claude. gigaam. llm. opus. python. whisper. база знаний. диаризация.. asr. Claude. gigaam. llm. opus. python. whisper. база знаний. диаризация. искусственный интеллект.. asr. Claude. gigaam. llm. opus. python. whisper. база знаний. диаризация. искусственный интеллект. Машинное обучение.. asr. Claude. gigaam. llm. opus. python. whisper. база знаний. диаризация. искусственный интеллект. Машинное обучение. распознавание речи.. asr. Claude. gigaam. llm. opus. python. whisper. база знаний. диаризация. искусственный интеллект. Машинное обучение. распознавание речи. транскрибация.

Я давно играю в ДнД и почти с самого начала смотрю «Грядут приключения» – ребята снимают настольные ролевые игры как сериалы: живая партия актеров за столом, постоянный каст, сквозной сюжет, серии по пять-шесть часов. Нравится у них всё, но больше всего – «Архипелаг» и «Эндемия».

В какой-то момент несравненный Мастер Гоша Воронин кинул в своём канале клич: проекту нужна помощь с пересказом сериала. Нужен был текст, по которому актёры смогут прочитать всё случившееся за 55 серий.

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

Так я и взялся разобрать все 55 серий в базу знаний и написать по ней текст видеопересказа для актеров на 30-60 минут.

Объём работ и что получилось

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

Что

Сколько

Эпизодов

55

Суммарная длительность

302,6 часа

Средняя серия

5,5 часа

Самая длинная / короткая

7,9 ч (ep11) / 4,1 ч (ep03)

Слов в транскриптах

2 082 472

Реплик с таймкодом

170 258

Аудио 16 кГц моно на диске

33 ГБ

Вот что из этих 303 часов выросло:

Раздел

Файлов

Слов

screenplay/ – сценарии серий

55

1 279 194

canon/characters/ – карточки персонажей

167

219 765

canon/locations/ – локации

72

56 827

canon/items/ – предметы

26

12 921

canon/events/ – хронология

55

153 351

retelling/ – структура и текст пересказа

2

9 484

Корневые своды (глоссарий, открытые вопросы)

9

91 450

Всего в knowledge/

391

1 823 301

Ушло у меня на всё около восемь дней плотной работы.

Как транскрибировал и почему GigaAM v3, а не Whisper

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

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

А для русского языка расклад совсем другой, и лидирует здесь GigaAM v3 от Сбера (не реклама, а факт). Разрыв видно прямо по бенчмаркам – вот официальная таблица из репозитория GigaAM, WER в процентах, ниже значит лучше:

Датасет

GigaAM v3 RNNT

Whisper large-v3

Golos Crowd

2,4

19,0

Golos Farfield

3,9

16,4

Common Voice 19

0,9

5,5

Russian LibriSpeech

4,4

9,4

Natural Speech

6,9

13,4

OpenSTT YouTube

10,6

17,8

Callcenter

9,5

23,1

Среднее

8,3

21,0

Одна и та же реплика в исполнении двух моделей

Одна и та же реплика в исполнении двух моделей

В среднем в два с половиной раза меньше ошибок. Самая релевантная для меня строка – OpenSTT YouTube: это ближе всего к записи живого разговора за столом. Претрейн на 700 тысячах часов русской речи, лицензия MIT, а для end-to-end версий заявлен side-by-side 70:30 против Whisper large-v3 по оценке LLM-судьёй. Взял ревизию e2e_rnnt – она отдаёт текст с пунктуацией и нормализацией из коробки, а не голый поток слов.

Стек целиком:

Слой

Что

Скачивание

yt-dlp -f bestaudio, только звук

Конвертация

ffmpeg -ar 16000 -ac 1

Диаризация

pyannote/speaker-diarization-3.1

Распознавание

ai-sage/GigaAM-v3, ревизия e2e_rnnt

Пятнадцать-двадцать минут на серию, 14-18 часов на все 55. Скачанные аудиодорожки стираю сразу после конвертации в 16 кГц: иначе к тем 33 гигабайтам, которые займёт готовый корпус, добавятся ещё четырнадцать, которые больше никогда не понадобятся.

Одна вещь по дороге меня всё-таки озадачила. GigaAM выложен под лицензией MIT – бери и пользуйся, никаких ограничений. Но сами веса с CDN Сбера не отдаются, если ты заходишь не с российского IP: в ответ молча прилетает 403. Открытая модель, свободная лицензия и географический замок на скачивании одновременно. Выручает то, что ровно те же веса лежат на HuggingFace и оттуда доступны кому угодно, так что история скорее курьёзная – но время на ней потерять можно легко, если не знать заранее и списать 403 на упавший сервер.

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

Эталон

Что в транскриптах

Игдрас

Игдрас 503, Игдрис 337, Игдрос 158, Иглас 2

Бродерик

Бродик 85, Бродерик 68

Хальд

Хальт 60, Халь 28

Адригал

Адригал 138, Адрегал 27

Один и тот же персонаж глазами распознавалки

Один и тот же персонаж глазами распознавалки

Я сел и посчитал по этим четырём именам: из 1406 распознанных вхождений верное написание получили 769, то есть чуть больше половины. Главного героя зовут правильно примерно в каждом втором случае.

На самом деле если подумать, ничего удивительного тут нет. Любой бенчмарк меряет распознавание слов, которые в языке есть. А в фэнтезийном сеттинге половина значимых слов выдумана автором: имена, топонимы, названия орденов и богов. Модель их не слышала ни разу и честно подставляет ближайшее знакомое. Бард Публий Квинтилиан Урван превращается в «Вентелю Нурмана», Марло – в «Марвела», Рида Пергам – в «Риду Пироганову», сэр Гранальд – в «Царя Гранальда», а Летиция Черноокая – в «Летицию Черноухую».

Мой любимый случай – город Долгоград. Модель уверенно и стабильно слышит в нём Волгоград, потому что Волгоград она знает, а Долгограда в природе нет. Тут даже не поспоришь: с точки зрения языковой модели её вариант куда вероятнее моего.

Модель подставляет то, что знает

Модель подставляет то, что знает

Справлялся я с этим так: первым делом, ещё до всяких сценариев, собрал глоссарий эталонных написаний. Порядок тут принципиален. Если сначала нагенерить сценарии, а потом чинить имена, разнописания успеют протечь дальше по цепочке – в карточки персонажей, в хронологию, в текст пересказа. И тогда вычитчику придётся ловить одну и ту же ошибку пятьдесят пять раз вручную. День на глоссарий в начале экономит недели вычитки в конце.

Разросся он до 838 строк: игровые персонажи, неигровые, топонимы, организации, боги, прочие термины. Отдельным блоком идут спорные случаи, которые я закрывал сам: читал сценарий и правил по памяти на то, что считаю верным – сериал я смотрел целиком, поэтому большинство имён узнаю даже в исковерканном виде. И правил именно по памяти, а не по подсчётам, потому что частота тут врёт. Правильное «Игемон» встречается в записи 11 раз, а чаще всего звучит «Гегемон» – 33 раза.

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

Почему сценарии писал Claude Opus 5

Транскрипт – это плоский поток реплик. Сценарий – другое: сцены с таймкодами, действие от третьего лица, реплики, итог сцены. Между ними лежит работа, которую скриптом не сделать.

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

На выходе метки говорящих скачут, реплики уезжают не тому, диалог игрока и мастера слипается в один голос. Сверху накладывается специфика настолки: мастер озвучивает вообще всех НИП, а ещё описывает мир и действия. Фраза «дверь со скрипом открывается, в проёме стоит стражник» – это не реплика мастера, это описание сцены, и в сценарии оно должно стать текстом действия, а не строчкой диалога. И тут же рядом идёт чистая механика: «кидай атаку», «семнадцать», «попал», «у тебя минус три к броску» – говорят игроки, а не герои, и в сценарий это попадать не должно совсем.

Разметкой голосов такое не чинится: тембр просто не несёт нужной информации. Разнести реплики можно только по смыслу происходящего – и тут понадобилась LLM.

Выбор моделей у меня был ограничен с самого начала. Всё гонялось через подписку Claude Code за сто долларов в месяц: 55 серий, каждая по несколько проходов, плюс каноны, плюс отладка. Гнать такой объём через API означало счёт, который никакая фанатская затея не оправдает, так что этот вариант отпал сразу. Оставалось выбирать из того, что доступно по подписке: Haiku, Sonnet, Opus и Fable.

Haiku и Sonnet отвалились быстро, причём не из-за контекста – с длиной они справляются. Проблема оказалась в смысловой нагрузке. Тот самый случай с описаниями мастера: модель послабее оставляет их репликой мастера вместо того, чтобы увести в действие или в описание мира. Вроде мелочь, но на пятидесяти пяти сериях это превращает сценарий в кашу, где мастер бесконечно что-то говорит, а мир вокруг не происходит.

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

Так остался Opus 5, и со смысловым разнесением реплик он справлялся лучше остальных: держал сцену целиком, отличал описание мира от прямой речи, механику от игрового диалога, и восстанавливал говорящего по контексту даже там, где разметка врала. И это все на абсолютно гиганстком объеме данных. Сильных провалов на этой задаче я за ним не замечал.

Где Opus лажал

Модель хорошо пишет сценарии и плохо следует инструкциям.

Главная его особенность в моей задаче – решать всё скриптами. Дай задачу «привести 55 файлов к единому виду», и он напишет скрипт, который пройдёт по корпусу регуляркой. Быстро, красиво, и корпус после этого лежит в руинах.

Однажды прошлись так по всему корпусу: сняли игровую механику, вычистили шапки всех 55 сценариев, добавили блоки локаций, проставили ссылки. По проверкам всё выглядело безупречно – check_screenplay.py чисто по всем 55 сериям, сводный audit_corpus.py показал ноль ошибок.

Чуть позже я полез смотреть, что там на самом деле:

  • 7121 вики-ссылка формата [[slug]], не работающая нигде, кроме Obsidian;

  • 504 места, где идентификатор карточки въелся в текст вместе с падежным окончанием – «выставляет перед собой [[publiy]]я», «призрак [[kay-yudor]]а»;

  • логлайн и синопсис отсутствуют в 30 сериях из 55, блок вычитки задвоен в 14, а заголовок открытых вопросов написан шестью разными способами.

Все проверки зелёные

Все проверки зелёные

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

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

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

Главная метрика качества у меня – покрытие: сколько реплик транскрипта не попало ни в один блок сценария, норма ноль. Скрипт при этом считает диапазоны, а не содержание. И когда закрывался долг по покрытию, часть дыр оказалась заткнута тем, что диапазон соседней сцены просто растянули на пропущенный кусок. Формально всё безупречно: разрывов ноль, метрика зелёная. Фактически материал не разобран, он просто попал внутрь чужих границ.

Цена вопроса: 338 сцен в 40 сериях из 55 объявляют диапазон, но не разбирают его. Это около 4469 реплик, полторы-две серии текста, которые числятся сделанными.

Метрика закрыта, работа нет

Метрика закрыта, работа нет

Злого умысла тут нет. Модель не саботирует задачу, она честно оптимизирует то, что измеряется. Если метрику можно закрыть, не делая работу, рано или поздно она будет закрыта именно так.

Чтение глазами тут же нашло то, чего не видела ни одна проверка. На одном только ep01, который считался готовым и проходил все проверки чисто: сцена приписывала умирающему Хальду пересказ разговора, которого он не вёл (к Ригору Зару ходил Игдрас), три пары сцен дублировали друг друга, комнату запирала не та героиня, а метка «спорное место» стояла на слове, которое игрок сам поправил в следующей же реплике.

Дальше – ручная вычитка

В итоге я залил в Google Drive 376 документов – сценарии, события, персонажи, локации, предметы и сам пересказ на ручную вычитку и корректировку, и вычитывают её фанаты «Грядут приключения» – энтузиасты, которые знают сериал лучше любой модели.

Итого

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

И вот тут главный вывод, который отвечает ровно на то, с чего всё начиналось. Я лез в проект с мыслью избавить ребят от месяцев ручной расшифровки. Избавил – но не от работы. Восемь дней машинного разбора превратились в две недели вычитки: люди сейчас читают то, что собрала модель, и правят за ней хвосты, которые я не выловил.

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

Промежуточный результат лежит открыто, можно полистать: github.com/daniiomir/gryadut_archipelago_plot.

Сам сериал вот, вдруг кому зайдёт: «Архипелаг» на ютубе.

Про такие вот мои задротские хобби и вообще про айти и дс пишу в телеге – @tiredcode.

Автор: daniiomir

Источник