Files
Blind/docs/stack-analysis.md
T
2026-09-11 19:47:15 +03:00

98 lines
7.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Анализ стека — интерфейс для незрячего (AI Blind)
Дата: 2026-09-10. Принцип: только бесплатные / open-source библиотеки, каждый модуль —
законченная проверяемая единица. Целевая платформа — Windows (ПК отца), разработка — Linux/кроссплатформенный код.
---
## 1. Модуль STT (речь → текст)
| Кандидат | Версия | Лицензия | Русский | Скорость CPU | Комментарий |
|---|---|---|---|---|---|
| **faster-whisper** | 1.2.1 (окт 2025) | MIT | ✅ отлично | small/int8: 13 мин аудио ≈ 1 мин 42 с (i7-12700K) → короткая фраза 5 с ≈ 1–2 с | FFmpeg не нужен (PyAV внутри), Silero-VAD встроен, модель качается с HuggingFace автоматически |
| Vosk | стабильная | Apache 2.0 | ✅ (small-ru 45 МБ WER ~22–30%, big-ru 1.8 ГБ WER ~5–11%) | быстрее Whisper, стриминг | Запасной вариант для слабого ПК; точность small ниже |
| openai-whisper / transformers | — | MIT | ✅ | медленно на CPU | Не берём — быстрее-whisper строго лучше |
**Вердикт: faster-whisper**, модель `small` или `base` c `compute_type="int8"` на CPU.
- Для голосовых фраз 2–15 с задержка 1–3 с — приемлемо.
- Размер: small ≈ 460 МБ (int8 ~150 МБ в RAM), base ≈ 145 МБ.
- Фолбэк: Vosk small-ru, если ПК отца слабый (замерим на Module 1 и решим).
## 2. Модуль TTS (текст → звук)
| Кандидат | Версия | Лицензия | Русский | Онлайн/офлайн | Комментарий |
|---|---|---|---|---|---|
| **edge-tts** | 7.2.8 (мар 2026) | LGPL | ✅ ru-RU-SvetlanaNeural / DmitryNeural | онлайн (бесплатный сервис MS, без ключа) | rate/volume/pitch настраиваются → «−15% скорости» из ТЗ поддерживается нативно |
| **Piper** (`piper-tts`) | 1.8.0 (активно развивается, переехал в OHF-Voice/piper1-gpl) | GPL-3.0 | ✅ голоса ru_RU (denis, dmitri, irina, ruslan) | офлайн | Фолбэк: работает без интернета, быстрый на CPU |
**Вердикт: edge-tts основной + Piper фолбэк.** Риск edge-tts: неофициальный эндпоинт Microsoft,
исторически ломался (403). Архитектура TTS-модуля сразу делается с интерфейсом «провайдер»,
чтобы переключение на Piper было правкой конфига.
## 3. Модуль записи/воспроизведения звука
- **sounddevice 0.5.6** (авг 2026, свежий), MIT, PortAudio в комплекте, numpy-массивы.
- Запись push-to-talk: буфер в RAM пока удерживается клавиша → float32/int16 → wav в памяти.
- Воспроизведение: `sd.play()` / `sd.stop()` — мгновенная остановка для клавиши «Замолчи». Идеально.
- soundfile — для сохранения wav при отладке.
- **VAD: silero-vad 6.2.1** (фев 2026), MIT, ~2 МБ, <1 мс на чанк 30 мс, ONNX-режим.
Использование: отрезать тишину перед STT (меньше галлюцинаций Whisper), позже — режим «свободного разговора».
## 4. Модуль горячих клавиш
| Кандидат | Статус | Windows | Suppression | Комментарий |
|---|---|---|---|---|
| **keyboard 0.13.5** | мёртв с 2020, но стабильный и широко используемый | ✅ глобальный хук без админ-прав | ✅ (только Windows) | Умеет press/hold/release события — ровно то, что нужно push-to-talk |
| pynput | живой | ✅ | ❌ подавления нет | Запасной вариант |
**Вердикт: keyboard** (раскладка: дублируем NumPad и основные клавиши: Num0/Пробел — слушать,
NumDel/Esc — замолчать, NumEnter/Enter — повторить). Риск: библиотека не развивается —
при проблемах переходим на pynput или WinAPI-хук; API модуля изолируем.
## 5. Модуль «мозга» (LLM)
- **OpenRouter** через `openai`-совместимый клиент (base_url = https://openrouter.ai/api/v1) —
без новых зависимостей. Модель выбирается в конфиге.
- Очистка Markdown — собственный regex-модуль (звёздочки, решётки, списки, ссылки).
- Системный промпт: «отвечай коротко, простыми предложениями, без списков и разметки» —
это дешевле, чем чистка сложного текста.
## 6. Модуль Telegram
- **aiogram 3.x** (актуальная), отдельный asyncio-поток/задача.
- События: входящее сообщение от сына → озвучка; ответ отца (надиктован через основной цикл) → отправка.
## 7. Прочее
- **Earcons** (звуковые маркеры): генерируем свои короткие wav (numpy → файлы в `assets/earcons/`),
играем через sounddevice. Никаких внешних ассетов не нужно.
- **Сборка для Windows**: PyInstaller → один exe. Проверим на Module 7.
- **Конфиг**: TOML/JSON + `.env` для ключей (OPENROUTER_API_KEY, TG_BOT_TOKEN).
---
## Итоговый стек v1
```
faster-whisper==1.2.1 # STT (fallback: vosk)
edge-tts==7.2.8 # TTS (fallback: piper-tts==1.8.0)
sounddevice==0.5.6 # запись/воспроизведение
soundfile # wav I/O
numpy # аудио-буферы, earcons
silero-vad==6.2.1 # VAD (опционально)
keyboard==0.13.5 # глобальные клавиши (Windows)
openai (client) # OpenRouter
aiogram>=3 # Telegram
pyinstaller # упаковка exe (этап сборки)
```
Python ≥ 3.9 (лучше 3.11/3.12). Все пакеты кроссплатформенные, разработку ведём здесь (Linux),
деплой — на Windows (звук/клавиши тестируются там).
## Риски и смягчение
1. **edge-tts отвалится** → Piper фолбэк встроен в дизайн модуля.
2. **keyboard мёртв** → работает сегодня; изоляция API, запасной pynput.
3. **Whisper медленный на слабом ПК** → замер на Module 1; если плохо — Vosk small-ru.
4. **Задержка пайплайна** STT→LLM→TTS ≈ 1+2+1 с → смягчаем: короткие фразы (base-модель,
дешёвая быстрая LLM, edge-tts), звуковой маркер «думаю» сразу после отпускания клавиши.