Updated README.md

This commit is contained in:
2026-09-16 19:55:12 +03:00
parent 89f0b171d2
commit c65a9a91e2

165
README.md
View File

@@ -69,7 +69,7 @@ Telegram ботом, которому отправили видео).
название движка распознания (поддерживается только `whisper`). Каждый название движка распознания (поддерживается только `whisper`). Каждый
сегмент обязан содержать ключи `start` (время начала сегмента), `end` сегмент обязан содержать ключи `start` (время начала сегмента), `end`
(время конца сегмента), `text` (текст сегмента). Затем должен идти ключ (время конца сегмента), `text` (текст сегмента). Затем должен идти ключ
`custom`, где указываются значения, специфичные для движка (они будут `engine`, где указываются значения, специфичные для движка (они будут
использованы только на следующем шаге, а затем будут удалены). использованы только на следующем шаге, а затем будут удалены).
```json ```json
{ {
@@ -253,5 +253,164 @@ Telegram ботом, которому отправили видео).
- `payload` - для `voice` может быть только `null` - `payload` - для `voice` может быть только `null`
5. **Построить список ссылок на видео** 5. **Построить список ссылок на видео**
- Если видео нет, то шаг пропускается. Вместо него файл `audio_events.json` - Если видео нет, то шаг пропускается. Вместо него файл `audio_events.json`
копируется в `events.json` и происходит переход на следующий шаг. копируется в `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/` (относительно директории
промежуточных данных)