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

Редактор ASR/TTS в Gateway

Код: src_api_gateway/text_editor.py, общий исполнитель model_tests.py. Модель: qwen35-2b из закреплённого каталога, промпт text_editor_prompt.txt (gemma-e4b-tuned). Сервер добавляет ASR либо TTS; отправляются только system и текущий user. 8K, think=false, temperature=0, seed=42, максимум 512 токенов.

Потоки

  • Финал ASR конкретной панели: Gateway → редактор → запись delivery → личное событие ui → панель → Agent. Архив result и Compare сохраняют исходный ASR. original_text раскрывается в новой панели. Новая квитанция дополнительно содержит source_text_sha256; старая остаётся совместимой. Обе сверяются с доверенными result/delivery, а не с произвольным текстом клиента.
  • Финал Agent сначала публикуется в чат. Независимая задача передаёт текущий вопрос и ответ редактору, затем существующему TTS worker. Успешный текст передаётся без изменений с prepared=true; worker пропускает нормализацию чисел. Старые отправители и fallback продолжают прежнюю обработку.
  • Пустой/незавершённый ответ, сбой и бюджет 5 с (включая очередь/метаданные) возвращают исходный текст с причиной. Повтора модели нет. При отмене выполняющийся upstream дочитывается до завершения: слот не освобождается по одному только тайм-ауту пользователя.
  • Одна FairPool 1+3 на экземпляр Gateway, общая с model-test/MCP. Глобальную распределённую очередь это не создаёт; штатный Gateway запускается одной репликой. Несколько Gateway потребуют отдельного решения для общего допуска.

Monitor и доступ

/monitor/asr, /monitor/tts: общий черновик промпта, независимые поля/результаты, точный запрос, сырой ответ, метрики и необязательный эталон. Тест не меняет чат. Прослушивание только по кнопке; Agent не вызывается. Входы тестов хранятся в существующем ограниченном кеше ModelTests, без новой таблицы результатов.

Команда chat.ui.<client_id>.cmd.text_editor доступна только подписанному профилю web. Actions: config/save/start/get/cancel/preview/control. Исходящие результаты используют .events.model_test, звук — .events.speech. Только control.position допускает уведомление без reply; остальные требуют RPC. Extension/widget/replay и MCP не получают сохранение настройки. Чтение/отмена запуска и preview требуют его владельца. Прослушивание использует существующие проверки context_id, connection_id, request_id и speech_id.

save требует revision, system_prompt и enabled. Единственная строка voice_editor_settings хранит текущий промпт/ревизию/флаг. Конфликт возвращает editor_revision_conflict. Остальные экземпляры обновляют кеш раз в 5 с; выполняющийся вызов сохраняет свой снимок. DDL идемпотентный, как у AudioStore; новая nullable audio_phrases.delivery не меняет raw result.

Живые вызовы пишут в существующий Monitor stage=text_editor: source, question, ответ, fallback, revision, точный запрос и метрики. Тестовые промпты через text_editor не журналируются. stage=speech хранит переданный синтезатору текст.

Поставка и откат

  1. Сохранить старые digest и пройти ревью DDL/доступа/интеграции.
  2. Собрать совместимый worker; адресно обновить под штатным drain. Не запускать вторую копию на занятом MIG. Модель, голос, зависимости и раздел GPU прежние.
  3. Gateway с CI_VOICE_EDITOR_ENABLED=0 (env контейнера VOICE_EDITOR_ENABLED=0) на время поэтапного обновления, затем Front и пакет расширения 2.8.0. ID/permissions/CSP прежние. Старые панели работают, но не показывают раскрытие оригинальной реплики.
  4. Проверить вкладки, один живой ASR и TTS, отмену и квитанции. Разрешать живую редактуру только после явного решения по качеству выбранного промпта.
  5. Откат: enabled=false через Monitor, либо CI_VOICE_EDITOR_ENABLED=0 через адресный refresh Gateway. Исходный ASR и прежняя подготовка TTS сохраняются. Для отката к прежнему коду вернуть digest Gateway/Front; nullable колонка и настройка не мешают старому коду.

Проверка качества 13.11.2026

Восемь коротких живых запросов к закреплённому Qwen2B через существующий Ollama-прокси завершились технически. Первый занял 3,73 с, следующие 0,64–0,92 с (редактор целиком, не время до слышимого звука). GPU-размещение подтверждено. Однако ответы содержат метки ASR/TTS, неисправленные аббревиатуры, повтор вопроса и цифры в TTS. Исторический набор с тем же промптом уже имел 6 полных успехов, 41 частичный и 3 провала; такие оценки нельзя считать подтверждением качества для автоматического изменения команд пользователя.

Скрытых исправлений результата нет. Доставка/очередь/сохранение проверяются отдельно от качества текста. Просодия, первый слышимый звук и опубликованный полный путь требуют приёмки после поставки; улучшение ударений не заявляется.

Исходник

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