JEV Voice Gate

September 20, 2026 · View on GitHub

Локальная схема голосового входа без фиксированного wake word. Она использует:

микрофон → VAD → аудиофильтр → локальный Whisper → фильтр качества ASR
→ OpenJev → сигнал принятия → Hermes / другой агент

Это не гарантированная замена wake word. OpenJev оценивает текст после распознавания, а не намерение по аудио. Whisper может галлюцинировать текст на шуме. Поэтому автоматический доступ к инструментам нельзя включать, пока не проверены реальные ложные срабатывания в вашей комнате.

Что лежит в репозитории

  • docs/setup-macos.md — пошаговая установка на Apple Silicon.
  • docs/gating.md — правила принятия, пороги, диалоговый контекст и калибровка.
  • docs/safety.md — риски, приватность, безопасный доступ к инструментам.
  • src/jev_gate.py — изолированный пример двух текстовых проверок OpenJev.
  • requirements.txt — Python-зависимости; весов моделей здесь нет.

Модели: скачать отдельно

В репозитории нет моделей, аудиозаписей, API-ключей и Telegram-токенов.

Нужны минимум две модели:

  1. OpenJev, подкаталог qwen3.5-4b-nli — NLI/cross-encoder для проверки текста.
  2. MLX-вариант Whisper, например mlx-community/whisper-large-v3-turbo — локальный ASR для Apple Silicon.

Пример загрузки без Git LFS в проектную папку:

HF_HUB_DISABLE_XET=1 hf download AlexWortega/openjev --local-dir models/openjev
HF_HUB_DISABLE_XET=1 hf download mlx-community/whisper-large-v3-turbo --local-dir models/whisper-large-v3-turbo

Содержимое models/ намеренно исключено через .gitignore.

Безопасная логика принятия

Не задавайте JEV вопрос «эта фраза обращена к ассистенту?». Короткая бытовая фраза вроде «сколько будет два плюс два?» не содержит адресата, а модель не знает намерения говорящего.

Вместо этого используйте два режима:

  1. Нет активного диалога: «Является ли фраза вопросом или просьбой?»
  2. Активный диалог: «Является ли новая фраза продолжением предыдущей реплики и ответа?»

Активный контекст должен жить недолго (например, 45 секунд) и только в RAM. Для обоих режимов требуется одновременно:

P(entailment: да) >= 0.40
P(да) - P(нет) >= 0.22

Это стартовые параметры, не калиброванные вероятности. Соберите свои true/false-positive примеры и настройте их по фактической precision/recall.

Аудиосцена до STT

После VAD, длительности и RMS добавьте локальный нейтральный аудиофильтр. Например, MIT/ast-finetuned-audioset-10-10-0.4593 содержит AudioSet-классы для Speech, Conversation, Narration, monologue, Music, Television, Radio и шума.

Используйте только агрегированные категории:

  • speech = максимум оценок Speech, Conversation, Narration, monologue;
  • background_media = максимум Music, Background music, Television, Radio, Video game music;
  • noise = максимум Noise, Environmental noise, White noise, Pink noise, Wind noise (microphone), Traffic noise, roadway noise.

Начальное консервативное решение: пропускать дальше, если speech >= 0.35 и speech - max(background_media, noise) >= 0.15. Отбрасывать всё остальное до Whisper. Это эвристика AudioSet, не обученный специально классификатор «живой речи», поэтому её необходимо проверять на домашней речи, телевизоре, музыке и шуме.

Обязательные барьеры до JEV

JEV не исправляет плохой ASR. Перед ним отбрасывайте фрагмент, если:

  • VAD нашёл меньше ~0,6 секунды речи;
  • фрагмент слишком короткий или тихий;
  • Whisper не вернул сегментов;
  • avg_logprob < -0.55;
  • no_speech_prob > 0.40;
  • compression_ratio > 1.8.

Это не устраняет все ошибки. Оно лишь исключает часть шума, обрывков и очевидно недостоверных транскрипций.

Политика инструментов

Безопасный baseline: после принятия JEV агент отвечает без инструментов.

Если нужен отдельный голосовой режим с инструментами, добавьте редкое контрольное слово, например Кузьма или Кузя, и включайте инструментальные toolsets только при отдельном совпадении слова. Не используйте это как единственную защиту: ASR может ошибаться. Не включайте автоматический обход системных подтверждений (--yolo).

Минимальная проверка

После установки моделей:

python src/jev_gate.py --model-dir models/openjev --text 'Сколько будет два плюс два?'

Пример показывает решение для первого запроса. Для production-режима добавьте захват микрофона, VAD и локальный ASR из инструкции.

Лицензии и ответственность

Проверьте лицензии моделей и библиотек перед коммерческим использованием. Голосовые команды могут содержать персональные данные; не публикуйте транскрипции или логи без согласия говорящих.