До списку уроків
10 клас · Урок 7 з 16

AI-медіа: промпт, вага файлів, маніфест походження media.json

виконано0%
Крок 1

Що робимо сьогодні

Ти згенеруєш трек і відеофрагмент — і жоден із цих файлів не потрапить на сервер. На сервер поїде те, що дає їм цінність через рік: опис, транскрипт і маніфест походження.

Згенерувати щось сьогодні вміє будь-хто: три слова в поле — і за хвилину готовий трек. Складне починається пізніше. Через рік хтось питає: це зробив ти? А сам файл мовчить. У ньому немає ні автора, ні інструменту, ні згадки про людей у кадрі.

Відповідає маніфест походження — текстовий файл поруч із роботою. У нього ти записуєш усе під час роботи. Сьогоднішній урок про те, як написати його так, щоб він щось доводив.

І друга, дуже приземлена частина: вага. Медіа важить у сотні разів більше за текст. Саме тому воно взагалі не їде на спільний сервер. Ти порахуєш це сам, а не повіриш на слово.

Після уроку ти вмієш

Слова маніфест походження, бітрейт, C2PA і BOM поки нічого не означають. Дійдемо до кожного — після прикладу.

Що поїде на сервер

ФайлЩо в ньому
~/www/media/index.html сторінка-опис: назви, тривалості, підписи, транскрипт — без жодного вбудованого медіафайлу
~/www/media/media.json маніфест походження: для кожного твору file, tool, model, prompt, license, consent, duration_sec, size_mb
~/www/media/transcript.md текст пісні й покадровий опис відео
~/media-local/ лишається в тебе на комп'ютері: сам .mp3, сам .mp4, чернетки, невдалі дублі
Тека зветься за темою, не за номером уроку Практика лежить у ~/www/media/. Не шукай lesson-07: тема четверта, уроків у ній два, тека одна — наступного уроку ти доповниш цю саму.

Хід уроку

ЕтапХвЩо робиш
Межа «локально / сервер»10розбираєш, що куди їде і чому
Вага медіа15рахуєш у калькуляторі, звіряєш із ffprobe
Промпт як специфікація20генеруєш трек 30—90 с і відео 10—30 с
Маніфест походження20поля, ланцюг, конструктор media.json
Ліцензії вихідних матеріалів15дерево рішень і атрибуція
C2PA і транскрипт20чому метадані зникають і що лишається текстом
Здача й автоперевірка20FTP, чеклист до зеленого, показ учителю очно
Крок 2

Межа проходить по FTP-клієнту

Правило модуля не «не завантажуй великі файли». Воно жорсткіше: медіафайлів на сервері немає взагалі, і сервер стежить за цим сам

Уся генерація, стиснення, монтаж і перегляд відбуваються у тебе на комп'ютері, у теці ~/media-local/. VPS нічого не рендерить, не перекодовує і не роздає відео. Він публікує текст: розмітку, JSON і Markdown.

Учитель дивиться й слухає твої роботи очно, з твого екрана. Там же він звіряє справжню тривалість і розмір із тим, що ти написав у media.json. Тому прикрашати числа в маніфесті безглуздо: поруч буде відкритий ffprobe.

Що лишається на комп'ютері учня, а що їде на сервер Ліворуч тека media-local на комп'ютері: mp3, mp4, чернетки, історія промптів. Праворуч тека www/media на сервері: index.html, media.json, transcript.md. Між ними FTP-фільтр, який пропускає лише текстові розширення і файли до двох мегабайтів. Твій комп'ютер ~/media-local/ track.mp3 · 1.4 МБ clip.mp4 · 18 МБ clip-raw.mov · 240 МБ дублі 2—7, чернетки prompts.txt · історія показується вчителю очно, з твого екрана місце на диску — твоє власне FTP-фільтр ✓ .html .css ✓ .js .json ✓ .md .txt .svg ✕ .mp4 .mp3 ✕ понад 2 МБ VPS, спільний на 60+ акаунтів ~/www/media/ index.html · 14 КБ media.json · 3 КБ transcript.md · 6 КБ разом ≈ 23 КБ віддається по HTTP усьому світу квота 250 МБ — спільний ресурс критерій no_media перевіряє саме цю теку і ~/upload/ провал = урок не зараховано
Ваги файлів ліворуч — типовий порядок для 30-секундного треку й 20-секундного відео 1080p; праворуч — розмір текстової частини учнівської роботи. Точні числа своїх файлів ти отримаєш з ffprobe і ls -lh у кроці 4.
Заборонене розширення не «не рекомендується» — його просто немає Сервер відхиляє .mp4 .mov .avi .mkv .webm .mp3 .wav .flac і будь-який файл понад 2 МБ. Відмова приходить ще на FTP: файл не з'явиться в кабінеті, а клієнт покаже помилку. Якщо він усе-таки туди потрапив, роботу не приймуть — навіть коли сторінка бездоганна. Перевірка «на сервері немає медіафайлів» блокуюча, у списку критеріїв вона зветься no_media. Прибереш файл — заллєш ще раз, спроби не обмежені.
Питання

