Когда дети смотрят иллюстрированные книги, они часто подолгу рассматривают одну картинку. Двигаются ли листья? Что находится в банке в лапках маленькой лисы? Нашёл ли тот светлячок потом дорогу домой?

Если слегка заставить ушки на картинке подрагивать, позволить лунному свету медленно опуститься в банку и добавить одну мягкую фразу закадрового текста, у истории появится ещё один способ рассказа.

Такой анимированный иллюстрированный журнал можно использовать для сказок на ночь, показа коротких историй на уроках, а также для пробного создания раскадровки детской анимации. В нём не обязательно должны быть сложные движения. Если картинка приятная, персонаж остаётся последовательным от сцены к сцене и ребёнок может понять историю, следя за ней, — это уже неплохое начало.

На этот раз мы с помощью Ace Data Cloud Studio и GPT Image 2.6 сделаем маленькую историю — «Маленькая лиса одалживает лунный свет». Сначала нарисуем историю, затем заставим картинки двигаться и в конце добавим звук, превратив всё в видео, которое можно воспроизвести.

Иллюстрация к истории «Маленькая лиса одалживает лунный свет»

История не должна быть длинной — сначала расскажите её понятно

Одной лунной ночью маленькая лиса встретила заблудившегося светлячка. В лесу было слишком темно, и светлячок не мог найти дорогу домой. Маленькая лиса подняла стеклянную банку и одолжила у луны немного света, чтобы проводить его через лес обратно к друзьям. Перед уходом маленькая лиса помахала лапкой и не забыла поднять голову, чтобы поблагодарить луну.

Эта история короткая, но в ней есть встреча, помощь и прощание. Если использовать её для четырёхкадрового журнала, как раз получится рассказать всё полностью.

Мы открываем Ace Data Cloud Studio и пишем в диалоге, что хотим создать. Помимо самой истории, также нужно ясно описать стиль рисунка, персонажей и реквизит.

Ввод требований к созданию истории в Ace Data Cloud Studio

Можно описать так:

Пожалуйста, с помощью GPT Image 2.6 создай четырёхкадровый иллюстрированный журнал для истории «Маленькая лиса одалживает лунный свет», порядок чтения — верхний левый, верхний правый, нижний левый, нижний правый кадры, в которых соответственно показаны встреча, заимствование света, путь вместе и возвращение домой. Используй нежный стиль рисованной акварели, сохрани текстуру бумаги. Внешность маленькой лисы, цвет её шарфа и стеклянная банка должны оставаться одинаковыми на всех четырёх иллюстрациях. В лесу должны преобладать мягкие тёмно-синие и серо-зелёные оттенки, а лунный свет и свет в банке должны быть переданы тёплым золотистым цветом, не слишком ярким. На изображениях не должно быть текста, облачков с репликами и водяных знаков.

Здесь есть одна очень практичная привычка: сначала определить персонажа и стиль рисунка, а затем распределить, что происходит в каждом кадре. Иначе отдельные картинки могут выглядеть хорошо, но вместе они будут похожи на четыре разные истории.

Сначала сделайте четыре кадра и проверьте, плавно ли идёт история

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

Распределение содержания четырёхкадровой истории в Studio

Если нужно сделать более длинную историю, можно разделить «путь вместе». Например, сначала пройти мимо ручья, затем пройти через корни деревьев и в конце увидеть мерцающие огоньки в дупле. Каждая иллюстрация рассказывает только об одном действии, и так позже удобнее планировать анимацию и озвучивание.

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

Четырёхкадровый иллюстрированный журнал «Маленькая лиса одалживает лунный свет»: встреча, заимствование света, путь вместе, возвращение домой

Следующая картинка — четырёхкадровый иллюстрированный журнал, использованный в исходной демонстрации. GIF и скрипт композиции далее в статье продолжают использовать этот набор демонстрационных материалов, чтобы их было удобно воспроизвести напрямую; новая иллюстрация выше используется для показа истории, не смешивайте два набора материалов, считая их одним и тем же набором исходных кадров анимации.

Четырёхкадровый иллюстрированный журнал, использованный в исходной демонстрации

Достаточно немного оживить картинку

После подготовки исходных иллюстраций мы продолжаем и просим Studio написать динамические Prompt для четырёх фрагментов.

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

