[FAQ] Можно ли в "Балаболке" создать видеофайл?

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

Модератор: balabolka

Ответить
Аватара пользователя
balabolka
V.I.P.

[FAQ] Можно ли в "Балаболке" создать видеофайл?

#1

Сообщение balabolka » 27 июн 2018 15:29

Можно ли в программе "Балаболка" создать видеофайл, в котором аудиофайл с записанной речью стал бы звуковой дорожкой, а видеодорожка представляла собой текст, синхронизированный с речью?


Нет, в программе такая функция отсутствует. Для этого пришлось бы добавить в программу возможности видеоредактора; также, потребуется установка кодека для сжатия видео (Xvid, DivX, x264 или другого). Есть более простой способ получить то, что необходимо.

Можно для каждого звукового файла создать файл в формате SRT (файл субтитров) или файл в формате LRC (файл текста с метками синхронизации с аудиофайлом). Для этого необходимо изменить настройки создания звуковых файлов при помощи пункта главного меню "Настройки | Аудиофайлы" (вкладка "LRC, SRT"). Звуковой файл можно воспроизвести несколькими способами:
  • в программе-видеоплеере, используя файл формата SRT (например, The KMPlayer или VLC Media Player);
  • в аудиоплеере, используя файл формата LRC (например, Foobar2000 с плагином Lyric Show Panel 3);
  • в программе для караоке, используя файл формата LRC (например, KaraFun Player).

Аватара пользователя
balabolka
V.I.P.

[FAQ] Можно ли в "Балаболке" создать видеофайл?

#2

Сообщение balabolka » 29 ноя 2018 17:08

Так как посетители форума заинтересовались возможностями библиотеки FFmpeg, то самое время вернуться к этому часто задаваемому вопросу. Программа "Балаболка" по-прежнему не может сама создать видеофайл с речью и текстом, но она способна генерировать главное - звуковой файл и файл субтитров; всё остальное сделает утилита ffmpeg.exe.


Как создать видеофайл с речью
Чтобы создать файл со звуковой дорожкой, достаточно подготовить заранее один кадр. Например, это будет черный прямоугольник, рисунок в формате PNG. Для тестов я использовал файл INPUT.PNG размером 800x450. Также, создал в "Балаболке" звуковой файл INPUT.WAV с речью и файл субтитров INPUT.SRT. Для того, чтобы "Балаболка" создавала субтитры для звукового файла, надо активировать настройку "Создавать файл формата SRT" (пункт главного меню "Настройки | Аудиофайлы", вкладка "LRC, SRT"). Рекомендуется сохранять файл субтитров в кодировке UTF-8.

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

Не стал разбираться, что не так с указанными мной параметрами, а решил проблему по-другому: раз одного уникального видеокадра мало, надо подавать на вход FFmpeg два видеокадра. Создал анимированный GIF-файл с двумя одинаковыми кадрами - черные прямоугольники сменяют друг друга через короткие промежутки времени в бесконечном цикле. И уже именно файл INPUT.GIF стал основой для создания видеодорожки.

Команда на создание видеофайла выглядит так:

Код: Выделить всё

ffmpeg -ignore_loop 0 -i input.gif -i input.wav -shortest -y input.mp4
► Показать
В качестве звуковой дорожки можно использовать файл формата WAV, так как FFmpeg сама выполнит перекодирование аудиоданных с помощью встроенного кодека.

Если нет необходимости просматривать сообщения, выдаваемые утилитой FFmpeg, можно отключить показ служебной информации с помощью параметров -v quiet или -loglevel panic:

Код: Выделить всё

ffmpeg -ignore_loop 0 -i input.gif -i input.wav -shortest -y -v quiet input.mp4
На этом можно было и остановиться: создан видеофайл с речью и пустым черным прямоугольником в качестве видео. Достаточно положить файл субтитров рядом с видеофайлом на диске, и любой современный видеоплеер сможет показать текст при воспроизведении видео. А можно "упаковать" субтитры внутрь видеофайла.

Есть два способа хранить текстовые субтитры внутри видеофайла:
  1. "Вшить" субтитры внутрь видеокадров (это называется "вшитые" или "жёсткие" субтитры, "хардсаб"); субтитры станут частью рисунка видеокадра.
  2. Вставить субтитры внутрь файла MKV, и они станут отдельной "дорожкой" (это называется "программные" или "мягкие" субтитры).
Утилита FFmpeg позволяет создать оба вида субтитров в видеофайле.


Как создать видеофайл с "вшитыми" субтитрами
Можно использовать BAT-файл со следующими командами:

Код: Выделить всё