Однокласник каже: «Я стиснув відео до 1.8 МБ. Це менше за ліміт, отже заллю його в ~/www/media/ — хай учитель дивиться просто з сайту». Що йому відповісти?

Крок 3

Чому хвилина відео важить більше за весь твій сайт

Одна формула, яка пояснює все правило модуля: вага = бітрейт × тривалість ÷ 8

Бітрейт — це скільки біт даних припадає на секунду. Помножили на секунди, поділили на 8 (бо в байті 8 біт) — отримали байти. Усе. Ні кодек, ні «якість» не роблять тут магії: вони лише вирішують, який бітрейт потрібен, щоб картинка не розсипалася.

Візьмімо бітрейти, які YouTube рекомендує для завантаження. Для 1080p при 30 кадрах — 8 Мбіт/с. Для 720p — 5 Мбіт/с. Для 4K при 30 кадрах — від 35 до 45 Мбіт/с. Підставмо хвилину.

Що цеБітрейт1 хвилина20 секунд
Відео 4K, 30 к/с40 Мбіт/с300 МБ100 МБ
Відео 1080p, 30 к/с8 Мбіт/с60 МБ20 МБ
Відео 720p, 30 к/с5 Мбіт/с37.5 МБ12.5 МБ
Аудіо WAV 44.1 кГц / 16 біт / стерео1411 кбіт/с10.6 МБ3.5 МБ
Аудіо MP3 192 кбіт/с192 кбіт/с1.44 МБ0.48 МБ
Уся текстова частина твоєї сторінки0.03 МБ

Останній рядок і є суть. Три текстові файли роботи разом важать близько 30 КБ. Хвилина відео 1080p — 60 000 КБ. Різниця у дві тисячі разів. Побачити її на одній картинці майже неможливо. Саме тому нижче вона намальована чесно, без «умовного масштабу».

Вага текстової сторінки проти хвилини відео в реальному масштабі Смуга завдовжки 600 пікселів позначає 60 мегабайтів — хвилину відео 1080p. Хвилина MP3 при 192 кбіт/с займає на тій самій шкалі 14 пікселів. Уся текстова частина сторінки, 30 кілобайтів, — це смужка завширшки три десятих пікселя, тонша за волосину на екрані. Одна шкала: 600 пікселів = 60 МБ 1 хв відео 1080p · 8 Мбіт/с 60 МБ 1 хв аудіо MP3 · 192 кбіт/с 1.44 МБ — 14 пікселів index.html + media.json + transcript.md 30 КБ — 0.3 пікселя, тонше за лінію цієї стрілки 0 15 МБ 30 МБ 45 МБ 60 МБ щоб текстовий стовпчик доріс до відеостовпчика, таких сторінок треба 2000
Масштаб не порушено: смужка тексту справді має ширину 0.3 пікселя, тому її домальовано стрілкою — інакше її не було б видно взагалі. 30 КБ — реальний розмір текстової частини роботи цього уроку; 60 МБ — розрахунок за формулою для рекомендованого YouTube бітрейта 1080p30.

Звідси беруться квоти. Квота учня на цьому сервері — 250 МБ. У текстових файлах це тисячі сторінок і десятки уроків. У відео 1080p це 4 хвилини 10 секунд, і місце скінчилося — разом із усіма наступними уроками модуля.

МБ і МіБ — це різні числа Тут і далі МБ = 1 000 000 байтів (десяткові, так рахують бітрейти, диски й провайдери). Провідник Windows показує МіБ = 1 048 576 байтів, але підписує їх «МБ». Тому один і той самий файл там буде на ~4.6% «легшим». Наприклад, 60 МБ = 57.2 МіБ. Калькулятор нижче показує обидва числа, щоб ти не сперечався з Провідником.
Питання

Ти зняв 25-секундний ролик у 4K. Треба вкластися в 20 МБ: саме таку межу на розмір файлу ставить перевірка limits. Що дасть найбільший ефект першим кроком?

Крок 4

Калькулятор сховища

Покрути повзунки й подивись, де саме зникає квота. Усі числа рахуються тут, у браузері, за формулою з кроку 3

Скільки важить твій файл і скільки з'їв би весь клас