Следующая версия подсказок дополняет фрагмент «возвращение домой» и также ясно описывает связь между каждой исходной иллюстрацией и соответствующей анимацией:

四段 GIF 的动态 Prompt

通用约束:沿用对应原画的人物、围巾、玻璃罐和水彩纸纹;固定镜头,只做小幅动作,不新增角色,不出现文字,首尾尽量衔接。每段只使用指定的一格原画,并扩展为单幅画面,不要把整张四宫格一起做成动画。

相遇
选取左上格并扩展为单幅画面。狐狸轻轻低头,耳朵微动;叶片上的萤火虫缓慢明灭,周围草叶轻晃。保持狐狸身体比例与背景构图稳定。

借光
选取右上格并扩展为单幅画面。狐狸保持举罐姿势,细柔月光缓缓流入玻璃罐,罐内金光轻柔起伏。玻璃罐的形状保持不变,光线柔和,不出现强烈闪烁。

同行
选取左下格并扩展为单幅画面。狐狸小步行走,围巾与尾巴轻摆,提罐略微晃动;萤火虫在罐旁漂浮,背景保持稳定。动作幅度小,尽量形成自然循环。

回家
选取右下格并扩展为单幅画面。狐狸缓缓挥手,树洞旁已有的萤火虫小范围盘旋,地面的月光轻柔起伏,草叶微微摇动。保持树洞、玻璃罐和狐狸的位置基本稳定,结尾自然回到接近开头的姿态。

Далее в Studio чётко укажите: используйте функцию GIF-анимации GPT Image 2.6, отдельно сгенерируйте эти четыре фрагмента и верните соответствующие GIF-файлы.

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

Ниже приведены четыре GIF, сгенерированные в исходной демонстрации.

Встреча

Встреча: маленький лисёнок замечает заблудившегося светлячка

Одолжить свет

Одолжить свет: маленький лисёнок поднимает стеклянную банку, чтобы поймать лунный свет

Вместе в пути

Вместе в пути: маленький лисёнок несёт лунный свет и сопровождает светлячка через лес

Возвращение домой

Возвращение домой: светлячок возвращается к своим друзьям, а маленький лисёнок машет на прощание

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

Озвучка должна быть похожа на рассказ перед сном, не нужно читать слишком насыщенно

После того как изображения оживут, мы продолжаем вводить в Studio требования к озвучке. Генерируйте четыре части закадрового текста отдельно — так потом будет проще сопоставить их с соответствующими изображениями.

Ввод требований к закадровой озвучке в Studio

Можно сказать так:

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

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

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

Наконец, локально соберите иллюстрированную книгу в видео

Материалы готовы — теперь попросим Studio подготовить скрипт сборки FFmpeg, а затем запустим его на локальном компьютере.

Этот скрипт создаст горизонтальную двухстраничную иллюстрированную книгу: слева будут название главы и текст истории, справа будет воспроизводиться GIF. Четыре страницы соединяются в порядке сюжета и сопровождаются соответствующей закадровой озвучкой.

Перед запуском необходимо установить FFmpeg и изменить FONT на путь к реально существующему китайскому шрифту на компьютере. FFmpeg также должен поддерживать используемые в скрипте фильтр drawtext, кодирование H.264 и кодирование AAC. Скрипт подходит для запуска в Bash в Linux, macOS или среде Windows WSL; не вставляйте его напрямую в PowerShell.

Ниже сохранены ссылки на демонстрационные материалы, а имя выходного файла и названия страниц унифицированы как «Маленький лисёнок одалживает лунный свет». Это скрипт для локального запуска; данная статья не выполняет его локально вместо читателя.

bash <<'BASH'
set -euo pipefail

# ===== Изменяйте только здесь =====

GIF1="https://cdn.acedata2.cloud/gpt-image/d8d0bdffeb50f57fa700e3b0e973541e62361c1bce243f795c66b12c27a79ada.gif"
GIF2="https://cdn.acedata2.cloud/gpt-image/2361e32502087a5d14a1030ec26c94bade43ad7abddff7f51294ae70cffabd03.gif"
GIF3="https://cdn.acedata2.cloud/gpt-image/c9091c98a64df06baecc7be2e5bb4b7521deff9caa3a0f67bca46c5409b92133.gif"
GIF4="https://cdn.acedata2.cloud/gpt-image/e6f322e1dea87af933a00e6053166cd5ce2f9a7ab59358c37f7b79d3b0126885.gif"

