- порядок беклога и роадмапа назначен слоями: проверки, которым можно верить → долги входа → владелец записи и контракт API → конвейер под тестами → приложение и возможности поверх; у каждого движения записана причина; - заведены восемь задач под пункты «Завершения», которых не закрывала ни одна запись, — цель any-audio-source была без задач вовсе; - у четырёх задач сняты критерии, требовавшие того, что делает задача ниже по очереди; исправлены ссылки на несуществующий repo/sqlite и на отменённую разведку об очереди.
4.2 KiB
4.2 KiB
✨ Резать длинную запись на фрагменты и продолжать с места остановки
- Тип: feature
- Категория: Очередь — Резка на фрагменты — самая глубокая переделка конвейера, и она идёт по замеренным числам.
- Зачем: Шаг конвейера повторяется целиком: перезапуск на пятом часу шестичасовой записи начинает распознавание заново и оплачивает его второй раз.
- Теги: goal:long-recordings
Двигает пункты 3, 5 и 6 «Завершения» цели: запись в пределах потолка доходит до текста целиком, долгая задача не занимает воркер на часы, а перезапуск на середине продолжает работу с первого неотмеченного фрагмента.
Запись делится на фрагменты, каждый распознаётся отдельно, готовый фрагмент отмечается в базе. После перезапуска работа продолжается с первого неотмеченного, а текст собирается из фрагментов по порядку.
Затрагивает
- принцип «шаг конвейера идемпотентен по повтору» из
docs/architecture.md: шаг перестаёт быть неделимым; - таблица фрагментов задачи: порядковый номер, границы по времени, состояние, текст — и её миграция;
- состояния конвейера
created→converted→transcribe→done; - конвертер: деление записи на фрагменты по времени;
- адаптер SpeechKit: обращение на фрагмент вместо обращения на запись;
- раскладка
data/files: файлы фрагментов рядом с исходным.
Критерии приёмки
- Запись длиной шесть часов доходит до текста, и текст собран из фрагментов по порядку без пропусков и повторов на стыках. Оракул — тест конвейера на подставном распознавателе, отдающем свой текст на каждый фрагмент.
- Остановка процесса на середине не теряет распознанные фрагменты: после перезапуска обращений по ним нет. Оракул — тест: половина фрагментов отмечена, повторный проход шага зовёт распознаватель только по остатку.
- Отказ на одном фрагменте не отменяет готовые: задача остаётся пригодной к
повтору либо уходит в
failedс сообщением пользователю. Оракул — тест с распознавателем, отказывающим на третьем фрагменте. - Долгая задача не останавливает короткие: голосовое на десять секунд проходит конвейер, пока шестичасовая запись в работе. Оракул — тест захвата: воркер берёт вторую задачу, пока первая держит фрагмент.
Рамки
Длину фрагмента назначает ответ разведки speechkit-limits — до неё задача не
берётся. Раскладка data/files меняется, а это необратимо: формат согласуется с
человеком. Прогон на боевых ключах ради проверки запрещён — подставной
распознаватель.