Выбрать единицу привязки спикера к тексту #14
Notifications
Due Date
No due date set.
Blocks
Depends on
#15 Формат транскрипта со спикерами
ddmitry/local-transcriber
#16 UX диаризации: флаг, число участников, зависимость и поведение на OpenVINO
ddmitry/local-transcriber
#17 Свести решения карты в ADR и спеку
ddmitry/local-transcriber
#21 Параллельный запуск ASR и диаризации: политика и бюджет CPU
ddmitry/local-transcriber
#11 Чистота ASR-сегментов: подтвердить долю загрязнённых на трёх записях
ddmitry/local-transcriber
#12 Проверить границы диаризации на слух
ddmitry/local-transcriber
#13 Производительность диаризации на целевом Intel Core i5
ddmitry/local-transcriber
Reference: ddmitry/local-transcriber#14
Reference in New Issue
Block a user
Часть карты: Карта: диаризация спикеров в транскрипте (#8)
Question
Делаем ли мы диаризацию — и если да, к чему приписывается метка говорящего?
Это главная развилка карты, и решение принимается сразу по двум вопросам:
стоит ли функция своей цены и в какой форме её строить. Схема из бэклога —
мажоритарный спикер на весь ASR-сегмент — разведкой не подтвердилась.
Варианты:
onnx-asrотдаёт потокенные таймкоды(
TimestampedResultсtimestamps,tokens,logprobs), сегмент режется награнице токена при смене говорящего. ASR по-прежнему видит длинное аудио, так
что контекст RNN-T и пунктуация не страдают. OpenVINO GenAI 2026.x upstream
уже отдаёт word-level timestamps на CPU/GPU/NPU, но проектный backend сводит
результат к chunk-сегментам. Цена — протокол
Backend/TranscribeResult,вероятно, придётся сделать timestamp-aware;
гарантирована конструкцией, но короткие куски лишают RNN-T контекста и портят
пунктуацию — ровно то, ради чего в ADR-006 выбрана модель
e2e-rnnt;чистоту и предупреждать в шапке — так проект уже поступает с повторами и
потерей хвоста (
quality.py, маркеры «Внимание»);времени обработки плюс две модели в зависимостях. Если замер на целевом i5
окажется тяжёлым, а доля загрязнённых сегментов на других записях — низкой,
этот вариант становится честным ответом. Тогда разрыв с облаком по разделению
говорящих остаётся, а
formatter.pyполучает только более дешёвую ручкунарезки абзацев.
Решение опирается на замеренную долю загрязнённых сегментов, на проверку границ
на слух и на стоимость на целевом железе. Research о жизненном цикле движков
показал, что ограничение OpenVINO-пути лежит в проектной интеграции, а не в
движке. Это не блокирует выбор: решение должно назвать нужное изменение
контракта таймкодов, а fallback-поведение остаётся тикету про UX.
Ответ фиксирует, делаем ли мы диаризацию, выбранную единицу привязки,
отклонённые варианты с причинами и то, какие изменения в протоколе бэкендов
потребуются.
Решение
Диаризацию делать как явно включаемую функцию. Изначально она выключена; вопрос о включении по умолчанию пересматривается после реализации и пользовательского тестирования.
Единица привязки говорящего — слово с временной привязкой. Слово здесь не становится единицей запуска ASR: модель по-прежнему распознаёт целый сегмент распознавания, сохраняет контекст RNN-T, согласование и пунктуацию. Backend-специфичные токены или words приводятся к каноническим словам с положением на временной шкале; каждому слову назначается говорящий, соседние слова одного говорящего затем образуют реплику.
Проход распознавания и проход диаризации независимо получают одно аудио. Ни один не принимает результат другого; их результаты совмещаются только после завершения обоих. Поэтому первая реализация может быть последовательной, не блокируя будущий параллельный запуск.
Изменение общего контракта
Отклонённые варианты
Параллельная оркестрация, распределение CPU-потоков и условия последовательного fallback выносятся в отдельный тикет. Отображение перекрывающейся речи и пунктуации на границе реплик остаётся тикету про формат.
Канонические термины добавлены в
CONTEXT.md: коммит26d4ca2.