diff --git a/README.md b/README.md index 9c08eb5..fd7c1ca 100644 --- a/README.md +++ b/README.md @@ -69,7 +69,7 @@ Telegram ботом, которому отправили видео). название движка распознания (поддерживается только `whisper`). Каждый сегмент обязан содержать ключи `start` (время начала сегмента), `end` (время конца сегмента), `text` (текст сегмента). Затем должен идти ключ - `custom`, где указываются значения, специфичные для движка (они будут + `engine`, где указываются значения, специфичные для движка (они будут использованы только на следующем шаге, а затем будут удалены). ```json { @@ -253,5 +253,164 @@ Telegram ботом, которому отправили видео). - `payload` - для `voice` может быть только `null` 5. **Построить список ссылок на видео** - Если видео нет, то шаг пропускается. Вместо него файл `audio_events.json` - копируется в `events.json` и происходит переход на следующий шаг. - - \ No newline at end of file + копируется в `events.json` и происходит переход на 7 шаг. + - Используя оконный метод, описанный выше, модели отправляются + сформированные события, а она формирует список ссылок на видео, которые + нужно разрешить. Окна передаются по такому же алгоритму, как уже было + описано выше для шага №4, но данные передаются вот такими объектами: + ```json + { + "id": 4, + "timestamp": 3.0, + "duration": 5.0, + "text": "Осмысленный текст, полученный на 4-ом шаге." + } + ``` + То есть для каждого объекта, входящего в `past`, `present` или `future`, + передаются только данные, описанные выше. Промпт должен налагать + дополнительные ограничения. Во-первых, непосредственно обрабатывать можно + только соыбтия из списка `present`, а события, перечисляемые в `past` и + `future` используются только для контекста - работать с ними нельзя. Ключ + `context` работать точно так же, как на 4-ом шаге - модель может + использовать его по своему усмотрению, но формат рекомендуется жестко + сформулировать в промпте. + - При построении списка ссылок модель модель возвращать данные в следующем + формате: + ```json + { + "unresolved": [ + { + "ids": [0, 1, 2], + "type": "vis", + "text": "Для типа `vis`: описание того что должно быть на видео в этот момент" + }, + { + "ids": [19, 20, 21, 22, 23], + "type": "ocr", + "text": "Для типа `ocr`: текст, который нужно распознать с экрана (здесь должно быть названо, например, какой термин)" + }, + { + "ids": [0, 1, 2], + "type": "vis", + "text": "Для типа `vis`: описание того что должно быть на видео в этот момент" + } + ], + "context": { + "for_future_call": "Сегменты 6, 7 выброшены, потому что..." + } + } + ``` + - `unresolved` - список событий, которые нужно будет разрешить на + следующем шаге. Каждый объект содержит в точности три ключа: `ids` + (идентификаторы событий, на протяжении которых нужно искать то, что + описано), `type` (тип того, что нужно найти, см. далее), `text` + (описание того, что нужно найти). Тип может быть либо `vis` (нужно + определить, соответствует ли кадр из видео описанию `text`, и, если + соответствует, то вставить его в итоговый файл лекции), либо `ocr` + (нужно распознать текст, наводка на который даётся в `text`). + - `context` - контекст, который должен быть передан модели при + следующем вызове. + - После выполнения этого шага модель должна сформировать файл + `unresolved.json` +6. **Разрешить ссылки на видео** + - После этого шага должен быть получен файл `events.json`, используя который + будет построена структура итогового документа. + - TODO, пока что это не реализовано + - Итоговый файл `events.json`, должен иметь следующую структуру. ID никак + не связаны с предудущими шагами. + ```json + { + "events": [ + { + "id": 0, + "type": "voice", + "timestamp": 0.0, + "duration": 7.0, + "text": "Здесь уже должны быть осмысленные законченные фразы", + "payload": null + }, + { + "id": 1, + "type": "vis", + "timestamp": 4.0, + "duration": 0.0, + "text": "Описание содержимого изображения, путь к которому хранится в `payload`", + "payload": "runtime/23865928/images/4123.jpg" + }, + { + "id": 2, + "type": "ocr", + "timestamp": 6.0, + "duration": 0.0, + "text": "Описание текста, который должен был быть распознан", + "payload": "Текст, распознанный с кадра из видео, без перефразирований" + }, + { + "id": 3, + "type": "voice", + "timestamp": 7.0, + "duration": 3.0, + "text": "Для типа `voice` ключ `payload` всегда `null`", + "payload": null + } + ] + } + ``` +7. **Построить структуру итогового документа** + - После этого шага должен быть получен файл `structure.json` следующего + вида: + ```json + { + "elements": [ + { + "type": "heading", + "level": 2, + "text": "Заголовок второго уровня" + }, + { + "type": "paragraph", + "text": "Текст параграфа." + }, + { + "type": "heading", + "level": 3, + "text": "Заголовок третьего уровня" + }, + { + "type": "unordered", + "items": [ + "Элемент неупорядоченного списка", + "Ещё один элемент неупорядоченного списка" + ] + }, + { + "type": "ordered", + "items": [ + "1-ый элемент упорядоченного списка", + "2-ой элемент упорядоченного списка" + ] + }, + { + "type": "definition", + "term": "Кошка", + "text": "Домашнее животное, которое мяукает и царапается" + }, + { + "type": "important", + "text": "Важное замечание, которое нужно выделить на уровне структуры документа" + }, + { + "type": "image", + "event_id": 54 + } + ] + } + ``` + - Для получения файла `structure.json` модели передаются соыбытия из + `events.json`, используя метод окна (описан ранее). +8. **Собрать финальный Markdown файл** + - Для сборки Markdown файла используются элементы, полученные на предыдщем + шаге, и хранимые в файле `structure.json` + - В итоге создаётся файл `output.md`, который может включать в себя ссылки + на изображения из директории `images/` (относительно директории + промежуточных данных) \ No newline at end of file