Аудиодиагностика расширения 1.2.5
Кнопка «Аудио» в панели открывает audio-diagnostics.html расширения и выбирает
поток этой панели. Страница видит только владельцев текущего Chrome. Открытие
не получает микрофон, не создаёт NATS-соединение и не занимает аудиослот.
Каждая привязка панели владеет отдельным клиентом аудио, CaptureController, AudioContext, устройством, настройками обработки, порядком PCM и завершением. Core сохраняет максимум три подключения и одно подключение на session_id. Один физический микрофон можно включить в нескольких панелях: речь попадёт в каждую включённую сессию. Питание с выключенным микрофоном занимает слот. Общий сохранённый deviceId используется как начальный выбор; действующий захват другой вкладки не меняется. UUID страницы остаётся в sessionStorage.
Сигнал и наблюдения
Локальный PCM до NATS измеряется без второго захвата. Waveform/RMS обновляются
до 20 Hz, ingress после ресемплинга — до 10 Hz; спектрограммы — до 5 Hz,
счётчики скорости и очереди — раз в секунду. История появляется только при
наблюдении и ограничена 15 минутами. Нет сэмплов — нет значения, а не тишина.
Каждый обычный захват получает отдельный локальный документ microphone-input.html
внутри offscreen. Это исключает повторное использование Chromium одного APM-источника
разными владельцами одного устройства. Документ не содержит скриптов, AudioContext,
транспорта и обработчиков сообщений; новая привилегия или серверный слот не нужны.
Он создаётся только при включении микрофона и удаляется при выключении, ошибке и закрытии.
NS/EC/AGC применяются кратким переоткрытием только выбранного входа в свежем документе:
точные настройки, тот же deviceId, затем проверка getSettings. Живая дорожка через
applyConstraints не меняется. Нет совпадения — нет подтверждения применения.
Старая дорожка останавливается до нового getUserMedia.
AudioContext, NATS-соединение, stream_id и другие владельцы сохраняются. Позднее
разрешение после mute/закрытия не возобновляет микрофон. Изменения живут в аудиосеансе.
При отказе настройки переключатели возвращаются к последним фактическим
значениям либо показывают отсутствие дорожки. Отказ NS/EC/AGC показывается как
ошибка обработки с названием отклонённого параметра, если Chrome его предоставил;
он не подменяется channel_failed или сообщением о пропавшем устройстве.
Фактический deviceId в текст ошибки не выводится. Отдельный режим audio-quality
использует прежний захват. После завершения потока или потери соединения управление блокируется.
Явно отсутствующие измерения RMS разрывают линию графика.
Список каналов содержит фактический subject, протокол, отправителя, получателя, наблюдавший сервис и независимые счётчики. Номера разных переходов не сравниваются: ресемплинг/VAD меняют пакеты. Для PCM показывается только заголовок, для ASR — реальные JSON partial/final/rejected/error. По времени доступны последние 1000 наблюдений; сами PCM-пакеты представлены счётчиками. Исходники — ссылки main, а не историческая provenance. Credentials не включаются в эти наблюдения.
Конечный протокол
Профиль extension с ролью audio дополнительно получает только свою команду
chat.audio.<client_id>.cmd.audio_diagnostics. Действия:
attach, detach, capture_start, capture_stop, capture_read, capture_release.
Внутренняя команда страницы capture_cancel использует существующий NATS
capture_release; нового серверного действия или обновления сервера не требуется.
Обязательны stream_id и diagnostic_id; для capture-действий — capture_id.
Gateway восстанавливает проверенную привязку, ingress проверяет владельца.
Клиент не задаёт внутренние subjects, путь файла или SQL.
Core возвращает фактический asr_result_subject в существующем приватном ACK
admission. Ingress подписывается на этот точный маршрут через имеющееся ASR
соединение. Старый Core без этого поля не подменяется guessed prefix: аудио
работает, диагностика возвращает audio_diagnostics_upgrade_required.
Необязательное поле diagnostics обычных PCM metadata содержит версию, ID,
ограниченный срок наблюдения и, при записи, ID/срок capture. Bridge и worker
делают пассивные копии и возвращают сообщения отдельного типа audio_diagnostic
по существующим ASR result subjects. Ingress отправляет их только владельцу
в .events.audio. Core отбрасывает этот тип до журналирования/dispatch.
Никаких дополнительных model calls, подписки > на весь трафик или PostgreSQL
хранилищ нет. Диагностические команды и данные исключены из nats_log.
/monitor/audio, monitor source:audio и прежние три приватных monitor RPC
удалены. Прочие представления Monitor и существующий журнал ASR сохраняются.
Образцы
Новые образцы появляются сверху, включая текущую запись. Кнопка «Отмена» рядом
с «Остановить и собрать» доступна во время запуска, записи и сбора окон Whisper.
Она удаляет только текущий образец из памяти страницы и освобождает его временный
серверный сбор существующим capture_release. Микрофон, ASR, другие потоки и уже
готовые образцы продолжают работать. Отмена привязана к capture_id; поздние ACK
и фрагменты отменённого образца не восстанавливают его. Отказ подтверждения
освобождения показывается явно, без повторной отправки звука.
У настроек и действий есть подсказки при наведении и клавиатурном фокусе. Они объясняют NS/EC/AGC, фактические значения, окно графиков, единицы измерения, микрофон, питание и действия с образцами. Escape закрывает подсказку.
Явная запись одного выбранного потока длится до 60 секунд. Точки: PCM браузера, вход ingress, выход ingress 16 kHz, реальные входы decoder. Decoder экспортирует исходный float32le для каждого partial/final отдельно, с phrase_id, window, offset_samples и признаком final/prefinal. Повторное использование гипотезы ссылается на исходное окно без повторного inference. Окна перекрываются и могут включать контекст до старта записи. Для LinTO внутренний decoder не инструментируется и явно недоступен.
Остановка образца не означает END/speech_end. Экспорт начатых окон собирается до 20 секунд; отсутствие final допустимо и видно в manifest. Ограничения: 128 MiB на capture, 256 MiB на страницу, ограниченные очереди. Потери, пропуски, превышение лимита и ошибки SHA-256 обозначаются явно; PCM не повторяется. После окончания сбор освобождается; недочитанные данные имеют ограниченный срок. Ожидание первого подтверждения также занимает единственную запись образца. Ошибка доставки или сбора останавливает только образец; она не мешает закрыть обычный аудиосеанс. Ошибка локального фрагмента сохраняет признак неполноты в итоговом manifest, даже если остальные точки записи присутствуют. Окончание серверного сбора не означает окончание чтения: клиент дочитывает все порции до total_records и только затем освобождает серверный образец.
Вкладка хранит образцы только в памяти. Закрытие/reload удаляет их и останавливает диагностику, сохраняя обычный звук. Скачанные WAV/ZIP остаются у пользователя. WAV сохраняет PCM16 или IEEE float32. ZIP включает manifest.json, отдельные перекрывающиеся окна, участки непрерывного PCM без заполнения потерь нулями и автономный report.html с проигрывателями. Не все точки/фрагменты — неполный ZIP.
Audio-quality остаётся отдельным исследовательским режимом: обычная диагностика не включает его профили, normalization, обход admission или повторное ASR.
Ошибка доступа
Истечение доступа останавливает захват и один раз отправляет ограниченный abort по существующему соединению, затем закрывает его. Если END уже отправлен, сохраняется ограниченное ожидание его ответа. PCM и команды не повторяются. Ошибка получения доступа до WSS отдельно предлагает проверить штатный вход и сеть; она не доказывает отказ микрофона или ASR. Последующее закрытие транспорта не заменяет первичную причину общей ошибкой NATS. В панели ошибка аудио и действие входа показаны отдельно от состояния текстового канала.
GigaAM и время повтора (1.5.0)
Monitor Audio и файловая диагностика предлагают gigaam_v3 — GigaAM-v3 e2e_rnnt.
Веса закреплены в voice worker, обычное live ASR и audio-quality не переключаются.
Для WAV выполняется один вызов, для replay — прежний ingress/VAD/streaming путь.
GigaAM не возвращает оценки Whisper или интервалы слов; эти данные отсутствуют,
а непустой текст отмечается принятым без выдуманного порога уверенности.
Replay сохраняет все пакеты и внутренние интервалы исходного потока в темпе 1×. Начальная предзагрузка ограничена двумя секундами PCM, дальнейший буфер — 2 MiB. Время подключения до первого PCM и после последнего PCM не воспроизводится. Паузы между реально отправленными пакетами остаются. Показываются отдельные длительности подготовки, предзагрузки/подключения, подачи PCM и завершения ASR, а также общее время до освобождения подключения. После подтверждённого END дополнительный ABORT не отправляется. При отмене/ошибке прежний ABORT сохраняется. Длинная исходная запись по-прежнему требует времени 1×; результат выбранной фразы не означает, что остальная исходная запись была вырезана.
Оценка результата и время модели
Раздел «Оценка» показывает непустоту текста, avg_logprob, no_speech_prob,
compression_ratio и конечность сохранённых чисел. Эти сведения не фильтруют
текст. Первое чтение наблюдений разделяет уже существующий запрос с перечнем
вызовов модели. Недоступные у backend или старой записи оценки не выдумываются.
Основной результат повтора берётся из итогового ASR-события, как в чате. Наблюдение отдельного Decoder-вызова не заменяет этот итог. «Чистое время распознавания речи» суммирует фактические вызовы модели для всех фраз выбранного диапазона, исключая ожидание очереди, передачу PCM и закрытие соединения. Повторно использованные окна не считаются вторым вызовом модели. LinTO передаёт свой собственный накопленный замер через существующий WebSocket; если старая версия backend его не сообщила, интерфейс прямо показывает отсутствие данных, а не подставляет сетевую задержку.