diff --git a/ege-checker/SKILL.md b/ege-checker/SKILL.md index 5b3ad58..eeee0f8 100644 --- a/ege-checker/SKILL.md +++ b/ege-checker/SKILL.md @@ -119,27 +119,98 @@ description: > 1. **Аудиозапись** — файл с устными ответами ученика (MP3, WAV, M4A и т.д.) 2. **Правильные ответы (ключи)** — текстом или фото бланка с ключами -### Шаг 1 — Распознать аудио -Транскрибируй аудиофайл. Из транскрипта извлеки ответы ученика по каждому заданию: -- Задание 1 (соответствие A-F): какую цифру 1-7 назвал ученик для каждого высказывания -- Задания 2-9 (True/False/Not Stated): цифру 1, 2 или 3 -- Задания 10-18 (выбор): цифру 1, 2 или 3 +### Шаг 1 — Сохранить аудиофайл во временную директорию -Если ответ нечеткий или не прозвучал — отметь как "?" и засчитай как неверный. -Выведи распознанные ответы таблицей и попроси проверяющего подтвердить перед проверкой. +Сохрани полученный аудиофайл во временный путь `/tmp/ege_audio_.`. -### Шаг 2 — Получить и распознать ключи +```python +import os, time + +ext = os.path.splitext(original_filename)[1] or ".mp3" +tmp_path = f"/tmp/ege_audio_{int(time.time())}{ext}" +with open(tmp_path, "wb") as f: + f.write(audio_bytes) +``` + +### Шаг 2 — Запустить recognition.py + +**Через subprocess (рекомендуется):** +```bash +python3 ~/zeroclaw-bot/recognition.py {tmp_path} --output json +``` + +**Через прямой импорт:** +```python +import sys +sys.path.insert(0, os.path.expanduser("~/zeroclaw-bot")) +from recognition import process_audio + +transcript, answers = process_audio(tmp_path, model_size="medium", verbose=False) +recognition_json = { + "transcript": transcript.text, + "answers": answers.to_dict(), + "unrecognized": answers.unrecognized, +} +``` + +Результат — JSON: +- `transcript` — полный текст того, что сказал ученик +- `answers.task1` — {"A": "3", "B": "1", ...} +- `answers.task2_9` — {"2": "1", "3": "2", ...} +- `answers.task10_18` — {"10": "2", "11": "1", ...} +- `answers.unrecognized` — задания, которые не удалось извлечь (засчитать как 0) + +### Шаг 3 — Получить и распознать ключи Если ключи пришли текстом — использовать напрямую. Если пришло фото бланка с ключами — распознать через vision. -### Шаг 3 — Сверить и выставить баллы -Читай `references/english-listening-criteria.md` для деталей по каждому блоку заданий. -Сверяй ответ ученика с ключом: 1 балл за совпадение, 0 за несовпадение. +### Шаг 4 — Передать в LLM для сверки и выставления баллов -### Шаг 4 — Вывести результат в формате таблицы -Три блока (Задание 1 / Задания 2-9 / Задания 10-18) с колонками: задание, ответ ученика, ключ, результат. -Итог: сумма баллов по каждому блоку + общий итог из 23. +Сформируй промпт для LLM на основе результатов recognition.py. +Подставь реальные значения вместо плейсхолдеров: +``` +Ты эксперт-проверяющий ЕГЭ по английскому (аудирование). + +Транскрипт ответов ученика (распознан через Whisper): +[TRANSCRIPT] + +Извлечённые ответы ученика: +- Задание 1 (A-F): [TASK1] +- Задания 2-9: [TASK2_9] +- Задания 10-18: [TASK10_18] +- Не распознаны (засчитать как 0): [UNRECOGNIZED] + +Правильные ответы (ключи): +[KEYS] + +Сверь ответы с ключами. 1 балл за совпадение, 0 — за несовпадение или отсутствие. +Верни строго JSON без markdown: +{"results":{"task1":{"A":true},"task2_9":{"2":true},"task10_18":{"10":false}}, + "scores":{"task1":0,"task2_9":0,"task10_18":0,"total":0}, + "errors":["Задание 1B: ученик ответил 5, верный ответ 1"]} +``` + +Читай `references/english-listening-criteria.md` для максимальных баллов каждого блока. + +### Шаг 5 — Удалить временный файл + +Обязательно удали аудиофайл после получения ответа от LLM: + +```python +import os +if os.path.exists(tmp_path): + os.remove(tmp_path) +``` + +### Шаг 6 — Вывести результат пользователю + +Три блока (Задание 1 / Задания 2-9 / Задания 10-18): +колонки — задание, ответ ученика, ключ, результат (✓/✗). +Итог: баллы по каждому блоку + общий итог из 23. + +Если были нераспознанные задания — явно указать: +"Задания X, Y не были распознаны в аудио и засчитаны как неверные." --- ## Общие принципы проверки