ffmpeg -ignore_loop 0 -i input.gif -i input.wav -shortest -y input.mp4
ffmpeg -i input.mp4 -vf subtitles=input.srt:force_style='Alignment=10,FontName=Tahoma,FontSize=30' -y output.mp4
del input.mp4
► Показать
Такие субтитры хороши тем, что не требуют от видеоплеера никаких дополнительных усилий для показа. Но и качество изображения будет не идеальным, так как при кодировании видео могут возникнуть "артефакты".


Как создать видеофайл с дорожкой субтитров
Пример BAT-файла:

Код: Выделить всё

ffmpeg -ignore_loop 0 -i input.gif -i input.wav -shortest -y input.mp4
ffmpeg -i input.srt input.ass
ffmpeg -i input.mp4 -f ass -i input.ass -map 0:0 -map 0:1 -map 1:0 -c:v copy -c:a copy -c:s copy -disposition:s:0 default -y output.mkv
del input.mp4
del input.ass
► Показать
Как можно заметить, будет выполнено преобразование субтитров из формата SRT в формат ASS. Это необязательная процедура, но я рекомендую ее осуществлять. Формат SRT - очень простой, он содержит лишь текст и метки времени. Формат ASS обладает значительно большими возможностями; подробнее о нем можно прочитать, например, здесь. Получив файл субтитров в формате ASS, можно изменить оформление субтитров так, как Вам захочется, перед вставкой в видеофайл.

Обращаю Ваше внимание, что я привел лишь самые общие примеры команд для создания видеофайлов. Можно значительно расширить их: использовать различные кодеки или изменять настройки для того, чтобы добиться лучшего качества или меньшего размера видеофайла. Кодирование файла выполняется достаточно медленно, так что можно экспериментировать с многочисленными параметрами, чтобы ускорить этот процесс (с описанием параметров можно ознакомиться в документации FFmpeg). Также, можно бесконечно заниматься изменением оформления субтитров (черные буквы на белом фоне, белые буквы на черном фоне, логотип в углу экрана, размер букв, шрифт и т.д.). Удачи в поисках наилучшего варианта.

Аватара пользователя
Lecron
Обыватель

[FAQ] Можно ли в "Балаболке" создать видеофайл?

#3

Сообщение Lecron » 30 ноя 2018 14:38

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

Код: Выделить всё

ffmpeg -f lavfi -i color=c=black:s=640x480 -i input.wav -i input.srt -c:v libx264 -tune stillimage -pix_fmt yuv420p -shortest  -c:a aac -b:a 128k out.mkv
Впрочем, если из команды выкинуть -i test.srt, то слияние видео с аудио произойдет корректно. А субтитры прилепить потом.
Кстати, кодек лучше указывать явно. Тогда сразу можно будет указать профиль stillimage, который в случае слайдшоу самый значимый.


Отправлено спустя 18 минут 41 секунду:
Чтобы кодирование выполнялось быстро, практически на скорости кодирования аудио, можно указать параметр fps

Код: Выделить всё

ffmpeg -f lavfi -i color=c=black:s=640x480 -i test.wav -vf fps=1 -c:v libx264 -tune stillimage -pix_fmt yuv420p -shortest  -c:a aac -b:a 128k out.mkv
На стареньком i5 скорость достигла 90x (в 90 раз быстрее продолжительности аудио-трека)

Аватара пользователя
balabolka
V.I.P.

[FAQ] Можно ли в "Балаболке" создать видеофайл?

#4

Сообщение balabolka » 01 дек 2018 12:33

Спасибо за примеры команд, это упрощает процесс создания видеофайла.
Lecron писал(а):
30 ноя 2018 14:57
Чтобы кодирование выполнялось быстро, практически на скорости кодирования аудио, можно указать параметр fps
Да, в этом и заключается загвоздка: если кодируем видео с одним кадром в секунду, то, например, смена текста "вшитых" субтитров может происходить только один раз в секунду. А в файле субтитров указаны доли секунды, для более точного перехода от одной строки субтитров к другой.

Поэтому надо искать баланс: частота кадров в секунду должна быть такой, чтобы кодирование шло быстро, но и чтобы строки субтитров сменяли друг друга синхронно с речью. FPS=1, скорее всего, мало, FPS=25 много; надо искать середину (если нужны "вшитые" субтитры, "хардсаб").

Аватара пользователя
Lecron
Обыватель

[FAQ] Можно ли в "Балаболке" создать видеофайл?

#5

Сообщение Lecron » 01 дек 2018 15:01

Кстати, а не хотите внести опцию в программу, подпирающую костылем глюк ffmpeg-a? Я правда немного неверное его описал. ffmpeg не игнорирует последнюю позицию субтитров, а берет продолжительность ролика не из тайминга завершения показа, что логично, а из тайминга начала. Т.е. просто нужно добавить фейковую запись а-ля
► Показать

Ответить

Вернуться в «Балаболка»