Как я сделал голосового ассистента из Claude Code
Вчера пропустил момент, когда Claude Code закончил рефакторинг. Отвлёкся на кофе, вернулся через 10 минут — а он давно ждёт следующий промпт.
Надоело. Написал hook, который озвучивает ответы агента.
Проблема
Работаю с Claude Code часов по 5-6 в день. Агент делает задачу, я жду. Раз в час точно отвлекаюсь и пропускаю момент готовности. За неделю набегает минут 40 потерянного времени.
Хотел звуковое уведомление. Но системный звук бесит.
Как устроено
Три компонента:
TTS daemon — Python-процесс, который держит открытое WebSocket-соединение к Gemini Live API. Почему daemon? Потому что установка соединения занимает 300-400мс, а с постоянным коннектом озвучка стартует мгновенно.
Stop hook — срабатывает когда Claude Code завершает ответ. Извлекает текст из транскрипта, шлёт в daemon.
Конфиг — голос, стиль, язык. Можно менять на лету.
Настройка
Daemon
python3 ~/.claude/hooks/tts_daemon.py &
Код на 500 строк, но суть простая: слушает Unix socket /tmp/claude-tts.sock, получает текст, отдаёт Gemini, играет аудио через afplay. Кеширует одинаковые фразы.
Hook
В ~/.claude/settings.json:
{
"hooks": {
"Stop": [{
"hooks": [{
"type": "command",
"command": "python3 ~/.claude/hooks/speak_hook.py",
"timeout": 15000
}]
}]
}
}
Конфиг голоса
~/.claude/tts_config.json:
{
"mode": "summary",
"voice": "Aoede",
"style": "fast_asmr",
"language": "russian",
"max_chars": 1000
}
mode: summary — ключевая штука. Gemini не читает весь текст, а пересказывает в 1-2 предложения. Когда агент выдаёт 50 строк технического ответа — слышу короткое “Готово, добавил три теста и поправил импорты”.
Голос Aoede — по-моему, самый приятный из пяти доступных (ещё есть Puck, Charon, Kore, Fenrir). В ASMR-режиме звучит как мягкий шёпот.
Как это работает
- Пишу промпт Claude Code
- Агент выполняет задачу, генерирует ответ
- Claude Code завершает ответ → срабатывает Stop hook
- Hook извлекает текст последнего сообщения
- Текст уходит в daemon через Unix socket
- Daemon отправляет в Gemini с инструкцией суммаризировать
- Gemini возвращает аудио
- macOS проигрывает через
afplay
На моём M2 Pro от шага 3 до шага 8 проходит 1.5-2 секунды.
Результат
Могу отойти от компа. Когда агент заканчивает — слышу голос с пересказом.
Для длинных задач типа “прогони тесты и пофикси что упадёт” — то что надо.
Альтернативы
cc-hooks — готовый плагин с несколькими TTS-провайдерами.
Claude-to-Speech — через ElevenLabs, голоса качественнее, но платно.
pyttsx3 — локально без API, но голос как из Windows 98.
Я выбрал Gemini из-за суммаризации. ElevenLabs просто читает текст, Gemini может пересказать.
Источники
Подписаться на обновления — @sereja_tech