Формат text записывает спорное слово как {основной|вариант|вариант} - ровно
тот выбор, что стоял перед человеком. Языковая модель разрешает такие места
по смыслу фразы: распознавание слышит слово отдельно, модель видит
предложение целиком. Формат json отдаёт голоса как есть, порог выбирает
вызывающая сторона.
Промпт и порядок опроса записаны в docs. Там же оговорено, чего приём
не делает: пропущенное на записи он не восстанавливает, и дописывать
слова модели прямо запрещено.
Со страниц записи и черновика не было пути назад, кроме кнопки браузера.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Клик по времени не работал: в скрипте страницы черновика снова оказался
настоящий перевод строки вместо экранированного, и весь скрипт не выполнялся.
Тот же огрех, что был в странице разбора. Проверка парности кавычек теперь
охватывает обе страницы.
Плеер приклеен к верху на обеих страницах: спорное место слушают, не
прокручивая наверх.
Черновик подсвечивал слово при несогласии любой модели - жёлтым выходил
почти весь текст. Теперь по умолчанию нужно несогласие большинства: подсветки
втрое меньше (152 слова против 385), но в чистой части 95,4 % верных вместо
98 %. Строгий режим доступен ссылкой; порог применяется при показе, поэтому
переключение не требует пересборки.
Режим ensemble: вторая модель подставляется там, где основная промолчала.
Задаётся настройкой и параметром запроса - одну запись можно прогнать в обоих
режимах и сравнить на странице разбора.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Три модели вместо одной считаются минуту и больше, плюс их загрузка при
первом обращении - держать на этом HTTP-запрос нельзя. Первый запрос
запускает сборку, страница обновляет себя сама и показывает ход работы.
Отдаётся страницей, а не документом: библиотеки для .docx в поставке нет,
а обновление возит только код. В Word переносится кнопкой копирования,
которая кладёт в буфер разметку вместе с текстом.
Тест поймал потерю: лишнее слово в конце реплики не отмечалось - индекс
выходил за границу, и метка молча пропадала.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Записи складываются в папку records и удаляются вместе с задачей по тому же
сроку. На странице разбора появился плеер, а щелчок по времени слева от
реплики перематывает запись - можно послушать спорное место, не таская
ползунок.
Настройка keep_records в config.toml. Если запись не сохранена, вместо
пустого плеера показывается объяснение.
Черновик с подсветкой расхождений пока остаётся отдельной командой:
build/make_draft.py. Ложные расхождения по написанию больше не подсвечиваются.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
При выносе общих стилей правила для сводки потерялись: подпись слипалась
со значением, и строки шли столбиком вместо ряда.
Длительность у задач, обработанных до 0.21.0, оставалась нулевой. Значение
есть в сохранённом результате, поэтому история чинится при открытии базы.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Длительность в списке всегда была нулевой: при загрузке файл ещё не
декодирован, и mark_done её не записывал.
Кнопка копирования кладёт в буфер и разметку, и простой текст: Word берёт
первое и сохраняет полужирные имена говорящих, простые редакторы - второе.
Срок хранения поднят с 3 суток до 336 часов, после чистки выполняется
VACUUM: SQLite помечает страницы свободными, но файл не уменьшает.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
GET /v1/jobs/view - список последних задач со ссылками на разбор. Токен
подставляется в ссылки, иначе по каждой пришлось бы дописывать его руками.
Отдельный тест следит, чтобы маршрут не перехватывался /v1/jobs/{job_id}.
build/compare_reference.py считает WER относительно эталона, выписанного
на слух. Косвенные метрики ловят крупные сдвиги и слепы к систематическим
мелким потерям - так и пропустили обрыв концов фраз.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Результаты, обработанные до 0.14.0, не содержат массива sentences. Пустой
блок разметки выглядел бы поломкой страницы - теперь он говорит, что нужно
отправить запись заново.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
По одному JSON не понять, чья ошибка: распознавание склеило реплики или
LLM неверно расставила роли. Страница показывает обе стороны и принимает
ответ модели, чтобы диалог собрался на глазах.
GET /v1/jobs/{id}/view - токен заголовком либо ссылкой ?token=ЗНАЧЕНИЕ.
Страница самодостаточна: ни одного внешнего запроса.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>