- Зачем:
- требовалось проверить долю смешанных ASR-сегментов на трёх записях, включая разговоры на двоих.
- Что:
- добавлен отчёт с долями сегментов и времени для трёх рабочих созвонов.
- обвязка замеров переведена на откалиброванный порог 0,89.
- исследовательский скрипт приведён к формату ruff.
- Проверка:
- выполнены три полных прогона bench_conflict.py с WeSpeaker и порогом 0,89.
- uv run ruff check и ruff format --check прошли успешно.
- Зачем:
- слуховая проверка (#12) показала, что разметку диаризации читают как
истину, хотя она содержит ложный кластер, пропуски и неполные перекрытия.
- Что:
- в глоссарий добавлен термин «Опорная разметка» с запретом на
«эталонную», «истинную» и ground truth.
- определение описывает роль разметки в измерении, а не результат
конкретного прогона: выводы о пороге 0,9 остались в тикетах карты.
- Проверка:
- git show --stat HEAD и чтение CONTEXT.md.
- Зачем:
- выводы о жизненном цикле и возможностях моделей должны читаться как единое исследование.
- Что:
- материал перестроен вокруг слоёв, платформ и уровней доказательства.
- объединены выводы по Intel, AMD, Apple и браузерным путям.
- подтверждённые возможности отделены от выводов и необходимых экспериментов.
- Проверка:
- относительные ссылки и структура Markdown проверены.
- git diff --cached --check выполнен успешно.
- Зачем:
- нужна фактическая опора для решений карты о диаризации на Intel-пути.
- Что:
- исследованы жизненные циклы ORT, OpenVINO, DirectML и Windows ML.
- сравнены пути AMD, Apple Silicon и браузерные EP для текущих моделей.
- зафиксированы wheel-матрицы, fallback и необходимые model-specific тесты.
- Проверка:
- git diff --cached --check.
- Зачем:
- тикеты карты #10-#13 опираются на измерительную обвязку, которая до сих пор
жила во временном каталоге сессии и исчезла бы вместе с ним.
- Что:
- перенесены четыре скрипта разведки: ASR, один прогон диаризации, свип порога
кластеризации и подсчёт чистоты ASR-сегментов.
- общая часть вынесена в common.py: пути от корня репозитория вместо
захардкоженных, конфигурация диаризатора, проверка наличия моделей.
- починен замер пиковой памяти: нужен экспорт K32GetProcessMemoryInfo из
kernel32 и явные argtypes, иначе дескриптор процесса уезжает 32-битным.
- модели и выход замеров исключены из истории локальным .gitignore.
- Проверка:
- export PYTHONIOENCODING=utf-8
- uv run --with sherpa-onnx python .scratch/diarization/bench_diar.py "<запись>" 8 0.9
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
- Зачем:
- рабочие материалы заходов (замеры, черновики, обвязка) должны попадать в
историю вместе с веткой, а не жить только на машине разработчика.
- Что:
- строка .scratch/ удалена из .gitignore.
- Проверка:
- git check-ignore -v .scratch/ не должен ничего возвращать.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
- Зачем:
- навык wayfinder ожидает раздел про операции карты в документе трекера, а
в Gitea 1.27 нет подзадач, поэтому конвенции надо было зафиксировать явно.
- Что:
- описана принадлежность тикета карте через метку и ссылку в теле, поскольку
родительских связей в API нет.
- блокировки заведены на нативные зависимости Gitea, добавлены запросы фронтира.
- зафиксированы три особенности tea api: путь без ведущего слэша, обязательные
owner и repo в теле зависимости, нулевой код возврата при HTTP 404.
- Проверка:
- tea issues list --remote origin --labels wayfinder:map
- tea api --remote origin repos/ddmitry/local-transcriber/issues/14/dependencies
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
- Зачем:
- схема из бэклога приписывала спикера целому ASR-сегменту, и до замера
было неизвестно, насколько сильно это огрубляет результат.
- Что:
- добавлен разведочный замер sherpa-onnx на одной записи: 11,1x RTFx против
16,4x у ASR, свип порога кластеризации и доля загрязнённых сегментов.
- пункт бэклога переписан: движок описан как практически закрытый вопрос,
главной развилкой названа единица привязки спикера к тексту.
- зафиксировано, что 27% сегментов содержат не менее секунды чужой речи и на
них приходится больше половины времени транскрипта.
- Проверка:
- методика и условия замера воспроизводятся по разделам «Оборудование и
условия» и «Контрольная запись» в docs/benchmarks/2026-08-12-diarization-feasibility.md.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
- Зачем:
- команды установки должны использовать основной Gitea-репозиторий, а не зеркало GitHub.
- Что:
- обновлён источник первичной установки через uv tool.
- обновлён источник принудительного обновления через uv tool.
- Проверка:
- выполнена проверка git diff --cached --check.
- Зачем:
- подсказки в ошибке и предупреждении называли только OpenVINO и CUDA, которых нет на macOS и ARM, поэтому пользователю там предлагались заведомо нерабочие команды.
- Что:
- в оба сообщения добавлен вариант --device cpu, работающий на любой платформе.
- для large-v3-turbo подсказки по cpu и cuda подставляют medium, так как faster-whisper turbo не поддерживает.
- Проверка:
- uv run pytest -q: 243 passed, 1 skipped.
- Зачем:
- документация обещала large-v3-turbo на NVIDIA, где он недоступен, и умалчивала, что модель по умолчанию без CUDA понимает только русскую речь.
- Что:
- large-v3-turbo перенесён из таблицы faster-whisper в раздел OpenVINO с измеренными размерами моделей.
- языковое ограничение авто-профиля и предупреждение CLI описаны в README, gpu.md и ADR-006.
- в backlog добавлен пункт про turbo для faster-whisper, в gpu.md снято расхождение по скорости openvino-cpu.
- Проверка:
- вычитка diff, проверка якорной ссылки на docs/gpu.md.
- Зачем:
- в одной строке шапки смешивались английские и русские значения, а при неизвестном языке в неё попадало служебное «unknown (не определён)».
- Что:
- формулировки источника языка вынесены константами в formatter и переведены на русский.
- оба бэкенда используют общий признак UNKNOWN_LANGUAGE вместо «auto» и «unknown».
- неизвестный язык печатается одной строкой, без служебного значения.
- Проверка:
- uv run pytest -q: 242 passed, 1 skipped.
- ruff check .: 48 замечаний, столько же, сколько до правки.
BREAKING CHANGE: в шапке транскрипта значения detected и forced заменены на «определён автоматически» и «задан явно»; при неизвестном языке строка выглядит как «- **Язык**: не определён».
- Зачем:
- после смены auto-профиля пользователю нужны явные предупреждения о языковых ограничениях и рабочие пути выбора Whisper-бэкенда.
- Что:
- в MODEL_CATALOG добавлены поддерживаемые языки ONNX-моделей и предупреждение о несовместимом языке.
- для Whisper-имён добавлены подсказки с совместимыми парами backend/model.
- вывод языка различает детекцию, язык моноязычной модели и отсутствие детекции.
- усилены тесты implicit compute type и turbo-каталога, удалены дубли auto-тестов.
- Проверка:
- uv run pytest -q: 241 passed, 1 skipped.
- uv lock --check, compileall и git diff --check.
BREAKING CHANGE: --device auto без NVIDIA теперь выбирает ONNX GigaAM RNN-T; прежний профиль возвращается явным --device или конфигурацией.
- Зачем:
- пользователям без NVIDIA нужен самый быстрый и читаемый CPU-профиль без дополнительных параметров.
- Что:
- auto-политика изменена на CUDA при наличии nvidia-smi, иначе ONNX GigaAM RNN-T int8.
- сохранён приоритет явных значений CLI и конфигурации для OpenVINO и FasterWhisper CPU.
- обновлены тесты, README, PRD, ADR, GPU-документация и вывод benchmark.
- Проверка:
- uv run pytest -q: 232 passed, 1 skipped.
- uv lock --check и git diff --cached --check.
- Зачем:
- требуется подтвердить сравнение OpenVINO и ONNX на втором CPU и повторно проверить дубли medium.
- Что:
- добавлены метрики четырёх профилей на Ryzen 7 8845H.
- зафиксированы четыре одинаковых прогона RSQM без повторов и результаты двух слепых ревью.
- описаны аргументы для будущего выбора backend по умолчанию.
- Проверка:
- git diff --cached --check.
- Зачем:
- нужна практическая оценка нового CPU-профиля на русских встречах.
- Что:
- зафиксированы скорость, WER, пунктуация, нагрузка и отзывчивость.
- добавлены две независимые оценки качества и рекомендации пользователям.
- Проверка:
- uv run pytest.
- реальные прогоны четырёх профилей на трёх записях.
- Зачем:
- нужна поддерживаемая линия OpenVINO для новых моделей Whisper.
- Что:
- OpenVINO, GenAI и Tokenizers согласованно обновлены до 2026.3.
- автоматический переход на следующую линию ограничен версией 2026.4.
- Проверка:
- uv run pytest.
- реальный прогон medium INT8 на трёх русскоязычных записях.
- Зачем:
- CTranslate2 4.7.1 аварийно завершал Windows/CUDA-процесс кодом 0xC0000409 после успешной обработки пакета.
- Что:
- версия CTranslate2 в uv.lock обновлена до 4.8.1.
- устранён сбой освобождения CUDA-ресурсов после длинного пакетного прогона.
- Проверка:
- uv lock --check; uv run pytest -q в Windows и WSL2.
- полный пакет из трёх записей на Windows/CUDA и полные CUDA, ONNX и OpenVINO-прогоны в WSL2.
Зачем:
- зафиксировать сравнение моделей на одном и том же массиве записей
- сохранить воспроизводимый набор файлов для будущих прогонов
Что:
- добавлены метрики и качественный вывод по Parakeet v3
- записаны точные имена, размеры и SHA-256 видео и эталонов
- обновлена рекомендация в README
Проверка:
- git diff --check
- Зачем:
- выбор CPU-модели должен опираться на несколько реальных записей, а не на единичный прогон.
- Что:
- добавлены скорость, WER и качественное сравнение пяти моделей на трёх встречах.
- обновлены рекомендации README и открытый вопрос ADR-006 для E2E RNN-T.
- Проверка:
- git diff --cached --check.
- Зачем:
- закрыты замечания независимого review по воспроизводимости и VAD-приёмке.
- Что:
- рабочая версия Python точно зафиксирована на 3.13.13.
- нулевые и обратные VAD-сегменты исключены из результата.
- в README записаны наблюдаемые скорости новых моделей с указанием CPU.
- Проверка:
- uv run pytest -q: 224 passed, 1 skipped.
- ограниченная проверка Ruff и uv lock --check завершены успешно.
- Зачем:
- добавлена локальная транскрипция смешанной речи и русского текста с пунктуацией.
- Что:
- onnx-asr обновлён до 0.12 и зарегистрированы три модели GigaAM.
- выбор compute_type учитывает опубликованные квантизации и явность настройки.
- обновлены тесты, README и требования PRD.
- Проверка:
- uv run pytest -q: 223 passed, 1 skipped.
- выполнены smoke- и полные прогоны четырёх GigaAM-моделей.
- Зачем:
- смешанная русско-английская речь и отсутствие пунктуации у gigaam-v3-ctc
закрываются моделями из onnx-asr 0.12, но обновление заблокировано пином.
- Что:
- добавлена спека: три модели в каталог, Python 3.13 и ORT 1.28, верхние
границы мажорных версий, ловушки и границы ручной приёмки.
- в backlog добавлены ссылка на спеку из пункта про CPU-дефолт и новое
направление «профили намерения вместо выбора модели».
- Проверка:
- задача трекера #1 с порядком работ и критериями приёмки.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
- Зачем:
- формальной процедуры оценки моделей не будет: проект домашний, CI нет,
репрезентативные записи приватны, а тяжёлый пайплайн повышает шанс
забросить работу.
- Что:
- удалены «Кандидатная модель», «Сравнительная оценка», «Контрольная
модель», «Интеграционный smoke-тест» и «Локальный оценочный корпус».
- оставлены «Движок распознавания», «Поддерживаемая модель» и «Модель по
умолчанию» — они держат различие между поддержкой и рекомендацией.
- Проверка:
- git diff HEAD~1 -- CONTEXT.md.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
- Зачем:
- инженерным навыкам нужна единая конфигурация трекера задач и доменных документов.
- Что:
- задокументированы Gitea workflow через tea и стандартные triage-метки.
- добавлены доменный словарь и правила работы с ADR, research и specs.
- Проверка:
- git diff --cached --check.
- tea --version: 0.15.1.
- Зачем:
- нужен проверяемый путь от обновления ASR-стека к выбору безопасного CPU-дефолта.
- Что:
- добавлено исследование актуальных движков и моделей с корректным именем файла.
- зафиксированы дефект OpenVINO, кандидаты GigaAM и матрица бенчмарка на Intel Core i5.
- Проверка:
- выполнена проверка git diff --cached --check.
- Зачем:
- внешнее сравнение с облачным Hypescribe показало: главный разрыв локальной транскрипции — не качество распознавания, а структура (спикеры 2/10 против 8/10); без диаризации MoM не собрать.
- Что:
- новый раздел «Структура транскрипта»: диаризация как опциональный пост-процессинг (sherpa-onnx vs pyannote, нужен ADR), ручка нарезки абзацев в formatter, словарь замен терминов как запасной план после бенчмарка RNN-T.
- зафиксировано вне ядра CLI: LLM-чистка и сопоставление имён спикеров.
- Проверка:
- docs-only, тесты не затронуты.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Зачем:
- транскрипция может тихо терять содержание: блоки галлюцинированных повторов и обрыв распознавания до конца файла выглядят как законченный транскрипт (класс ошибок из ADR-006), и читатель об этом не узнаёт.
- Что:
- новый модуль quality.py: детектор разрыва в хвосте (строго >120 с) и детектор блоков повторяющихся сегментов (серия >=4 для длинного текста, >=10 для короткого вроде «ага»).
- предупреждения жёлтым в консоли (single и batch) и строками «Внимание» в шапке markdown-транскрипта; _format_duration переименована в публичную format_duration.
- 27 новых тестов: границы порогов, нормализация текста, шапка formatter, точные строки CLI-сообщений с обрезкой «(+ ещё N)».
- Проверка:
- uv run pytest — 218 passed, 1 skipped.
- ручной прогон записи 23:01 (gigaam-v3/onnx) — транскрипт полный, предупреждений нет.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Зачем:
- в дереве с апреля лежал некоммиченный app.py (референсный Parakeet-сервер, не часть CLI) и служебный каталог .qwen/ — мусор в git status.
- Что:
- удалён app.py; его единственная ценная идея (чанкование длинных файлов по паузам через ffmpeg silencedetect) описана в docs/backlog.md с рабочими константами.
- .qwen/ добавлен в .gitignore (по аналогии с .codex).
- Проверка:
- git status — дерево чистое, untracked-файлов нет.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Зачем:
- рабочие файлы конвейера (задачи-файлы) не должны попадать в дерево.
- Что:
- .scratch/ в .gitignore.
- Проверка:
- git status не показывает .scratch/.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Зачем:
- фича --install-menu была описана только в глубине README; верхний
список возможностей и инструкция для AI-ассистентов о ней не знали.
- Что:
- пункт «Из проводника Windows» в списке возможностей README со ссылкой
на раздел; команды раздела приведены к tool-установке (без uv run).
- строка context_menu.py в схеме архитектуры AGENTS.md.
- Проверка:
- вычитка README, переход по якорю раздела.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Зачем:
- запуск транскрипции правой кнопкой из проводника Windows без
терминала, для пользователей без прав администратора.
- Что:
- новый модуль context_menu.py: установка/удаление Transcribe.cmd
в папке SendTo (OEM-кодировка, CRLF, без реестра).
- флаги --install-menu / --uninstall-menu в cli.py с ранней
валидацией до load_config; files стал необязательным аргументом.
- раздел в README.md: установка, использование, ручное удаление
через shell:sendto, известные ограничения.
- Проверка:
- uv run pytest — 191 passed, 1 skipped.
- uv run transcribe --install-menu и правый клик → Отправить →
Transcribe на файле с кириллицей в имени.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
onnx-asr — pre-1.0 библиотека (текущая 0.11.x). Без верхней границы любой
minor-апдейт (0.12.x) или major (1.0.0) подгрузится автоматически и может
сломать совместимость API: для pre-1.0 SemVer не гарантирует обратную
совместимость даже на minor-bumps. Уже наблюдали это в первой итерации:
при smoke-тесте обнаружили расхождение API между ожидаемой и реальной
сигнатурой (cpu_preprocessing был removed, start_ts/end_ts → start/end).
Ограничиваем до compatible-release: >=0.11.0,<0.12.0. При появлении 0.12
обновим осознанно после проверки совместимости.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Эксперимент с DeepSeek V4 Pro: добавление onnx-asr бэкенда (Parakeet/GigaAM/
FastConformer) с независимой валидацией качества через agent-judge.
Реализация:
- backends/onnx_asr.py — третий pluggable backend через onnxruntime + Silero VAD.
- --device onnx с моделями gigaam-v3 (рекомендуется для русского) и parakeet-v3.
- _normalize_quantization() — маппинг compute_type → onnx-asr quantization
(int8/fp16 pass-through, float16→fp16, float32/fp32→None, остальные→ValueError).
- DEVICE_DEFAULTS для onnx, _VALID_DEVICES расширен.
Документация:
- ADR-006 — итоги: GigaAM v3 как best-CPU choice для русских встреч, Parakeet
непригоден для русского (воспроизведены три класса проблем из ADR-005), новый
класс ошибок Whisper medium на длинных файлах с тихими фрагментами.
- backlog.md — устойчивый список будущих экспериментов (GigaAM v3 RNN-T и др.).
Контекст эксперимента:
- ADR-005 (Opus, master) отклонил Parakeet на двух 15-мин файлах с тихим
микрофоном. ADR-006 повторяет на 22-81-мин файлах + добавляет GigaAM.
- Реализация прошла три фазы валидации: smoke-test (4 mock-API расхождения
→ fix), agent-judge на 9 транскриптах (подтверждение проблем Parakeet,
обнаружение Whisper-галлюцинаций), adversarial-review через GPT-5.5
(compute_type=float32 ломал onnx-загрузку → fix + 4 теста).
Не включено в merge: docs/superpowers/specs/ и plans/ от DeepSeek (stale
assumptions, итоговый канон в ADR-006; полные документы — в истории ветки).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
При adversarial review (gpt-5.5) обнаружено: пользователь с config
compute_type = "float32" и --device onnx падал на старте.
HARDCODED_DEFAULTS["compute_type"] = "float32", apply_device_defaults не
заменяет значение если оно есть в config — старая проверка
(compute_type in ("int8", "fp16", "float32")) пропускала "float32"
дальше как onnx_asr quantization, что заставляло искать несуществующий
файл с суффиксом _float32.
- _normalize_quantization() — explicit маппинг в onnx-asr quantization.
- float32/fp32 → None (unquantized loading в onnx-asr — это None, не строка).
- float16 → fp16 (CUDA-naming → onnx-asr-naming).
- int8/fp16 → pass-through.
- Неизвестные compute_type (например, int8_float32 от CTranslate2) → ValueError
вместо silent fallback на int8 — пользователь раньше получал не ту
модель без предупреждения.
4 новых теста: float32→None, fp32→None, float16→fp16, unknown→raises.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
В проекте не было общего файла для будущих идей: docs/plan.md — историческая
летопись (всё [x]), docs/gpu.md — потенциальные направления привязаны к GPU/CPU
производительности, открытые вопросы из ADR легко теряются среди следующих ADR.
Создан docs/backlog.md как канонический хаб для будущих экспериментов
с обоснованием, цифрами и ссылками на источники. Первые записи:
- GigaAM v3 RNN-T — потенциальная замена CTC-дефолта (WER 2.6% vs 13.2%
на сложных текстах, e2e_rnnt c пунктуацией, 70:30 vs Whisper-large-v3 LLM-judge)
- Canary 1B — multilingual + пунктуация на CPU
- Whisper medium галлюцинации на длинных файлах (chunk_length / pipeline-фильтры)
- Качественный pipeline для OpenVINO (давно зафиксировано в gpu.md)
- Включение onnx в --device auto после стабилизации
Все направления связаны ссылками на источники (ADR-006, gpu.md, публикации
SberDevices), чтобы при возврате к работе не пришлось воспроизводить контекст.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Переименовано из 005 в 006: на master уже есть ADR-005-parakeet-evaluation
от прошлого эксперимента (Opus, отклонение Parakeet), нумерация бы конфликтовала.
Качество замерено независимым agent-judge'ем по методологии ADR-005
на 9 транскриптах (3 файла × 3 backend), а не субъективными пометками
"Отлично/Хорошо" на одном файле, как в первой версии. Артефакты транскриптов
лежат в /mnt/c/ddmitry/Videos/OBS/ для верификации.
Подтверждены три класса проблем Parakeet из ADR-005 (Mm-hmm-редукция,
иноязычные вставки, искажение IT-терминов) на новом наборе файлов
с конкретными цитатами и таймкодами.
Обнаружен новый класс ошибок Whisper medium: галлюцинации на длинных
файлах с тихими фрагментами (до 17 минут потеряно на одном файле,
многоминутные повторы, приписывание несуществующих имён). Не описано
в ADR-005, потому что там были 15-минутные отрывки.
GigaAM v3 подтверждён как лучший backend для русских встреч на CPU
(summary utility 4/5 на всех файлах, единственный без потерь содержания).
Рекомендация в README уточнена: parakeet-v3 для русского не подходит,
openvino-cpu medium — только для встреч ≤30 мин с равномерной громкостью.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- Зачем:
- в README не было рекомендаций по выбору между gigaam-v3 и parakeet-v3.
- Что:
- добавлена таблица ONNX-моделей с RTFx, языками и пунктуацией.
- пример parakeet-v3 изменён на --language ru.
- рекомендации: gigaam-v3 для скорости, parakeet-v3 для пунктуации.
- Проверка:
- uv run pytest -q (172 passed).
- Зачем:
- задокументировать результаты сравнения gigaam-v3 vs OpenVINO на CPU.
- Что:
- таблица скорости по 3 файлам (3-5x ускорение).
- сравнение качества русской речи с GPU faster-whisper.
- решение: оставить бэкенд как экспериментальный (--device onnx).
- Проверка:
- просмотр docs/adr/005-onnx-asr-backend.md.