Вага одного файлу
20 МБ

= 19.1 МіБ у Провіднику Windows


Частка від квоти 250 МБ

висновок

Ціни в останніх двох рядках узяті з прайсу Amazon S3. Зберігання — $0.023 за ГБ на місяць, віддача в інтернет — $0.09 за ГБ у першому діапазоні. Наш VPS живе не в S3, тож це порядок величини, а не рахунок школи.

Але порядок показовий. За медіа платять не один раз при завантаженні. Платять щомісяця за зберігання і щоразу за кожен перегляд.

І головне: справжня причина правила модуля — не долари. Це одна спільна машина на три класи. Твої 20 МБ помножені на 60+ акаунтів і на 16 уроків — це вже гігабайти, які ніхто не дивиться після здачі.

перевір розрахунок на своєму файлі — Git Bash, macOS, Linux
$ ffprobe -v error -show_entries format=duration,size,bit_rate -of default=nw=1 clip.mp4 duration=20.033333 size=20514304 bit_rate=8192118 $ ls -lh clip.mp4 -rw-r--r-- 1 user user 20M … clip.mp4
PowerShell: два підводні камені одразу По-перше, ffprobe … > probe.txt у Windows PowerShell 5.1 запише файл у UTF-16, і будь-який чекер зламається. Пиши ffprobe … | Out-File -Encoding utf8 probe.txt. По-друге, && у PowerShell 5.1 не працює взагалі: замість mkdir media-local && cd media-local пиши mkdir media-local; if ($?) { cd media-local }.
Питання

У класі 24 учні. Кожен здає 20-секундне відео 1080p. Учитель пропонує «просто складати їх на сервер, місця ж вистачить». Порахуй у калькуляторі й скажи, що станеться з квотою 250 МБ.

Крок 5

Промпт — це специфікація, яку доведеться пред'явити

У 8 класі ти розбирав, як модель перетворює шум на зображення. Сьогодні промпт цікавить нас з іншого боку: як запис, за яким роботу можна повторити й перевірити

Різниця в одному слові. Промпт «зроби пісню про школу» дає результат — але нічого не доводить. За ним не відтворити ні настрою, ні аранжування, ні навіть мови вокалу. Промпт із параметрами — це технічне завдання: за ним і ти сам, і будь-хто інший отримає щось дуже схоже.

Музичний промпт: шість блоків

БлокЩо вказуєшПриклад
Жанрстиль, епоха, сценаsynth-pop, вплив 80-х
Настрійемоція, енергіясвітлий, трохи ностальгійний
Інструментищо звучить, що ведеаналоговий синт, електробас, живі барабани
Темп і тональністьBPM, мажор/мінор112 BPM, мінор
Вокалє/немає, стать, мова, манеражіночий вокал українською, без надриву
Структура і довжинакуплет—приспів, скільки секундінтро 8 с, куплет, приспів, аутро; разом 60 с

Відеопромпт: сім блоків

БлокЩо вказуєшПриклад
Сценамісце, час доби, погодашкільний коридор, ранок, сонце у вікнах
Суб'єктхто або що в кадріпаперовий літачок
Діящо відбувається за 10—30 сповільно летить повз шафки й зникає за поворотом
Камераплан, рух, оптикасередній план, плавний трекінг збоку
Світло і колірджерело, палітратепле контрове світло, теплі відтінки
Стильреференс не на людину, а на технікудокументальне відео, зернистість плівки
Форматтривалість, співвідношення сторін15 с, 16:9
Три речі, які роблять промпт відтворюваним Seed (якщо інструмент його показує) — число, яке задає початковий шум: той самий seed плюс той самий промпт дають той самий результат. Версія моделі — за пів року «та сама» модель поводитиметься інакше. Дата — бо версію оновлять і не скажуть. Записуй усі три відразу.
Чого в промпті бути не має Імен живих виконавців і акторів («голосом такого-то»), назв брендів, облич реальних людей із твого оточення. Це не питання смаку: наступного уроку ти розбиратимеш deepfake і згоду на образ, і почнеться він саме з твоїх сьогоднішніх файлів. Простіше не створювати проблему, ніж потім пояснювати її в полі consent.
prompts.txt — веди його з першої спроби, лишається локально
2026-09-02 14:10 | Suno v4.5 | спроба 1
synth-pop 80-х, світлий ностальгійний настрій, аналоговий синт,
електробас, живі барабани, 112 BPM, мінор, жіночий вокал українською,
структура: інтро 8 с / куплет / приспів / аутро, разом близько 60 с.
Без: реп-вставок, англійського вокалу, гітарного дисторшну.
→ дубль 1: занадто швидко, вокал перекриває бас

