refactor(tts): remove Piper TTS provider #11

Merged
slaid098 merged 5 commits from refactor/tts/remove-piper into master 2026-08-11 15:12:11 +03:00
Owner

Что сделано

Полностью удалён Piper TTS провайдер:

  • Удалён src/voice_assistant/speech/providers/piper_tts.py и tests/test_piper.py
  • tts.py: убран импорт piper_tts, переписан _active_providers() (auto[vosk, google], vosk[vosk, google], google[google, vosk]), удалена preload_piper(), убран неиспользуемый threading импорт
  • model_loader.py: удалены piper_model_path() и piper_config_path()
  • config.py: удалено поле piper_model и загрузка PIPER_MODEL
  • cli.py: убран preload_piper из импорта и вызова, условие предзагрузки Vosk TTS расширено на auto (in {"vosk", "auto"})
  • Все docstrings очищены от упоминаний Piper (sounds.py, base.py, vosk_tts.py, text_normalize.py)
  • Тесты: удалены piper-тесты из test_model_loader.py, mock_pipermock_local в test_tts.py, удалён мок из test_cli.py, TTS_PROVIDER=pipervosk в test_config.py, исправлен len(providers) в test_vosk_tts.py (3 → 2, спека пропустила этот файл)
  • pyproject.toml: удалена зависимость piper-tts>=1.4.0, uv.lock перегенерирован
  • .env.template: убран piper из TTS_PROVIDER, удалён PIPER_MODEL
  • release.yml: удалён шаг скачивания Piper модели и --collect-all piper
  • README.md и AGENTS.md: обновлены (7 строк AGENTS.md)
  • .gitignore: удалены мёртвые Piper паттерны

Почему

Piper — устаревшая модель, Vosk TTS качественнее (5 спикеров vs 1). Piper занимал ~60 МБ в релизе и усложнял dispatch (4 режима вместо 3). Удаление упрощает логику и уменьшает размер сборки.

Watch out

Breaking change — TTS_PROVIDER=piper больше не валиден, fallback на google (default branch в _active_providers). uv.lock перегенерирован (удалены piper-tts и pathvalidate). Vosk TTS preload теперь работает и в auto режиме (раньше только vosk).

Pending

Release pipeline адаптация под Forgejo — issue #10. CHANGELOG не трогался (будет обнулён в следующем PR).

Closes #9

Closes #9

## Что сделано Полностью удалён Piper TTS провайдер: - Удалён `src/voice_assistant/speech/providers/piper_tts.py` и `tests/test_piper.py` - `tts.py`: убран импорт `piper_tts`, переписан `_active_providers()` (`auto` → `[vosk, google]`, `vosk` → `[vosk, google]`, `google` → `[google, vosk]`), удалена `preload_piper()`, убран неиспользуемый `threading` импорт - `model_loader.py`: удалены `piper_model_path()` и `piper_config_path()` - `config.py`: удалено поле `piper_model` и загрузка `PIPER_MODEL` - `cli.py`: убран `preload_piper` из импорта и вызова, условие предзагрузки Vosk TTS расширено на `auto` (`in {"vosk", "auto"}`) - Все docstrings очищены от упоминаний Piper (`sounds.py`, `base.py`, `vosk_tts.py`, `text_normalize.py`) - Тесты: удалены piper-тесты из `test_model_loader.py`, `mock_piper` → `mock_local` в `test_tts.py`, удалён мок из `test_cli.py`, `TTS_PROVIDER=piper` → `vosk` в `test_config.py`, исправлен `len(providers)` в `test_vosk_tts.py` (3 → 2, спека пропустила этот файл) - `pyproject.toml`: удалена зависимость `piper-tts>=1.4.0`, `uv.lock` перегенерирован - `.env.template`: убран `piper` из `TTS_PROVIDER`, удалён `PIPER_MODEL` - `release.yml`: удалён шаг скачивания Piper модели и `--collect-all piper` - `README.md` и `AGENTS.md`: обновлены (7 строк AGENTS.md) - `.gitignore`: удалены мёртвые Piper паттерны ## Почему Piper — устаревшая модель, Vosk TTS качественнее (5 спикеров vs 1). Piper занимал ~60 МБ в релизе и усложнял dispatch (4 режима вместо 3). Удаление упрощает логику и уменьшает размер сборки. ## Watch out Breaking change — `TTS_PROVIDER=piper` больше не валиден, fallback на google (default branch в `_active_providers`). `uv.lock` перегенерирован (удалены `piper-tts` и `pathvalidate`). Vosk TTS preload теперь работает и в `auto` режиме (раньше только `vosk`). ## Pending Release pipeline адаптация под Forgejo — issue #10. CHANGELOG не трогался (будет обнулён в следующем PR). Closes #9 Closes #9
test(tts): fix vosk active providers count after piper removal
All checks were successful
CI / lint (pull_request) Successful in 1m14s
CI / typecheck (pull_request) Successful in 1m15s
CI / complexity (pull_request) Successful in 33s
CI / test (3.12) (pull_request) Successful in 4m55s
CI / test (3.13) (pull_request) Successful in 4m57s
4b5e7b0385
Author
Owner

Code Review Summary

Чистый, хорошо исполненный PR — полное удаление Piper TTS провайдера. Все 22 файла корректно обновлены, 308 строк удалено, 38 добавлено. Piper-ссылки остались только в CHANGELOG.md (14 совпадений), что явно оговорено в PR body ("будет обнулён в следующем PR").