# Путь к китайскому шрифту, измените в соответствии с фактической ситуацией:
# Пример для Linux: /usr/share/fonts/opentype/noto/NotoSerifCJK-Regular.ttc
# Пример для macOS: /System/Library/Fonts/PingFang.ttc
FONT="/usr/share/fonts/opentype/noto/NotoSerifCJK-Regular.ttc"

OUTPUT="Маленькая_лиса_одолжила_лунный_свет.mp4"

# ===== Четыре готовые озвучки =====

AUDIO1="https://platform2.cdn.acedata.cloud/fish/bb9140fc-c0c5-4397-995c-5a4eba813ef6.mp3"
AUDIO2="https://platform2.cdn.acedata.cloud/fish/ffe157ea-7fc4-422c-b153-e3bdb7db59ad.mp3"
AUDIO3="https://platform2.cdn.acedata.cloud/fish/2eb05b03-e833-48b9-9373-38b4c6a6456c.mp3"
AUDIO4="https://platform2.cdn.acedata.cloud/fish/429392ee-4012-4775-b1d9-fec7b88ddf1f.mp3"

command -v ffmpeg >/dev/null || {
  echo "Сначала установите FFmpeg"
  exit 1
}

[[ -f "$FONT" ]] || {
  echo "Не удаётся найти китайский шрифт, измените FONT: $FONT"
  exit 1
}

gifs=("$GIF1" "$GIF2" "$GIF3" "$GIF4")
audios=("$AUDIO1" "$AUDIO2" "$AUDIO3" "$AUDIO4")

titles=("Встреча" "Одолжить свет" "Вместе в пути" "Возвращение домой")
lines1=(
  "В лунном свете маленькая лиса встретила"
  "Маленькая лиса одолжила у луны"
  "Он нёс лунный свет, сопровождая маленького светлячка"
  "Светлячок вернулся к своим друзьям"
)
lines2=(
  "маленького заблудившегося светлячка。"
  "мягкий огонёк。"
  "вместе прошли через лес。"
  "Маленькая лиса тоже поблагодарила луну。"
)

# Фиксированная длительность каждой главы; оставшаяся часть после окончания озвучки остаётся тихой。
# Общая длительность: 19 секунд。Озвучка, превышающая длительность главы, будет обрезана。
durations=("5" "4.5" "4.5" "5")

inputs=()
filters=""

for i in 0 1 2 3; do
  vi=$((i * 2))
  ai=$((vi + 1))
  page=$((i + 1))
  d="${durations[$i]}"

  # Отключить внутреннюю метку зацикливания GIF, единообразно выполнять бесконечный цикл через stream_loop。
  inputs+=(
    -stream_loop -1 -ignore_loop 1 -i "${gifs[$i]}"
    -i "${audios[$i]}"
  )

  # Фоновое изображение книги: стол тёплого оттенка, двухстраничная бумага, корешок и текст слева。
  filters+="
color=c=0xD6C7B3:s=1920x1080:r=30:d=${d},
drawbox=x=72:y=64:w=1788:h=972:color=0xB6A38C:t=fill,
drawbox=x=60:y=50:w=900:h=970:color=0xFFF9EE:t=fill,
drawbox=x=960:y=50:w=900:h=970:color=0xFFF9EE:t=fill,
drawbox=x=940:y=50:w=20:h=970:color=0xE2D6C3:t=fill,
drawbox=x=960:y=50:w=12:h=970:color=0xEFE5D5:t=fill,
drawbox=x=150:y=320:w=110:h=4:color=0xB28A60:t=fill,
drawtext=fontfile='${FONT}':text='小狐狸借月光':x=150:y=155:fontsize=28:fontcolor=0x927A60,
drawtext=fontfile='${FONT}':text='${titles[$i]}':x=150:y=235:fontsize=64:fontcolor=0x493A2C,
drawtext=fontfile='${FONT}':text='${lines1[$i]}':x=150:y=400:fontsize=36:fontcolor=0x685846,
drawtext=fontfile='${FONT}':text='${lines2[$i]}':x=150:y=465:fontsize=36:fontcolor=0x685846,
drawtext=fontfile='${FONT}':text='${page} / 4':x=150:y=910:fontsize=24:fontcolor=0xA28D76
[book${i}];

