Files
mrleo1nidandClaude Opus 5 a719980d74 Этап 4: слово активации через Vosk
- Фоновое прослушивание микрофона маленькой моделью Vosk, фразы настраиваются
- Свободное распознавание + требование устойчивой гипотезы: грамматика давала массу ложных срабатываний
- Пауза прослушивания, пока ассистент слушает команду, думает или говорит
- Модель скачивается с зеркала HuggingFace, проверка слов по словарю модели
- Переключатель в меню трея
- Тесты поиска фразы и фонового слушателя

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-17 03:56:32 +03:00

34 lines
1.4 KiB
Python

from agr_assistent.audio.wakeword import (
WakeWordMatcher,
contains_phrase,
normalize_phrase,
)
def test_normalize_phrase() -> None:
assert normalize_phrase(" Эй, Ассистент ") == ("эй", "ассистент")
def test_contains_phrase_matches_whole_words_in_order() -> None:
words = "слушай эй ассистент включи".split()
assert contains_phrase(words, ("эй", "ассистент"))
assert not contains_phrase(words, ("ассистент", "эй"))
assert not contains_phrase("ассистентка пришла".split(), ("ассистент",))
def test_partial_hypothesis_must_hold_for_several_updates() -> None:
matcher = WakeWordMatcher([("ассистент",)], required_streak=2)
assert not matcher.update_partial("ассистент")
assert not matcher.update_partial("ассистентка") # гипотеза исправилась — счёт сброшен
assert not matcher.update_partial("ассистентка ассистент")
assert matcher.update_partial("ассистентка ассистент какая")
def test_final_result_matches_immediately() -> None:
matcher = WakeWordMatcher([("эй", "ассистент")], required_streak=3)
assert matcher.update_final("ну эй ассистент")
assert not matcher.update_final("просто ассистент")