MAKO, мой конвейер для автогенерации коротких видео, уже работал, и три этапа системы были пройдены. Ролик генерируется, публикуется, всё вроде бы здорово, ровно до того момента, пока я не сел смотреть результат своими глазами.
А каждый ролик заканчивался 5-12 секундами чёрного экрана с тишиной, и при целевой длине 15-20 секунд это треть хронометража, который просто уходит в никуда. Публиковать такое нельзя, тут даже обсуждать нечего.
Вечер: «текст крутой, но всё остальное — дерьмо»
26 марта, 20:49. Сгенерировал ролик по референсу, текст вышел нормальный, а дальше: «текст крутой, но динамики ни в голосе нет, ни в кадрах». Голос читает как диктор на вокзале, картинка стоит мёртвая.
21:01, следующая попытка, и снова: «Секунд 10-12 чёрный хвост. Текст без интонаций.» Ролик на 15 секунд, из которых последние 10 — это чёрный экран и тишина, и вот это уже не мелочь, которую можно списать.
Первая мысль была простая: может, ElevenLabs так плохо генерирует, может, аудио приходит с мусором на конце? И я полез копать, потому что без этого никак.
Диагноз: storyboard не знает сколько длится аудио
21:36. Попросил Claude Code пофиксить чёрный экран, и не помогло — «всё то же самое, 6 секунд чёрный хвост». Если вы хоть раз занимались вайбкодингом, вы знаете это чувство, когда модель чинит симптом, а не причину.
А проблема, как выяснилось, была архитектурной: storyboard нарезал видеоклипы на фиксированное время, не зная сколько реально длится аудио. Звук заканчивался на 13-й секунде, а видео было нарезано на 20, и вот эти оставшиеся 7 секунд и превращались в чёрный экран на каждом ролике.
Storyboard должен знать длительность аудио и покрывать ровно это время. Не больше, не меньше, и никаких «примерно».
Утро: SSML, подписка и голос блогера
27 марта, 07:35. TTS без разметки читает текст монотонно, без пауз, без акцентов, без ритма, и решение тут одно — SSML-теги: `
09:25. Купил подписку ElevenLabs, потому что лимиты на бесплатном тарифе кончались, да и подписка открывала клонирование голоса, а без него всю эту затею с голосом блогера можно было даже не начинать.
09:47. Новое видео, и снова: «Хук чувствуется, боль, CTA — отлично.» Контент работает, всё ок, но: «Опять чёрный хвост.» Тот же баг, потому что первый фикс попал мимо корня проблемы.
Два фикса подряд. И наконец заработало
10:35. Переписана обработка пауз через SSML, и голос сразу стал звучать живее: паузы между предложениями, акценты на ключевых словах. «Голос звучит намного лучше.» Разница слышна с первой секунды.
11:28. Второй заход на чёрный хвост, и тут уже переделана сама синхронизация: теперь конвейер сначала генерирует аудио, замеряет длительность, и только потом storyboard нарезает видеоклипы ровно под это время. Никаких «примерно 20 секунд», только точное время до миллисекунды.
Результат: «вот это уже заебись, любой длины аудио/видео — всё будет хорошо.»
Раньше видео нарезалось до аудио, а теперь после, и всё, простое изменение порядка двух шагов, но без него результат был сломан каждый раз.
Субтитры и музыка за 45 минут
11:30. Субтитры встроены — текст из сценария накладывается поверх видео, синхронизированный с аудио.
12:06. Фоновая музыка: тихий трек под голос, громкость подобрана так, чтобы не забивать речь.
12:16. «Нормуль, к чему переходим дальше?» Этап закрыт.
Почему это вообще случилось
Вот тут и есть тот самый узкий угол, на котором стоит притормозить. В монолитном скрипте такая проблема была бы очевидна сразу, потому что время аудио передаётся переменной, всё лежит в одном месте, и дыру видно глазами. А в модульном конвейере, который я и собираю как ии для автоматизации всей рутины с роликами, каждый шаг автономен, и данные между ними нужно передавать явно, так что пропустил один параметр — и получил 7 секунд чёрного экрана на каждом ролике, и никто тебе об этом не скажет — ровно как с тестами, которые зелёные, а экран пустой.
TTS без SSML-разметки — это чтение по бумажке, а с разметкой уже ближе к живой речи. Не идеал, конечно, но это разница между «невозможно слушать» и «нормально», а на дистанции она и решает.
Итог за 16 часов
- С вечера 26 марта до обеда 27-го:
- Чёрный хвост пофикшен через синхронизацию аудио и видео по реальной длительности
- Интонация улучшена через SSML-теги
- Куплена подписка ElevenLabs, открыто клонирование голоса
- Субтитры встроены в конвейер
- Фоновая музыка добавлена
Арка MAKO: прототип за 2 дня → система из 3 этапов → борьба за качество. И знаете, когда такую штуку оркестрируешь через Claude Code, связкой ai агентов, а не пишешь руками строчку за строчкой, корневой баг прячется не в синтаксисе, а в стыках между шагами, и ловить его надо именно там. Конвейер работает, и теперь вопрос уже не «как сгенерировать ролик», а «как сделать так, чтобы его хотелось досмотреть».
Следующий пост: 20 аккаунтов, 0 просмотров