2026-09-02 14:19 | Suno v4.5 | спроба 2 (той самий промпт, 104 BPM)
→ дубль 3 — беремо. Далі обрізка й нормалізація гучності локально.
Питання

Через рік учитель просить: «Зроби ще один трек у тому самому настрої, що й торішній». У тебе збережено файл track.mp3 і рядок у маніфесті "prompt": "пісня про школу". Що саме ти вже не відтвориш?

Крок 6

Маніфест походження: що це доводить

Походження (provenance) — це відповідь на питання «звідки взявся цей файл і чиї сліди на ньому». Не одне поле, а ланцюг

Уяви картину в музеї. Поруч висить табличка: хто автор, у якому році написав, у кого картина зберігалася до музею. Саме така табличка й зветься походженням — англійською provenance.

У файлу такої таблички немає. clip.mp4 — це 20 мегабайтів і більше нічого. Ні автора, ні інструменту, ні згоди людей у кадрі. Табличку доводиться писати поруч, окремим файлом.

Поля, без яких маніфест не працює

ПолеЩо відповідаєЧому без нього погано
tool + model чим і якою версією зроблено «AI» — це не інструмент; без версії результат не повторити
prompt що саме ти попросив, дослівно переказ промпта своїми словами не відтворює нічого
created дата генерації моделі оновлюють мовчки; без дати незрозуміло, яка це була версія
human / ai що зробила людина, що модель це і є відповідь на «а ти взагалі щось робив?»
sources[] вихідні матеріали та їхні ліцензії чужий семпл без ліцензії робить незаконною всю роботу
license на яких умовах твій результат можна брати без цього ніхто не знає, чи можна тебе цитувати
consent згода людей, чий голос або обличчя звучить порожнє поле = порушення, навіть якщо все інше бездоганне
duration_sec, size_mb фактичні тривалість і розмір перевіряються ffprobe за пів хвилини — брехня видно одразу

Чому маніфест пишеться під час роботи, а не після

Тому що після роботи його нема з чого писати. Через два дні ти вже не пам'ятаєш точного формулювання промпта. Не пам'ятаєш, що дубль був сьомий. Не пам'ятаєш, звідки взявся фоновий шум із чужого відео.

Лишається один варіант — вигадати правдоподібне. А вигаданий маніфест гірший за відсутній: він виглядає як доказ, але доказом не є.

Ланцюг походження: де що фіксується Шість етапів роботи зліва направо: вихідні матеріали, промпт, генерація, монтаж, експорт, публікація. Під кожним етапом підписано, що саме треба записати саме в цю мить. Над етапами показано, що з цієї інформації зникає з пам'яті вже через тиждень, якщо не записати відразу. Що встигає забутися, якщо не записати відразу точне формулювання · seed · номер дубля · версія моделі звідки взято фон · чи питали дозволу · що правилося руками 1. Матеріал що беру за основу 2. Промпт що прошу 3. Генерація дублі, вибір 4. Правка обрізка, гучність 5. Експорт кодек, розмір 6. Публікація тільки текст Що записуєш саме в цю мить джерело ліцензія автор sources[] текст промпта інструмент, версія дата, seed prompt, tool скільки дублів який узяв чому саме він ai що робив руками команди ffmpeg згода людей human, consent тривалість розмір з ffprobe duration, size маніфест транскрипт сторінка-опис media.json Кожна пропущена клітинка — це діра, яку через тиждень можна тільки вигадати. Маніфест ведеться як журнал, а не пишеться в останні 10 хвилин уроку.
Ланцюг збігається з тим, як влаштовані промислові стандарти походження: кожна дія записується окремим твердженням у момент, коли вона відбувається. Різниця лише в тому, що в них це робить програма, а в тебе — ти сам.
Питання

Через рік тебе питають, чи цей ролик робив саме ти. Файл clip.mp4 у тебе є. Що з твого проєкту це доведе?

Крок 7

Як улаштований media.json

Верхній рівень — масив. Один елемент масиву — один твір. Усередині елемента є прості поля, а є вкладені

