Как сделать так, чтобы слова в субтитрах ASS появлялись по одному? - PullRequest
0 голосов
/ 10 марта 2020

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

Что я имею в виду, это то, что слово появится, потом другое рядом появится слово и так далее. В конце концов линия очистится, затем повторите.

Пример:

A video shows a person speaking about chess. Subtitles at the bottom of the screen say “winning”. Moments later, the subtitles change to “winning a”, then “winning a piece”, later “winning a piece now” and so on. Each consecutive word instantly appears in whole, but each word only appears when the speaker says it.

Я думал, что смогу создать Усовершенствованную подстанцию ​​Альфа файл, в котором субтитры имеют одинаковое время окончания, но разное время начала, однако FFMPEG, похоже, не очень хорошо справляется при рендеринге файла:

[Script Info]
; Script generated by FFmpeg/Lavc57.107.100
ScriptType: v4.00+
PlayResX: 384
PlayResY: 288

[V4+ Styles]
Format: Name, Fontname, Fontsize, PrimaryColour, SecondaryColour, OutlineColour, BackColour, Bold, Italic, Underline, StrikeOut, ScaleX, ScaleY, Spacing, Angle, BorderStyle, Outline, Shadow, Alignment, MarginL, MarginR, MarginV, Encoding
Style: Default,Arial,16,&Hffffff,&Hffffff,&H0,&H0,0,0,0,0,100,100,0,0,1,1,0,2,10,10,10,0

[Events]
Format: Layer, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text
Dialogue: 0,0:00:00.00,0:00:03.46,Default,,0,0,0,,I'm
Dialogue: 0,0:00:01.00,0:00:03.46,Default,,0,0,0,,a
Dialogue: 0,0:00:01.50,0:00:03.46,Default,,0,0,0,,subtitle

Идея в том, что появится I'm затем через 1 секунду рядом с ним появится a, а через полсекунды subtitle

1 Ответ

2 голосов
/ 11 марта 2020

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

Несколько событий с повторяющимся текстом

Чтобы добавить слова в та же строка , вам нужно остановить предыдущее событие диалога, когда должно появиться следующее слово, и повторить весь видимый текст в следующем событии диалога:

Dialogue: 0,0:00:00.00,0:00:01.00,Default,,0,0,0,,I'm
Dialogue: 0,0:00:01.00,0:00:01.50,Default,,0,0,0,,I'm a
Dialogue: 0,0:00:01.50,0:00:03.46,Default,,0,0,0,,I'm a subtitle

В случае центра- или (для языков, написанных слева направо) текст, выровненный по правому краю, или, если ваш текст слишком длинный, он автоматически оборачивается и отображается в несколько строк, вам нужно будет каждый раз указывать весь текст, чтобы вычисления выравнивания и переноса работайте одинаково для каждого события, но сделайте пока невидимую часть текста фактически невидимой, сделав его полностью прозрачным:

Dialogue: 0,0:00:00.00,0:00:01.00,Default,,0,0,0,,I'm {\alpha&HFF}a subtitle
Dialogue: 0,0:00:01.00,0:00:01.50,Default,,0,0,0,,I'm a {\alpha&HFF}subtitle
Dialogue: 0,0:00:01.50,0:00:03.46,Default,,0,0,0,,I'm a subtitle

Так обычно и делается.

Одиночное событие с тегами переопределения

В качестве альтернативы, если ваш текст не имеет рамки / контура и тени (не в вашем примере видео), вы Вы можете использовать караоке-теги ASS, установив полностью прозрачный цвет текста (SecondaryColour):

Dialogue: 0,0:00:00.00,0:00:03.46,Default,,0,0,0,,{\2a&HFF\k100}I'm {\k50}a {\k196}subtitle

Если у вас есть рамка или тень (как в примере видео), простого караоке недостаточно, так как вы также хотите изменить цвет рамки / тени. Вы можете сделать это, используя обобщенный c тег анимации ASS \t:

Dialogue: 0,0:00:00.00,0:00:03.46,Default,,0,0,0,,I'm {\alpha&HFF\t(1000,1000,\alpha0)}a {\alpha&HFF\t(1500,1500,\alpha0)}subtitle

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

Предупреждение о тексте справа налево

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

Если вы попробуете любой из этих подходов с текст справа налево (например, арабский c или иврит), кроме первого, самого простого подхода, который не имеет переопределенных тегов, вы обнаружите, что VSFilter и libass, два основных средства визуализации ASS, отображают текст по-разному: libass будет использовать тот же порядок слов, как если бы у вас была одна строка без каких-либо тегов, но VSFilter будет разбивать текст на теги переопределения и переупорядочивать разделы так, чтобы более ранние разделы всегда находились в слева более поздних разделов.

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

Там в настоящее время нет правильного «решения» для этого, но вы можете обойти разн Вставка двунаправленных управляющих символов Unicode вокруг тегов переопределения, чтобы libass соответствовал порядку VSFilter (который является , а не естественным порядком текста) и заставлял любую пунктуацию начала / конца строки быть справа налево.

Конечно, если вы записываете только субтитры, не намереваясь распространять файл субтитров, вам не нужно беспокоиться о том, как они выглядят в других средствах визуализации. FFmpeg использует libass. Тем не менее, возможно, что поведение libass будет скорректировано, чтобы соответствовать VSFilter в какой-то момент в будущем, поскольку VSFilter традиционно занимал самую большую долю рынка (начиная с того времени, когда libass даже не существовало) и большинство, если не все, Араби c Файлы субтитров, которые существуют на самом деле, полагаются на неправильную обработку текста справа налево и требуют, чтобы он выводил корректно.

...