Positives

  • _active_providers() (tts.py:90-99) — логика переписана корректно: auto/vosk[vosk_tts, google_tts], google[google_tts, vosk_tts]. Невалидное значение piper попадает в fallthrough return [google_tts, vosk_tts] — safe fallback.
  • Vosk TTS preload (cli.py:55-58) — условие расширено на auto (in {"vosk", "auto"}), preload_vosk_tts() синхронная (vosk_tts.py:84-90, без threading), STARTUP (cli.py:61) играет строго после загрузки. Контракт "STARTUP after full init" сохранён.
  • threading импорт удален из tts.py (был нужен только для preload_piper), но оставлен в cli.py — используется threading.Timer в _crash_handler. Корректно.
  • uv.lock перегенерирован — удалены piper-tts и его транзитивная зависимость pathvalidate.
  • Тесты обновлены консистентно: test_piper.py удалён, mock_pipermock_local в test_tts.py, len(providers) == 2 в test_vosk_tts.py (было 3), TTS_PROVIDER=pipervosk в test_config.py.
  • Cross-file чистота — 0 readers удалённых символов во всём репо (piper_tts, preload_piper, piper_model_path, piper_config_path, piper_model, PIPER_MODEL, mock_piper). No from voice_assistant.speech.providers.piper imports.
  • Quality gates green: pytest 213 passed / 78.90% coverage (≥75%), ruff check , ruff format , mypy , xenon (CI flags --max-modules B) .
  • PR hygiene: title refactor(tts): remove Piper TTS provider — conventional format, body содержит все 4 heading'а осмысленно, Closes #9.

Suggestions (info, not blocking)

  • AGENTS.md:79 [docs] В команде указано uv run xenon --max-absolute B --max-modules A --max-average A, но CI (ci.yml:49) использует --max-modules B. Модули assistant.py и nlu/intent.py имеют rank B (pre-existing, не изменены в этом PR). Расхождение существовало до PR — можно выровнять в отдельном issue.
  • tests/test_cli.py:13-36 [test-robustness] Тест test_main_loop_handles_keyboard_interrupt не мокает settings.tts_provider и ensure_vosk_tts_model — полагается на default google для пропуска блока Vosk preload. Работает, но если default когда-либо сменится на vosk/auto, тест сломается. Pre-existing pattern, не введён этим PR.

Verdict: APPROVE

## Code Review Summary Чистый, хорошо исполненный PR — полное удаление Piper TTS провайдера. Все 22 файла корректно обновлены, 308 строк удалено, 38 добавлено. Piper-ссылки остались только в CHANGELOG.md (14 совпадений), что явно оговорено в PR body ("будет обнулён в следующем PR"). ### Positives - **`_active_providers()` (tts.py:90-99)** — логика переписана корректно: `auto`/`vosk` → `[vosk_tts, google_tts]`, `google` → `[google_tts, vosk_tts]`. Невалидное значение `piper` попадает в fallthrough `return [google_tts, vosk_tts]` — safe fallback. - **Vosk TTS preload (cli.py:55-58)** — условие расширено на `auto` (`in {"vosk", "auto"}`), `preload_vosk_tts()` синхронная (vosk_tts.py:84-90, без threading), STARTUP (cli.py:61) играет строго после загрузки. Контракт "STARTUP after full init" сохранён. - **`threading` импорт** удален из tts.py (был нужен только для `preload_piper`), но оставлен в cli.py — используется `threading.Timer` в `_crash_handler`. Корректно. - **uv.lock** перегенерирован — удалены `piper-tts` и его транзитивная зависимость `pathvalidate`. - **Тесты** обновлены консистентно: `test_piper.py` удалён, `mock_piper` → `mock_local` в test_tts.py, `len(providers) == 2` в test_vosk_tts.py (было 3), `TTS_PROVIDER=piper` → `vosk` в test_config.py. - **Cross-file чистота** — 0 readers удалённых символов во всём репо (`piper_tts`, `preload_piper`, `piper_model_path`, `piper_config_path`, `piper_model`, `PIPER_MODEL`, `mock_piper`). No `from voice_assistant.speech.providers.piper` imports. - **Quality gates green**: pytest 213 passed / 78.90% coverage (≥75%), ruff check ✅, ruff format ✅, mypy ✅, xenon (CI flags `--max-modules B`) ✅. - **PR hygiene**: title `refactor(tts): remove Piper TTS provider` — conventional format, body содержит все 4 heading'а осмысленно, Closes #9. ### Suggestions (info, not blocking) - **AGENTS.md:79** [docs] В команде указано `uv run xenon --max-absolute B --max-modules A --max-average A`, но CI (ci.yml:49) использует `--max-modules B`. Модули `assistant.py` и `nlu/intent.py` имеют rank B (pre-existing, не изменены в этом PR). Расхождение существовало до PR — можно выровнять в отдельном issue. - **tests/test_cli.py:13-36** [test-robustness] Тест `test_main_loop_handles_keyboard_interrupt` не мокает `settings.tts_provider` и `ensure_vosk_tts_model` — полагается на default `google` для пропуска блока Vosk preload. Работает, но если default когда-либо сменится на `vosk`/`auto`, тест сломается. Pre-existing pattern, не введён этим PR. ### Verdict: APPROVE
slaid098 merged commit 6f1963d29e into master 2026-08-11 15:12:11 +03:00
slaid098 deleted branch refactor/tts/remove-piper 2026-08-11 15:12:11 +03:00
Sign in to join this conversation.
No reviewers
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!11
No description provided.