Структура файлу media.json у вигляді дерева Корінь — масив. Перший елемент описує аудіозапис і містить поля file, type, title, tool, model, prompt, seed, created, duration_sec, size_mb, human, ai, license, consent і вкладений масив sources, кожен елемент якого має title, author, url і license. Другий елемент так само описує відео. media.json — масив записів, по одному на твір [0] аудіо "file" "track.mp3" ім'я файлу, який лишився локально "type" "audio" audio або video "title" "Коридор о сьомій" назва для сторінки-опису "tool" "Suno" блокуючий provenance "model" "v4.5" блокуючий provenance "prompt" "synth-pop 80-х, 104 BPM…" довший за 10 символів "seed" "a91f0c" якщо інструмент показує "created" "2026-09-02" дата генерації, ISO "duration_sec" 62 число; аудіо 30—90, відео 10—30 "size_mb" 1.5 число; не більше 20 "human" "написав промпт, обрізав…" що зробила людина "ai" "згенерувала мелодію й вокал" що зробила модель "license" "CC BY 4.0" умови для твого результату "consent" "n/a — людей у записі немає" блокуючий на уроці 8 "sources": [ ] { "title", "author", "url", "license" } — по одному на кожен вихідний матеріал [1] відео — так само
Чекер читає цей файл через jq. Блокуючий критерій provenance дивиться рівно три поля в кожному записі: tool, model і prompt довший за 10 символів. Решта полів робить маніфест корисним для людини.
~/www/media/media.json — так виглядає готовий маніфест
[
  {
    "file": "track.mp3",
    "type": "audio",
    "title": "Коридор о сьомій",
    "tool": "Suno",
    "model": "v4.5",
    "prompt": "synth-pop 80-х, світлий ностальгійний настрій, аналоговий синт, електробас, живі барабани, 104 BPM, мінор, жіночий вокал українською, інтро 8 с / куплет / приспів / аутро, разом близько 60 с",
    "seed": "a91f0c",
    "created": "2026-09-02",
    "duration_sec": 62,
    "size_mb": 1.5,
    "human": "написав промпт і три ітерації, обрав дубль 3, обрізав хвіст і вирівняв гучність у Audacity",
    "ai": "згенерувала мелодію, аранжування й вокал за промптом",
    "sources": [],
    "license": "CC BY 4.0",
    "consent": "n/a — реальних людей у записі немає"
  },
  {
    "file": "clip.mp4",
    "type": "video",
    "title": "Літачок",
    "tool": "Runway",
    "model": "Gen-3 Alpha",
    "prompt": "шкільний коридор уранці, сонце у вікнах, паперовий літачок повільно летить повз шафки й зникає за поворотом, середній план, плавний трекінг збоку, тепле контрове світло, зернистість плівки, 15 с, 16:9",
    "seed": "",
    "created": "2026-09-02",
    "duration_sec": 15,
    "size_mb": 12.4,
    "human": "написав промпт, відібрав дубль 2 з п'яти, обрізав перші 3 с і стиснув ffmpeg до 12.4 МБ",
    "ai": "згенерувала всі 5 дублів відео",
    "sources": [
      {
        "title": "School Hallway Ambience — назва як на сторінці джерела",
        "author": "нік автора на Freesound",
        "url": "https://freesound.org/people/<автор>/sounds/<id>/",
        "license": "CC BY 4.0"
      }
    ],
    "license": "CC BY-SA 4.0",
    "consent": "n/a — облич у кадрі немає"
  }
]

Це приклад-зразок: назви, дати, seed і посилання в ньому ілюстративні. Числа duration_sec і size_mb у твоєму файлі беруться з ffprobe, а не з цього прикладу.

