refactor(tts): remove Piper TTS provider #9
Labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
slaid098/voice_assistant#9
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Контекст
Piper TTS — устаревший провайдер. Vosk TTS — более качественная модель (5 спикеров, ONNX). Piper занимает ~60 МБ в релизе, усложняет dispatch и preload логику. Пользователь решил полностью удалить Piper TTS из проекта. Остаются два провайдера: Google (cloud) + Vosk TTS (local).
Затронуто ~15 файлов: код, тесты, конфиги, документация, release workflow.
Задача
Полностью удалить Piper TTS из проекта. Все изменения ниже:
1. Удалить файлы
src/voice_assistant/speech/providers/piper_tts.py— удалить целиком (117 строк, классPiperTTSProvider, синглтонpiper_tts)tests/test_piper.py— удалить целиком (41 строка, 3 теста)2.
src/voice_assistant/speech/tts.pyfrom voice_assistant.speech.providers.piper_tts import piper_tts(стр. 13)_active_providers()(стр. 92-104). Новая логика:preload_piper()целиком (стр. 171-191)3.
src/voice_assistant/speech/model_loader.pypiper_model_path()иpiper_config_path()(стр. 35-42)4.
src/voice_assistant/config.pypiper_model: str(стр. 51)piper_model=os.getenv("PIPER_MODEL", ...)(стр. 207)5.
src/voice_assistant/cli.pypreload_piperиз импорта (стр. 15):from voice_assistant.speech.tts import preload_piper, speak→from voice_assistant.speech.tts import speakpreload_piper(wait=True)(стр. 53)if settings.tts_provider == "vosk":→if settings.tts_provider in {"vosk", "auto"}:preload_vosk_tts()уже блокирующая (синхронная) — STARTUP звук играет после загрузки модели6. Docstrings (убрать упоминания Piper)
src/voice_assistant/audio/sounds.py:58—Google → Piper → звук ошибки→Google → Vosk → звук ошибкиsrc/voice_assistant/speech/providers/base.py:10—Piper, Silero, RHVoice→Vosk TTS, Silero, RHVoicesrc/voice_assistant/speech/providers/vosk_tts.py:6—общий с Piper→ убратьsrc/voice_assistant/speech/text_normalize.py:4—Piper ru_RU-irina,→ убрать7. Тесты
tests/test_model_loader.py— удалитьtest_piper_model_pathиtest_piper_config_path(стр. 28-43)tests/test_tts.py— переименоватьmock_piper→mock_localв 4 тестах (стр. 26-69, 111-124). Тесты мокают_active_providersнапрямую, логика не меняетсяtests/test_cli.py— удалить мокmock_piper(стр. 27-28) и проверкуmock_piper.assert_called_once_with(wait=True)(стр. 35-36).monkeypatch.setattr(cli_mod, "preload_piper", ...)упадёт сAttributeErrorесли не убрать —preload_piperбольше не существуетtests/test_config.py:23-26— заменитьTTS_PROVIDER=piper→TTS_PROVIDER=voskв тестеtest_settings_tts_provider_from_env8. Зависимости
pyproject.toml:28— удалить"piper-tts>=1.4.0",uv lockдля перегенерацииuv.lock(НЕ редактировать вручную)9.
.env.templatepiperиз спискаTTS_PROVIDER, обновитьautoописание:PIPER_MODEL=ru_RU-irina-medium.onnx10.
.github/workflows/release.yml--collect-all piperиз PyInstaller команды (стр. 66)11. Документация
README.md:54— убратьpiperизTTS_PROVIDERвариантовREADME.md:56— удалить строкуPIPER_MODELAGENTS.md— обновить 7 строк (см. детальный список ниже в контрактах)12.
.gitignoresrc/voice_assistant/assets/sounds/voices/*.onnxи*.onnx.json— устаревшие пути PiperКонтракты
autoрежим (PRODUCT DECISION)auto→[piper, google](local=piper основной, cloud fallback)auto→[vosk, google](local=vosk основной, cloud fallback) — симметрично STTautopiperкак значениеTTS_PROVIDER— больше не валидно. Приpiperfallback на google (через default branch в_active_providers)Blocking preload (PRODUCT DECISION)
preload_vosk_tts()— уже синхронная (блокирующая), НЕ использует threadingSound.STARTUPдолжен играть ПОСЛЕ загрузки Vosk TTS модели (дляvosk/autoрежимов)googleрежима — STARTUP играет послеpreload_wake_word_detector()(нет local TTS модели для preload)AGENTS.md изменения (7 строк)
tts.py (gTTS/Piper + pygame)→tts.py (gTTS/Vosk + pygame)piper_tts.pyиз списка providersPiper + Vosk STT + Vosk TTS loaded→Vosk STT + Vosk TTS loadedgoogle / piper / vosk / auto→google / vosk / autoPIPER_MODELстрокуGoogle (cloud) + Piper (local, ONNX) + Vosk TTS (local, ONNX)→Google (cloud) + Vosk TTS (local, ONNX)models/piper/строкуCHANGELOG.md — НЕ ТРОГАТЬ
История CHANGELOG будет обнулена в отдельном PR (issue про release pipeline v0.1.0). В этом PR CHANGELOG не меняется.
Инварианты
TTSProviderProtocol вproviders/base.pyне меняетсяvosk_ttsсинглтон вvosk_tts.pyне меняетсяconftest.pyне меняются (моков piper там нет)ci.ymlне меняется (piper там не упоминается)scripts/gen_phrases.pyне меняется (использует Google TTS, не Piper)threadingимпорт вcli.pyостаётся (используется в_crash_handlerчерезthreading.Timer)Граничные случаи
TTS_PROVIDER=piperв .env пользователя — после обновления fallback на google (default branch). Не падать, молча использовать googlepreload_vosk_tts()приTTS_PROVIDER=google— НЕ вызывается (условиеin {"vosk", "auto"})ensure_vosk_tts_modelимпорт вcli.py:13— проверить, используется ли он. Если да — оставитьuv.lock— перегенерировать черезuv lock, НЕ редактировать вручнуюtest_speak_fallback_to_piper→ переименовать вtest_speak_fallback_to_local, мокать vosk_tts вместо piper_ttsВлияние на связанные компоненты
tts.py— dispatch логика упрощается (3 режима вместо 4)cli.py— preload последовательность меняется (убрать Piper, расширить Vosk условие наauto)config.py—Settingsdataclass теряет полеpiper_modelmodel_loader.py— теряет 2 функции (piper_model_path,piper_config_path)release.yml— убирается шаг скачивания Piper модели (~60 МБ экономии в сборке)pyproject.toml— убирается зависимостьpiper-tts(уменьшение dep-дерева)Вне scope
preload_vosk_ttsв threading-модель (не нужен — уже блокирующая)Критерии приемки
piper_tts.pyудалёнtest_piper.pyудалёнpiper-ttsубран изpyproject.toml,uv.lockперегенерирован_active_providers()переписан:auto→[vosk, google],piperзначение невалидноpreload_piper()удалена изtts.pycli.py:preload_piper(wait=True)убран, условие Vosk TTS расширено наautoconfig.py: полеpiper_modelиPIPER_MODELзагрузка удаленыmodel_loader.py:piper_model_pathиpiper_config_pathудалены.env.template:PIPER_MODELудалён,piperубран изTTS_PROVIDERrelease.yml: шаг скачивания Piper и--collect-all piperудалены.gitignore: мёртвые Piper паттерны удаленыREADME.mdиAGENTS.mdобновленыmock_piper→mock_local,test_config.pyfix)uv run ruff check src/ tests/— зелёныйuv run ruff format --check src/ tests/— зелёныйuv run mypy src/— зелёныйuv run pytest— зелёный, покрытие ≥75%uv run xenon --max-absolute B --max-modules B --max-average A src/— зелёный