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-токенов.
Нужны минимум две модели:
- OpenJev, подкаталог
qwen3.5-4b-nli— NLI/cross-encoder для проверки текста. - 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 вопрос «эта фраза обращена к ассистенту?». Короткая бытовая фраза вроде «сколько будет два плюс два?» не содержит адресата, а модель не знает намерения говорящего.
Вместо этого используйте два режима:
- Нет активного диалога: «Является ли фраза вопросом или просьбой?»
- Активный диалог: «Является ли новая фраза продолжением предыдущей реплики и ответа?»
Активный контекст должен жить недолго (например, 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 из инструкции.
Лицензии и ответственность
Проверьте лицензии моделей и библиотек перед коммерческим использованием. Голосовые команды могут содержать персональные данные; не публикуйте транскрипции или логи без согласия говорящих.