update skill to use faster-whisper module
This commit is contained in:
parent
48a0c0088d
commit
5db412e7f6
1 changed files with 85 additions and 14 deletions
|
|
@ -119,27 +119,98 @@ description: >
|
||||||
1. **Аудиозапись** — файл с устными ответами ученика (MP3, WAV, M4A и т.д.)
|
1. **Аудиозапись** — файл с устными ответами ученика (MP3, WAV, M4A и т.д.)
|
||||||
2. **Правильные ответы (ключи)** — текстом или фото бланка с ключами
|
2. **Правильные ответы (ключи)** — текстом или фото бланка с ключами
|
||||||
|
|
||||||
### Шаг 1 — Распознать аудио
|
### Шаг 1 — Сохранить аудиофайл во временную директорию
|
||||||
Транскрибируй аудиофайл. Из транскрипта извлеки ответы ученика по каждому заданию:
|
|
||||||
- Задание 1 (соответствие A-F): какую цифру 1-7 назвал ученик для каждого высказывания
|
|
||||||
- Задания 2-9 (True/False/Not Stated): цифру 1, 2 или 3
|
|
||||||
- Задания 10-18 (выбор): цифру 1, 2 или 3
|
|
||||||
|
|
||||||
Если ответ нечеткий или не прозвучал — отметь как "?" и засчитай как неверный.
|
Сохрани полученный аудиофайл во временный путь `/tmp/ege_audio_<timestamp>.<ext>`.
|
||||||
Выведи распознанные ответы таблицей и попроси проверяющего подтвердить перед проверкой.
|
|
||||||
|
|
||||||
### Шаг 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.
|
Если пришло фото бланка с ключами — распознать через vision.
|
||||||
|
|
||||||
### Шаг 3 — Сверить и выставить баллы
|
### Шаг 4 — Передать в LLM для сверки и выставления баллов
|
||||||
Читай `references/english-listening-criteria.md` для деталей по каждому блоку заданий.
|
|
||||||
Сверяй ответ ученика с ключом: 1 балл за совпадение, 0 за несовпадение.
|
|
||||||
|
|
||||||
### Шаг 4 — Вывести результат в формате таблицы
|
Сформируй промпт для LLM на основе результатов recognition.py.
|
||||||
Три блока (Задание 1 / Задания 2-9 / Задания 10-18) с колонками: задание, ответ ученика, ключ, результат.
|
Подставь реальные значения вместо плейсхолдеров:
|
||||||
Итог: сумма баллов по каждому блоку + общий итог из 23.
|
|
||||||
|
|
||||||
|
```
|
||||||
|
Ты эксперт-проверяющий ЕГЭ по английскому (аудирование).
|
||||||
|
|
||||||
|
Транскрипт ответов ученика (распознан через 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 не были распознаны в аудио и засчитаны как неверные."
|
||||||
---
|
---
|
||||||
|
|
||||||
## Общие принципы проверки
|
## Общие принципы проверки
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue