🔄 auto-sync 2026-04-11 15:00
This commit is contained in:
352
Projects/Voice Assistant Roadmap.md
Normal file
352
Projects/Voice Assistant Roadmap.md
Normal file
@@ -0,0 +1,352 @@
|
|||||||
|
# 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 | Уже есть, хорошее качество звука |
|
||||||
Reference in New Issue
Block a user