[${vi}:v]
setpts=PTS-STARTPTS,
fps=30,
scale=780:800:force_original_aspect_ratio=decrease:force_divisible_by=2,
setsar=1,
format=rgba
[gif${i}];

[book${i}][gif${i}]
overlay=x='1020+(780-overlay_w)/2':y='130+(800-overlay_h)/2':shortest=1,
trim=duration=${d},
setpts=PTS-STARTPTS,
format=yuv420p
[v${i}];

[${ai}:a]
asetpts=PTS-STARTPTS,
aresample=48000,
aformat=sample_fmts=fltp:channel_layouts=stereo,
apad,
atrim=duration=${d},
asetpts=PTS-STARTPTS
[a${i}];
"
done

filters+="
[v0][a0][v1][a1][v2][a2][v3][a3]
concat=n=4:v=1:a=1[vout][aout]
"

# Один запуск: объединить все страницы книги, анимации и озвучку。
ffmpeg -hide_banner -y \
  "${inputs[@]}" \
  -filter_complex "$filters" \
  -map "[vout]" \
  -map "[aout]" \
  -c:v libx264 \
  -preset medium \
  -crf 18 \
  -pix_fmt yuv420p \
  -c:a aac \
  -b:a 192k \
  -ar 48000 \
  -movflags +faststart \
  "$OUTPUT"

printf '\nСоздано: %s\n' "$OUTPUT"
BASH

Этот скрипт устанавливает длительность четырёх страниц в 5 секунд, 4,5 секунды, 4,5 секунды и 5 секунд, всего 19 секунд. GIF будет повторяться до конца этой страницы; если озвучка короче, оставшаяся часть после неё будет тихой.

Следует особенно обратить внимание: если озвучка длиннее этой страницы, скрипт обрежет превышающую часть. При повторном создании озвучки сначала прослушайте её полностью, а затем решите, нужно ли увеличить durations; не переворачивайте страницу посреди рассказа только ради того, чтобы получилось 19 секунд.

Во время запуска требуется подключение к интернету для загрузки материалов. Если ссылка недоступна, можно сначала скачать GIF и MP3 локально, а затем изменить соответствующие переменные на пути к файлам. -y в скрипте перезапишет выходной файл с тем же именем; если готовый ролик уже существует, сначала укажите другое имя файла. Согласно записям, предоставленным в демонстрации, генерация материалов для этого примера стоит примерно 1 кредит. Это значение приведено только для справки в рамках данной демонстрации, не является фиксированным тарифом и не означает, что любое 19-секундное видео требует всего 1 кредит. Версия модели, размер кадра, качество, длительность озвучки и количество повторных попыток влияют на фактический расход; ориентируйтесь на списание, отображаемое в Studio. Этот последний шаг выполняется локально с помощью FFmpeg, а не является повторным вызовом облачного сервиса генерации видео.

Весь процесс на одной картинке

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

Studio помогает нам подготовить историю, оригинальные иллюстрации, GIF и материалы для озвучки; FFmpeg отвечает за размещение материалов как страниц книги, соединение звука и вывод MP4. Если разделить эти две части, то можно исправлять любую страницу, которая не устраивает.

Процесс создания: от замысла истории, оригинальных иллюстраций из четырёх кадров, GIF-анимации и закадровой озвучки до локальной сборки

Немного лунного света — и история рассказана

«Лисёнок одолжил лунный свет» — это история без множества персонажей и без шумных масштабных сцен. Она лишь позволяет маленькому лисёнку пройти часть пути рядом с заблудившимся светлячком.

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

Если вы тоже хотите попробовать, можно начать с небольшой истории из четырёх кадров. В Ace Data Cloud Studio чётко опишите стиль рисунка и персонажей, проверьте оригинальные иллюстрации, а затем постепенно добавляйте движения и звук. Сначала хорошо сделать короткую историю — так легче найти ощущение, которое вам нравится, чем сразу разворачивать длинное повествование.

Когда и изображение, и звук будут подходящими, переверните ещё несколько страниц. Так постепенно и создаётся маленькая иллюстрированная газета, которая движется.