Files
obsidian/Projects/Voice Assistant Roadmap.md
2026-04-11 15:00:12 +00:00

353 lines
16 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.
# Cosmo & Люся — Голосовой ассистент дома
> Дорожная карта: от теста на маке до продакшн-системы
> Обновлено: 2026-04-11
---
## Текущий статус
| Компонент | Статус |
|-----------|--------|
| Два Gateway (Cosmo :18789, Люся :18790) | ✅ Работает |
| systemd units для обоих | ✅ Настроены |
| Telegram боты раздельные | ✅ Работает |
| Workspace и память перенесены | ✅ Готово |
| MacBook нода подключена | ✅ К Cosmo |
| Wake words | ✅ "космо", "cosmo" |
| TTS Cosmo | ✅ DmitryNeural (муж.) |
| TTS Люся | ✅ SvetlanaNeural (жен.) |
| ElevenLabs | ❌ Не настроен |
| Home Assistant skill | ❌ Не создан |
| Pi satellite | ❌ Не начато |
---
## Фаза 1 — Тест голоса на MacBook (сейчас)
### Что работает
- MacBook подключён как нода к Cosmo Gateway (:18789)
- Wake word "космо" активирует голосовой ввод
- Apple Speech распознаёт русскую речь локально (быстро)
- TTS через Microsoft Edge — DmitryNeural
### Чек-лист
- [ ] Сказать "Космо" → звук активации
- [ ] Голосовой вопрос → голосовой ответ
- [ ] Проверить что сессия создалась под agent `main`
- [ ] Telegram Светы работает параллельно через Люсю (:18790)
### Известные ограничения
- Android voice wake **отключен** (только ручной микрофон)
- Нет нативного Linux companion app (только headless node host)
- Нельзя маршрутизировать voice vs text на разные модели нативно
---
## Фаза 2 — Уникальные голоса (ElevenLabs)
### Зачем
Microsoft Edge TTS звучит нормально (7/10), но:
- Нельзя клонировать/создать уникальный голос
- Ограниченная выразительность
- Нет контроля стиля и эмоций
### Сравнение провайдеров
| Провайдер | Задержка | Качество | Цена | Кастомный голос |
|-----------|----------|----------|------|-----------------|
| Microsoft Edge (сейчас) | ~300ms | 7/10 | Бесплатно | ❌ Только пресеты |
| ElevenLabs | ~500ms | 10/10 | $5/мес | ✅ Клонирование |
| OpenAI TTS | ~400ms | 9/10 | $15/1M chars | ❌ Только пресеты |
| Silero (локально) | ~100ms | 6/10 | Бесплатно | ❌ |
### Рекомендация: ElevenLabs
**Почему:** Лучшее качество + можно создать уникальные голоса для Cosmo и Люси.
**План $5/мес (Starter):**
- 30,000 символов/мес (~15 мин речи)
- До 10 кастомных голосов
- Instant Voice Cloning
- Multilingual v2 модель (русский ✅)
### Конфиг для Cosmo
```json
{
"messages": {
"tts": {
"auto": "inbound",
"provider": "elevenlabs",
"elevenlabs": {
"apiKey": "<ELEVENLABS_API_KEY>",
"voiceId": "<cosmo-voice-id>",
"modelId": "eleven_multilingual_v2",
"stability": 0.5,
"similarityBoost": 0.75,
"style": 0.0,
"useSpeakerBoost": true,
"speed": 1.0,
"languageCode": "ru"
}
}
}
}
```
### Конфиг для Люси
То же самое, но с другим `voiceId` — женский голос.
### Как создать кастомные голоса
1. Зарегистрироваться на elevenlabs.io
2. Voice Lab → Add Generative or Cloned Voice
3. Для клонирования: загрузить ~1 мин чистого аудио
4. Скопировать Voice ID из настроек голоса
5. Обновить `openclaw.json` обоих инстансов
### Фоллбэк
Оставить Microsoft Edge TTS как запасной — если ElevenLabs недоступен или лимит исчерпан.
### Продвинутые возможности
В ответах можно менять голос на лету:
```
[[tts:voiceId=XXXXX stability=0.3 speed=1.2]]
Текст с другим голосом
```
---
## Фаза 3 — Оптимизация скорости
### Узкие места (по порядку задержки)
| Этап | Текущая задержка | Оптимизация |
|------|-----------------|-------------|
| STT (речь→текст) | ~200ms (Apple Speech) | ✅ Уже быстро |
| Сеть (MacBook→Gateway) | ~10ms (LAN) | ✅ Уже быстро |
| LLM ответ | ~2-5 сек (через proxy) | 🔧 Haiku для голоса |
| TTS (текст→речь) | ~300ms (Edge) / ~500ms (ElevenLabs) | Приемлемо |
| **Итого** | **~3-6 сек** | **Цель: <2 сек** |
### Стратегия ускорения
**1. Модель для голосовых сессий**
- Сейчас: `claude-code-proxy` (проксирует через Claude Code CLI → медленно)
- Для голоса лучше: `anthropic/claude-haiku-4-5` напрямую — в 3-5x быстрее
- OpenClaw не может автоматически различать voice vs text
- **Решение:** В SOUL.md добавить правило — голосовые ответы короткие (2-3 предложения)
- **Альтернатива:** Для критичной скорости — отдельный binding для ноды с override модели
**2. Короткие ответы для голоса**
Добавить в SOUL.md:
```
## Голосовые ответы
Если сообщение пришло от ноды (не Telegram): отвечай максимально кратко.
- 1-3 предложения для простых вопросов
- Не используй markdown, списки, таблицы — только текст
- Числа произноси словами когда уместно
```
**3. Streaming TTS**
OpenClaw поддерживает streaming для Telegram (`streaming: "partial"`). Для голосовых ответов streaming не применяется — ответ генерируется целиком, потом озвучивается. Это ОК для коротких ответов.
---
## Фаза 4 — Raspberry Pi Satellite
### Архитектура
```
Комната Сервер (N100, 192.168.31.103)
┌─────────────────────┐ ┌──────────────────────────────┐
│ Raspberry Pi 5 │ │ Gateway :18789 (Cosmo) │
│ │ WS/LAN │ Gateway :18790 (Люся) │
│ USB микрофон ───► │─────────►│ │
│ OpenClaw node host │ │ Claude Haiku/Sonnet │
│ (headless) │◄─────────│ ElevenLabs TTS │
│ │ аудио │ Web search, exec, memory │
│ ▼ │ │ Home Assistant API │
│ BT колонка Алиса │ │ │
└─────────────────────┘ └──────────────────────────────┘
```
### Проблема: нет нативного Linux companion app
OpenClaw companion apps есть только для macOS, iOS, Android. На Linux доступен только **headless node host** (`openclaw node run`), который:
- ✅ Подключается к Gateway по WebSocket
- ✅ Выполняет `system.run` команды
-**Не имеет** STT/TTS/Voice Wake функционала
### Варианты решения для Pi
#### Вариант A: Кастомный satellite скрипт (Python)
**Плюсы:** Полный контроль, можно два wake word на одном Pi
**Минусы:** Нужно писать и поддерживать код, Porcupine платный для кастомных слов
Компоненты:
- **Wake word:** Picovoice Porcupine ($5/мес за кастомные ключевые слова)
- Бесплатно: "пикомон", "терминус" и другие встроенные (русских нет)
- Платно: кастомные "космо", "люся" на русском
- Альтернатива: openWakeWord (бесплатно, но хуже качество на русском)
- **STT:** faster-whisper `small` на CPU (~2-3 сек на Pi 5) или Groq Whisper API (~300ms, нужен интернет)
- **Gateway API:** HTTP POST на OpenClaw Gateway
- **TTS:** Получаем аудио от OpenClaw (ElevenLabs/Edge)
- **Воспроизведение:** aplay через PulseAudio → Bluetooth → Алиса
```python
# Упрощённый цикл:
while True:
if wake_word_detected():
play_activation_sound()
audio = record(seconds=6)
text = transcribe(audio) # faster-whisper или Groq API
response = send_to_openclaw(text) # HTTP API
play_tts(response.audio) # аудио от OpenClaw
```
#### Вариант B: OpenClaw node host + внешний STT/wake
**Плюсы:** Нативная интеграция с Gateway, сессии видны в UI
**Минусы:** Нет готового voice pipeline, нужно дописывать
```bash
# Запуск headless node
openclaw node run --host 192.168.31.103 --port 18789
```
Потом отдельный скрипт слушает микрофон и шлёт текст через `openclaw node send`.
#### Вариант C: Ждать Linux companion app
OpenClaw активно развивается. Возможно появится Linux app с полным voice pipeline. Но это не гарантировано и не скоро.
### Рекомендация: Вариант A (кастомный скрипт)
Самый гибкий. Можно:
- Два wake word ("космо" → :18789, "люся" → :18790) на одном Pi
- Выбрать STT (локальный whisper или облачный Groq)
- Полный контроль над audio pipeline
- Алиса как BT колонка
### Железо
| Компонент | Вариант | Цена |
|-----------|---------|------|
| Raspberry Pi 5 8GB | rpilocator.com | ~$80 |
| USB микрофон | ReSpeaker USB Mic Array (лучше) или любой plug-and-play | 500-3000₽ |
| MicroSD 32GB A2 | Samsung EVO | ~500₽ |
| БП USB-C 27W | Официальный Pi | ~$12 |
| Корпус | Argon ONE v3 (с охлаждением) | ~$25 |
| Колонка | Алиса в BT режиме | уже есть ✅ |
| **Итого** | | ~$130 + 500₽ |
### STT: локальный vs облачный
| Вариант | Задержка | Качество RU | Цена | Офлайн |
|---------|----------|-------------|------|--------|
| faster-whisper small (Pi 5) | ~2-3 сек | 8/10 | Бесплатно | ✅ |
| faster-whisper tiny (Pi 5) | ~1 сек | 6/10 | Бесплатно | ✅ |
| Groq Whisper API | ~300ms | 9/10 | Бесплатно (rate limited) | ❌ |
| OpenAI Whisper API | ~500ms | 9/10 | $0.006/мин | ❌ |
**Рекомендация:** Groq Whisper API (уже настроен в OpenClaw, ключ есть) с фоллбэком на локальный whisper.
---
## Фаза 5 — Home Assistant интеграция
### Что нужно
1. **Long-Lived Token** в Home Assistant
2. **Skill для OpenClaw** — описание API эндпоинтов
3. **Entity ID** для каждого устройства
### Skill файл
```
~/.openclaw/workspace/skills/home-assistant/SKILL.md
```
Содержимое:
- Base URL: `http://<HA_IP>:8123`
- Авторизация: Bearer token
- Основные команды: свет, климат, сцены, сенсоры
- Entity map: человекочитаемые имена → entity_id
### Голосовые команды (примеры)
- "Космо, включи свет в гостиной" → `POST /api/services/light/turn_on`
- "Космо, какая температура дома" → `GET /api/states/sensor.temperature`
- "Космо, включи вечерний режим" → `POST /api/services/scene/turn_on`
### Когда делать
После переезда в квартиру (Q3 2026) и установки HA + Aqara устройств.
---
## Фаза 6 — Финальная архитектура
```
MacBook ──────────┐
(wake: "космо") │
iPhone ──────► Gateway :18789 ◄── Telegram (Даниил)
(нода) Cosmo (main)
Claude Haiku/Sonnet
ElevenLabs TTS (муж.)
Pi satellite ──┤
(wake: "космо") │
iPhone Светы ► Gateway :18790 ◄── Telegram (Света)
(нода) Люся (wife)
Claude Haiku
ElevenLabs TTS (жен.)
Pi satellite ──┘
(wake: "люся")
```
### Один Pi — два агента
Можно запустить один Pi с двумя wake words:
- "космо" → HTTP к :18789
- "люся" → HTTP к :18790
Porcupine поддерживает несколько keyword одновременно. Скрипт определяет какой сработал и шлёт запрос на нужный порт.
---
## Порядок действий
### Сейчас (Фаза 1)
- [x] Разделить агентов на два Gateway
- [x] Настроить TTS (разные голоса)
- [ ] Протестировать голос с MacBook
- [ ] Добавить правила коротких ответов в SOUL.md
### Ближайшее (Фаза 2-3)
- [ ] Зарегистрироваться на ElevenLabs
- [ ] Создать/выбрать голоса для Cosmo и Люси
- [ ] Обновить конфиги TTS
- [ ] Протестировать качество и задержку
- [ ] Оптимизировать модель для голоса
### Среднесрочное (Фаза 4)
- [ ] Купить Raspberry Pi 5 + USB микрофон
- [ ] Написать satellite скрипт (Python)
- [ ] Настроить Porcupine wake words
- [ ] Подключить Алису по Bluetooth
- [ ] Протестировать полный pipeline
- [ ] Автозапуск через systemd
### После переезда (Фаза 5-6)
- [ ] Настроить Home Assistant
- [ ] Создать HA skill
- [ ] Полная голосовая система дома
---
## Ключевые решения
| Вопрос | Решение | Почему |
|--------|---------|--------|
| TTS провайдер | ElevenLabs ($5/мес) | Лучшее качество + кастомные голоса |
| STT на Pi | Groq API + whisper фоллбэк | Скорость + надёжность |
| Wake word | Picovoice Porcupine | Лучший для кастомных слов |
| Модель для голоса | Haiku для простых, Sonnet для сложных | Баланс скорости и качества |
| Pi satellite | Кастомный Python скрипт | Полный контроль, два wake word |
| Колонка | Алиса по Bluetooth | Уже есть, хорошее качество звука |