fix(release): v0.1.0 build — scipy/sklearn missing + wake-word failure loop #14

Closed
opened 2026-08-11 16:49:31 +03:00 by slaid098 · 0 comments
Owner

Контекст

Релиз v0.1.0 собран (PR #12, #13), но exe не запускается на Windows. PyInstaller не включил транзитивные зависимости openwakeword (scipy 1.18.0, scikit-learn 1.9.0). При запуске — ModuleNotFoundError: No module named 'scipy._external.array_api_compat.numpy.fft'. Модель wake-word не грузится.

Дополнительно: при ошибке загрузки детектора cli.py:while True бесконечно повторяет speak("Модель активации не загружена.") каждые ~2 сек. Failure не кэшируется — retry на каждом цикле.

Задача

  1. release.yml: добавить --collect-all scipy и --collect-all scikit-learn в PyInstaller команду
  2. wake_word.py: кэшировать failure загрузки — после первой неудачи НЕ повторять Model(...) на каждом цикле
  3. cli.py: при detector is None — логировать fatal и sys.exit(1), не входить в бесконечный цикл

Контракты

  • OpenWakeWordDetector.__init__: после первой неудачной попытки Model(...)self._load_failed = True, при повторных вызовах конструктора сразу return без retry
  • active_wake_word_detector(): если детектор не загрузился, кэшировать это состояние (модуль-level флаг _load_failed), не создавать новый OpenWakeWordDetector() на каждом вызове
  • cli.py: после preload_wake_word_detector() проверить active_wake_word_detector() is Nonelogger.critical(...) + sys.exit(1)

Инварианты

  • Поведение при успешной загрузке НЕ меняется
  • is_available() по-прежнему возвращает bool по self._model is not None
  • Логи остаются на русском
  • Тесты (217+) должны оставаться зелёными; добавить новые тесты для failure-caching

Граничные случаи

  • Файл wiki.onnx существует, но ONNX-рунтайм падает → failure кэшируется, exit
  • Файл wiki.onnx отсутствует → failure кэшируется, exit
  • Успешная загрузка с первого раза → кэш успеха, нормальная работа

Влияние на связанные компоненты

  • assistant.py:run_assistant_step()detector is None ветка остаётся, но не должна достигаться (cli.py exiting раньше)
  • release.yml — размер exe вырастет (~80MB scipy + ~30MB sklearn)
  • Тесты test_wake_word.py — нужно проверить mock-логику

Вне scope

  • Уменьшение размера exe (scipy/sklearn только нужные подмодули) — будущая оптимизация
  • Альтернатива openwakeword без scipy — будущая задача

Критерии приемки

  • uv run pytest — зелёные, +новые тесты
  • uv run ruff check / mypy — зелёные
  • В release.yml: --collect-all scipy + --collect-all scikit-learn
  • При ошибке загрузки wake-word — один лог + exit, не бесконечный цикл
## Контекст Релиз v0.1.0 собран (PR #12, #13), но exe не запускается на Windows. PyInstaller не включил транзитивные зависимости openwakeword (scipy 1.18.0, scikit-learn 1.9.0). При запуске — `ModuleNotFoundError: No module named 'scipy._external.array_api_compat.numpy.fft'`. Модель wake-word не грузится. Дополнительно: при ошибке загрузки детектора `cli.py:while True` бесконечно повторяет `speak("Модель активации не загружена.")` каждые ~2 сек. Failure не кэшируется — retry на каждом цикле. ## Задача 1. `release.yml`: добавить `--collect-all scipy` и `--collect-all scikit-learn` в PyInstaller команду 2. `wake_word.py`: кэшировать failure загрузки — после первой неудачи НЕ повторять `Model(...)` на каждом цикле 3. `cli.py`: при `detector is None` — логировать fatal и `sys.exit(1)`, не входить в бесконечный цикл ## Контракты - `OpenWakeWordDetector.__init__`: после первой неудачной попытки `Model(...)` — `self._load_failed = True`, при повторных вызовах конструктора сразу return без retry - `active_wake_word_detector()`: если детектор не загрузился, кэшировать это состояние (модуль-level флаг `_load_failed`), не создавать новый `OpenWakeWordDetector()` на каждом вызове - `cli.py`: после `preload_wake_word_detector()` проверить `active_wake_word_detector() is None` → `logger.critical(...)` + `sys.exit(1)` ## Инварианты - Поведение при успешной загрузке НЕ меняется - `is_available()` по-прежнему возвращает bool по `self._model is not None` - Логи остаются на русском - Тесты (217+) должны оставаться зелёными; добавить новые тесты для failure-caching ## Граничные случаи - Файл wiki.onnx существует, но ONNX-рунтайм падает → failure кэшируется, exit - Файл wiki.onnx отсутствует → failure кэшируется, exit - Успешная загрузка с первого раза → кэш успеха, нормальная работа ## Влияние на связанные компоненты - `assistant.py:run_assistant_step()` — `detector is None` ветка остаётся, но не должна достигаться (cli.py exiting раньше) - `release.yml` — размер exe вырастет (~80MB scipy + ~30MB sklearn) - Тесты `test_wake_word.py` — нужно проверить mock-логику ## Вне scope - Уменьшение размера exe (scipy/sklearn только нужные подмодули) — будущая оптимизация - Альтернатива openwakeword без scipy — будущая задача ## Критерии приемки - `uv run pytest` — зелёные, +новые тесты - `uv run ruff check` / `mypy` — зелёные - В release.yml: `--collect-all scipy` + `--collect-all scikit-learn` - При ошибке загрузки wake-word — один лог + exit, не бесконечный цикл
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
slaid098/voice_assistant#14
No description provided.