From 5a7fc0d613d8e2bf2ef76184d317ec9692c6de87 Mon Sep 17 00:00:00 2001 From: Dmitriy Dementiev Date: Fri, 10 Jul 2026 10:44:24 +0300 Subject: [PATCH] =?UTF-8?q?docs(backlog):=20=D0=BD=D0=B0=D0=BF=D1=80=D0=B0?= =?UTF-8?q?=D0=B2=D0=BB=D0=B5=D0=BD=D0=B8=D1=8F=20=D0=BF=D0=BE=20=D1=81?= =?UTF-8?q?=D1=82=D1=80=D1=83=D0=BA=D1=82=D1=83=D1=80=D0=B5=20=D1=82=D1=80?= =?UTF-8?q?=D0=B0=D0=BD=D1=81=D0=BA=D1=80=D0=B8=D0=BF=D1=82=D0=B0=20=D0=B8?= =?UTF-8?q?=D0=B7=20=D0=B2=D0=BD=D0=B5=D1=88=D0=BD=D0=B5=D0=B3=D0=BE=20?= =?UTF-8?q?=D1=80=D0=B5=D0=B2=D1=8C=D1=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Зачем: - внешнее сравнение с облачным Hypescribe показало: главный разрыв локальной транскрипции — не качество распознавания, а структура (спикеры 2/10 против 8/10); без диаризации MoM не собрать. - Что: - новый раздел «Структура транскрипта»: диаризация как опциональный пост-процессинг (sherpa-onnx vs pyannote, нужен ADR), ручка нарезки абзацев в formatter, словарь замен терминов как запасной план после бенчмарка RNN-T. - зафиксировано вне ядра CLI: LLM-чистка и сопоставление имён спикеров. - Проверка: - docs-only, тесты не затронуты. Co-Authored-By: Claude Fable 5 --- docs/backlog.md | 71 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 71 insertions(+) diff --git a/docs/backlog.md b/docs/backlog.md index a60fd85..7a885ed 100644 --- a/docs/backlog.md +++ b/docs/backlog.md @@ -82,6 +82,77 @@ --- +## Структура транскрипта (конспекты и MoM) + +Источник раздела: внешнее сравнение локального транскрипта (medium, +openvino-cpu, запись 25:59) с облачным сервисом Hypescribe, критерий — +пригодность как сырья для конспекта и протокола встречи (GPT-ревью, +2026-07-10). Итог: по смыслу локальная модель почти равна облаку +(6.5/10 против 7/10), главный разрыв — **не качество распознавания, +а структура**: разделение говорящих (2/10 против 8/10) и нарезка на +реплики. Приоритеты ревьюера: 1) смысл, 2) спикеры, 3) техтермины, +4) разбивка на фразы, 5) таймкоды. Вывод: локальная диаризация + +словарь терминов закрывают потребность в облачном сервисе для +внутренних встреч. + +Сознательно вне ядра CLI (максимум — рецепт в README): второй проход +LLM для чистки текста, сопоставление Speaker N с именами — это работа +поверх готового транскрипта. + +### Диаризация — разделение говорящих + +**Что:** Опциональный пост-процессинг (не четвёртый бэкенд): сегменты +уже несут таймкоды; диаризация даёт интервалы «кто когда говорил»; +merge по перекрытию интервалов; formatter ломает абзац на смене спикера +и подписывает `Speaker 1:`. Ставится как extra: +`uv sync --extra diarization`. + +**Почему:** Без спикеров MoM не собрать — это ключевой разрыв с облаком +по внешнему ревью, и никакое качество распознавания его не компенсирует. +Заодно естественно решает «разбивку на реплики» (приоритет №4). + +**Варианты реализации (ключевое решение, нужен ADR):** + +- **sherpa-onnx** — диаризация целиком на onnxruntime (сегментация + pyannote в ONNX + спикер-эмбеддинги), без torch, в духе нашего + onnx-стека и «no cloud, no API keys». +- **pyannote.audio** — стандарт качества, но тянет torch и требует + HF-токен с принятием лицензии моделей — трение с духом проекта. + +**Уточнить перед запуском:** качество обоих вариантов на русской речи +и перекрывающихся репликах; скорость на CPU (диаризация — второй проход +по всему аудио); лицензии моделей сегментации/эмбеддингов. + +--- + +### Ручка нарезки абзацев в formatter + +**Что:** «Минутные простыни» в транскрипте — не свойство модели, а наши +константы группировки `_PAUSE_THRESHOLD_S = 2.0` / `_MAX_PARAGRAPH_S = +60.0` в `formatter.py` (сырых сегментов много: 23-минутная запись — 360 +сегментов, ~4 с на реплику). Вынести в опцию/конфиг или уменьшить +дефолт. + +**Почему откладывается:** при диаризации абзацы будут ломаться по смене +спикера естественно — сначала решить с диаризацией, чтобы не делать +ручку, которая устареет. + +--- + +### Словарь замен технических терминов — запасной план + +**Что:** Пост-обработка текста сегментов словарём замен по границам слов +(`CSW → CSV`, `софтп → SFTP`, `ямлик → YAML`, `Spark и Scale → Spark +SQL`), словарь пользовательский в `.transcriber.toml`. + +**Почему запасной:** это тот же класс ошибок, что «кириллизация латиницы +и искажение имён» из [ADR-006](adr/006-onnx-asr-backend.md), и первым +его должен попробовать закрыть контекстный декодер GigaAM v3 RNN-T +(первый пункт бэклога). Заводить словарь — только если бенчмарк RNN-T +термины не вытянет. + +--- + ## Авто-детект и UX ### Включение `onnx` в `--device auto`