Голосовые системы

Аудиодиагностика расширения 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 его не сообщила, интерфейс прямо показывает отсутствие данных, а не подставляет сетевую задержку.

Исходник

Скачать Markdown · К материалам исследования