Найчастіша технічна причина провалу: BOM Якщо ти створиш media.json у PowerShell командою … | Out-File -Encoding utf8, Windows PowerShell 5.1 допише на початок файлу невидиму мітку BOM. Файл виглядатиме нормально в редакторі, але jq і json.load впадуть, і критерій manifest_valid буде червоним без жодного пояснення. Правильно так: [IO.File]::WriteAllText($path, $text, (New-Object Text.UTF8Encoding $false)). Або просто збережи файл редактором коду у форматі «UTF-8 без BOM».
перевір маніфест до заливання — Git Bash, macOS, Linux
$ jq -e 'length >= 2' media.json true $ jq -e 'all(.[]; .tool != "" and .model != "" and (.prompt|length) > 10)' media.json true $ head -c 3 media.json | xxd 00000000: 5b0a 20 [. # якби на початку був BOM, тут стояло б efbb bf — і jq упав би
Питання

Твій media.json відкривається в редакторі бездоганно, але чекер каже «маніфест не парситься». Ти впевнений, що JSON валідний. Що перевіряєш першим?

Крок 8

Конструктор маніфесту

Заповнюй поля свого справжнього твору. Сторінка перевіряє повноту, показує, наскільки походження простежуване, і збирає валідний media.json

Запис маніфесту

ім'я локального файлу — на сервер він не їде
аудіо: 30—90 с
назва, під якою твір стоїть на сторінці-описі
блокуючий критерій provenance
версія моделі, а не слово «AI»
дослівно те, що ти вводив; має бути довшим за 10 символів
необов'язкове, але дуже підвищує простежуваність
дата генерації
з ffprobe, не «на око»
не більше 20 МБ
це і є відповідь на питання «а ти взагалі щось робив?»
чесний поділ праці — головна цінність маніфесту
на яких умовах твій результат можна брати
Вихідний матеріал, якщо ти щось брав (необов'язково)
Нічого не зрозуміло простежуваність 0 з 12
0—3нічого не зрозуміло
4—6видно інструмент
7—9можна відтворити
10—12повний ланцюг
    Записи маніфесту
      media.json — згенеровано з твоїх полів
      []

      Збережи цей текст у файл media.json у кодуванні UTF-8 без BOM і залий у ~/www/media/. Чекеру потрібні щонайменше два записи: аудіо і відео.

      Питання

      Учень заповнив усі обов'язкові поля, але написав "human": "зробив пісню" і "ai": "допомогла". Автоперевірка це пропустить. Чому маніфест усе одно поганий?

      Крок 9

      Що можна брати за вихідний матеріал

      Одне правило, яке заощадить тобі багато нервів: відсутність позначки про ліцензію — це не дозвіл

      За замовчуванням будь-який твір захищений авторським правом із моменту створення. Ніякої реєстрації для цього не потрібно. Тому «я не знайшов напису, що не можна» означає рівно протилежне: не можна, поки не сказано, що можна.

      ПозначкаЩо дозволяєЩо зобов'язуєГодиться для уроку
      Власний матеріалусенічоготак, найкращий варіант
      CC0 1.0усе, зокрема переробкунічого; згадати автора — ввічливістьтак
      CC BY 4.0усе, зокрема переробкувказати автора, джерело й ліцензіютак
      CC BY-SA 4.0усе, зокрема переробкуатрибуція + твій результат теж SAтак, якщо готовий віддати свій твір під SA
      CC BY-NC 4.0некомерційне використанняатрибуція; ніякої комерціїтак — шкільна робота некомерційна
      CC BY-NDлише поширення без змінпереробка забороненані — будь-яка генерація на його основі це похідний твір
      немає позначкинічогоні
      трек із YouTube / TikTok, кадр із фільмунічогоні, навіть «на 5 секунд»
      Дерево рішень: чи можна брати цей матеріал Послідовність із п'яти питань. Чи зробив я це сам — якщо так, беремо. Чи вказана ліцензія — якщо ні, не беремо. Чи є в ліцензії ND — якщо так, не беремо. Чи є SA — якщо так, беремо, але свій твір теж публікуємо під SA. Чи є в матеріалі обличчя або голос реальної людини — якщо так, потрібна окрема згода. У кінці — записати TASL у поле sources. Хочу взяти цей матеріал Я зробив це сам — зняв, записав, намалював? так беремо · license: власний ні На сторінці явно вказана ліцензія? ні не беремо мовчання ≠ дозвіл так У ліцензії є ND — «без похідних»? так не беремо генерація — це похідний твір ні У ліцензії є SA — «на тих самих умовах»? так беремо, але твій license теж SA ні У матеріалі є обличчя або голос людини? так потрібна згода ліцензія її не замінює ні беремо і одразу пишемо TASL у sources[] TASL — чотири речі в кожному джерелі Title — назва · Author — автор · Source — посилання · License — назва ліцензії з посиланням Якщо ти щось змінив — так і напиши: «обрізано до 8 с, накладено на згенерований трек».
      Гілка «є обличчя або голос» не входить до ліцензії взагалі: дозвіл автора фото і дозвіл зображеної людини — це два різні дозволи. Саме про це буде наступний урок.

      Як виглядає атрибуція на практиці

      У маніфесті — структуровано, у полі sources[]. На сторінці — людським рядком під твором. Ці два записи описують одне й те саме, і обидва потрібні: перший читає програма, другий — людина.

      рядок атрибуції на сторінці ~/www/media/index.html
      <p class="credit">Фоновий шум коридору —
        <a href="https://freesound.org/people/…/sounds/…/">«School Hallway Ambience»</a>,
        автор <a href="https://freesound.org/people/…/">нік автора</a>,
        ліцензія <a href="https://creativecommons.org/licenses/by/4.0/">CC BY 4.0</a>.
        Змінено: обрізано до 8 с і приглушено на 12 дБ.</p>
      Умови самого генератора — це ще один шар Ліцензія вихідного семпла і правила сервісу, у якому ти генеруєш, — різні документи. У безкоштовних тарифах Suno й Runway права на результат зазвичай вужчі, ніж у платних, і комерційне використання може бути закрите. Для шкільної роботи цього досить, але подивись умови свого акаунта й познач це в license, а не вгадуй.
      Питання

      Ти знайшов ідеальний фоновий звук на сайті, де під ним написано «free download». Ліцензії не вказано ніде. Що робиш?

      Крок 10

      C2PA і Content Credentials: походження всередині файлу

      Індустрія намагається вирішити ту саму задачу технічно — вшити маніфест у сам файл і підписати його криптографічно

      Твій media.json лежить поруч із файлом. Розлучити їх легко: хтось перешле саме відео, а текстовий опис лишиться на сторінці. Тому камери, редактори й генератори домовилися записувати ту саму історію всередину файлу — щоб вона їздила разом із ним.

      Домовленість оформили як відкритий стандарт. Він зветься C2PA: Coalition for Content Provenance and Authenticity, «коаліція за походження й достовірність вмісту». А позначку, яку в стрічці чи в редакторі бачить звичайний користувач, назвали Content Credentials — «посвідчення вмісту».

      Логіка та сама, що в твоєму media.json, тільки веде запис не людина, а програма. Розберемо по кроках.

      Спершу. Кожна окрема дія над файлом — зйомка, генерація, обрізка, корекція кольору — лягає в короткий запис: що зробили, коли, чим. Такий запис зветься твердженням, англійською assertion.

      Потім. Усі твердження про цей файл складають в одну пачку. Пачка зветься claim, тобто «заява»: програма ніби заявляє «ось усе, що я знаю про походження цього файлу».

      Наостанок. Пачку запечатують цифровим підписом. Печатку ставить той, хто робив дію: камера, редактор, генератор. Працює це як сургуч на конверті. Прочитати вміст може будь-хто, а от змінити хоч один символ і залишити печатку цілою — ні.

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

      Це вже не експеримент: Content Credentials вбудовують OpenAI, Google, Adobe і Microsoft, а платформи вчаться їх показувати. Але є проблема, через яку твій текстовий маніфест не стає зайвим.

      Чому вшите в файл походження зникає Файл із вшитим маніфестом C2PA проходить три шляхи. Прямо переданий файл зберігає позначку. Скріншот, перекодування або завантаження на платформу, яка зрізає метадані, знищують її повністю. М'яка прив'язка — невидимий водяний знак і відбиток — дозволяє відновити запис із реєстру, але не завжди. Окремо показано текстовий маніфест поруч із роботою, який не залежить від файлу. clip.mp4 + вшитий маніфест із цифровим підписом переданий як файл, без змін позначка на місці скріншот кадру перекодування ffmpeg платформа, що зрізає метадані маніфесту немає файл виглядає так само, але не доводить нічого м'яка прив'язка: невидимий водяний знак і відбиток вмісту запис шукають у реєстрі переживає кадрування і скріншот — але не завжди Твій media.json іде поруч, а не всередині Його не зріже перекодування, він читається без спеціальних програм, лежить на твоєму домені і показує історію роботи. Чого він не вміє: довести, що ти його не переписав заднім числом.
      Дві системи закривають різні дірки. Підпис у C2PA доводить, що маніфест не змінювали після підписання, але зникає разом із метаданими. Текстовий маніфест не зникає нікуди, але тримається на твоїй репутації й на тому, що вчитель бачив роботу очно.
      Що C2PA робить добре
      • записує сам. Тобі не треба згадувати через тиждень, що саме ти зробив: програма позначає дію в момент, коли ти її робиш;
      • запечатує запис. Змінити рядок і залишити підпис цілим не вийде — підміну видно одразу, без експертизи;
      • їде між програмами. Знято камерою, оброблено в редакторі, дороблено генератором — історія не обривається на межі програм;
      • видно без зайвих кліків. Платформа може показати позначку просто в стрічці, і глядач не мусить нічого шукати вручну.
      Чому це не панацея
      • метадані знімаються однією командою або скріншотом;
      • частина платформ зрізає їх при завантаженні;
      • відсутність позначки нічого не означає — вона могла й не ставитися;
      • позначка говорить «як зроблено», а не «правда це чи ні».
      перевір, що взагалі лежить у метаданих твого файлу
      $ exiftool -G -a clip.mp4 | head -20 [File] File Type : MP4 [QuickTime] Encoder : Lavf60.16.100 # якщо генератор поставив Content Credentials, поруч буде блок JUMBF / C2PA $ ffmpeg -i clip.mp4 -c copy clean.mp4 # просте перекодування контейнера — і більшості метаданих уже немає
      Питання

      Тобі надсилають відео без жодних Content Credentials і кажуть: «Позначки немає — отже, це не AI, це справжнє». У чому помилка?

      Крок 11

      Транскрипт: сторінка має бути зрозумілою без медіа

      На твоєму сервері медіа немає взагалі. Отже, транскрипт — це не додаток до роботи, а сама робота

      Текстова альтернатива робить одразу чотири різні речі, і кожної з них достатньо, щоб її писати:

      НавіщоХто це відчуває
      Доступність людина, яка не чує; людина зі скрінрідером; будь-хто в шумному автобусі без навушників
      Пошук усередині відео не шукає ніхто: ні пошуковик, ні grep, ні ти сам через півроку
      Перевірка учитель звіряє, чи транскрипт відповідає тому, що справді звучить і показано
      Ця конкретна умова на сервері немає файлу — без транскрипта на сторінці порожнє місце

      Як оформити

      Для аудіо — повний текст із позначками структури. Для відео — покадровий опис із мітками часу: що в кадрі, що чути, що з'являється як текст. Мітка часу потрібна, щоб опис можна було звірити з файлом.

      ~/www/media/transcript.md
      # Транскрипти
      
      ## track.mp3 — «Коридор о сьомій» · 62 с
      
      **[0:00—0:08] Інтро.** Інструментальне, синтезатор і бас, без вокалу.
      
      **[0:08—0:26] Куплет 1.**
      Ще темно за вікном, а світло вже горить,
      і в коридорі чути, як прокинувся наш світ.
      
      **[0:26—0:44] Приспів.**
      …
      
      ## clip.mp4 — «Літачок» · 15 с, без звуку
      
      | Час | Що в кадрі | Звук |
      |---|---|---|
      | 0:00—0:04 | порожній шкільний коридор уранці, сонячні плями на підлозі | тиша |
      | 0:04—0:10 | паперовий літачок влітає в кадр ліворуч, летить повз ряд шафок | тиша |
      | 0:10—0:15 | літачок зникає за поворотом, камера сповільнюється | тиша |
      
      **Артефакти генерації, які видно:** на 0:07 напис на шафці нечитабельний,
      на 0:12 тінь літачка не збігається з напрямком світла.
      Опис артефактів — не самокритика, а частина роботи Наступного уроку ти шукатимеш маркери синтетичності у власних файлах. Почни зараз: те, що ти сам знайшов і записав, наступного разу шукати не доведеться.
      Питання

      Учень написав у transcript.md: «Відео про літачок у коридорі, 15 секунд, дуже атмосферне». Формально транскрипт є. Чому перевірка поки його не пропустить і чого тут бракує?

      Крок 12

      Практика: два твори, три текстові файли

      Кроки 1—11 робиш у себе на комп'ютері. На сервер їде тільки крок 12. Галочки зберігаються

      Межа лишається тією самою .mp3, .mp4, сирі дублі, чернетки, скріншоти — усе живе в тебе на комп'ютері в ~/media-local/ і показується вчителю очно. На сервер ідуть рівно три файли: index.html, media.json, transcript.md. У ~/www/media/ не має бути жодного файлу з іншим розширенням, ніж .html .json .md .css .js.
      Крок 13

      Автоперевірка

      Чекер не слухає твій трек. Він парсить media.json, звіряє межі тривалості й розміру і перелічує розширення в теці. Спроби не обмежені

      Демонстраційний режим: результат згенеровано для показу. На сервері ця кнопка викликає POST /api/check, який запускає /opt/lessons/07/check.sh від імені учня.

      Що вчитель дивиться на твоєму екрані

      Крок 14

      Шкала виконання

      Це те, що бачить учитель, коли виставляє оцінку.

      СкладникВагаРезультат
      Виконано
      0%
      Рекомендований бал за 12-бальною

      П'ять речень, які варто запам'ятати

      Де найчастіше помиляються

      Домашнє завдання

      Дописати в transcript.md покадровий опис свого відео. Щонайменше один рядок на кожні 3 секунди. У рядку — що в кадрі, що чути і які помилки генерації видно.

      Мета проста. Людина, яка не побачить файлу ніколи, має зрозуміти роботу повністю.

      Другим абзацом додай у media.json поле "verify" — для кожного запису. Уяви: через рік файл спливає десь без твого імені. Одним реченням напиши, чим саме ти доведеш авторство.

      Джерела

      Звідки взяті числа й формулювання

      Усі розрахунки на цій сторінці робить твій браузер за формулою з кроку 3 — їх можна перевірити калькулятором

      Повний список із поясненнями, що звідки взято, — у файлі urok-07-джерела.md поруч із цією сторінкою.