Распознавание и голос
Колонке нужны распознавание речи и голос. Их дают либо узлы Хомера — программа homer-node на компьютерах дома, ставит всё сама и без Docker, — либо свой сервер speaches.
Через узлы Хомера
Так дом настроен с самого начала. Нужен хотя бы один компьютер с homer-node (Настройки → Узлы → Добавить узел, дальше homer-node pair и homer-node install на этом компьютере; подробно — Homer Node). Узел сам скачивает:
- распознавание — GigaAM v3 от Сбера (MIT) в движке sherpa-onnx. На русском ошибается в 2–4 раза реже whisper, работает на процессоре: 11 секунд речи за 0,6 с, видеокарта не нужна. Числа пишет цифрами: «22°C», «50%»;
- голос — на узле с видеокартой NVIDIA колонка говорит своим голосом на Qwen3-TTS, по умолчанию встроенным голосом «Хомер»; на узле без NVIDIA — тем же голосом «Хомер» в Piper: нативный piper без Python, 0,1–0,3 с на фразу. Английские голоса Piper — kristin, norman, john. Русские голоса piper-voices (irina, dmitri, denis, ruslan) узел с 1.0 не ставит: у них лицензии не для продукта.
В Речи и голосе колонки выбран вариант Узлы Хомера: модели и голоса берутся у узлов, проба голоса и распознавание записи своего голоса тоже идут через них. Если узлов несколько, сайдкар выбирает ответивший; если не ответил ни один — колонка переходит на запасной вариант (Vosk и голос Windows), как без speaches.
Какие голоса ставить, задаёт voices в node.json узла (["homer"]); по умолчанию — все из манифеста узла. Только речь без языковой модели — "roles": ["stt", "tts"].
Свой голос на Qwen3-TTS занимает на карте около 6 ГБ видеопамяти. Если та же карта нужна чату и играм, настройка узла voiceWeights: "int8" (в node.json или через POST /config, действует после перезапуска узла) ужимает языковую часть модели: на ~1,4 ГБ видеопамяти меньше, на слух разницы нет, цена — фраза дольше примерно на полсекунды. По умолчанию — bf16. При int8 сторож видеокарты реже выгружает ради голоса умную модель.
Видеокарта, которую делят
Если на той же видеокарте работает чужая большая модель (llama-swap, LM Studio, Ollama), узел ей уступает: свои языковые модели считает на процессоре, свой голос не поднимает (колонка говорит голосом Piper), голову «без интернета» в Ollama не держит загруженной. Через 5 минут после того, как чужая модель выгрузится, всё возвращается на карту. Порог и поведение задаёт раздел gpu в node.json, подробно — в docs/homer-node-plan.md, «Сторож видеокарты».
Лицензии голосов Piper
Русские голоса piper-voices — irina, dmitri, denis, ruslan — дообучены от английского lessac, датасет которого разрешён только для исследований; у ruslan — CC BY-NC-SA, у irina лицензия неизвестна. Поэтому узлы их не ставят и говорят голосом «Хомер» — своим, с согласия обладателя. На своём speaches они доступны как раньше: для своего дома это не мешает. Для коммерческой установки голос с чистой лицензией — свой голос на Qwen3-TTS (Apache 2.0), ему нужна видеокарта NVIDIA, или Piper «Хомер».
Свой speaches
speaches — открытый сервер с OpenAI-совместимым API: whisper для распознавания и Piper или Kokoro для синтеза. Выбери Свой speaches по адресу и впиши его адрес.
1. Запуск в Docker
С видеокартой NVIDIA:
docker run -d --name speaches --restart unless-stopped --gpus all -p 8770:8000 ^
-v speaches-cache:/home/ubuntu/.cache/huggingface/hub ^
ghcr.io/speaches-ai/speaches:latest-cudaБез видеокарты — образ latest-cpu. Он медленнее, около 2–4 секунд на фразу:
docker run -d --name speaches --restart unless-stopped -p 8770:8000 ^
-v speaches-cache:/home/ubuntu/.cache/huggingface/hub ^
ghcr.io/speaches-ai/speaches:latest-cpuТом speaches-cache хранит скачанные модели, чтобы они переживали пересоздание контейнера.
2. Модели
speaches ничего не скачивает сам. Нужны модель распознавания и хотя бы один голос:
curl -X POST http://localhost:8770/v1/models/deepdml/faster-whisper-large-v3-turbo-ct2
curl -X POST http://localhost:8770/v1/models/speaches-ai/piper-ru_RU-irina-mediumРусских голосов Piper четыре:
| Голос | Модель |
|---|---|
| irina | speaches-ai/piper-ru_RU-irina-medium |
| ruslan | speaches-ai/piper-ru_RU-ruslan-medium |
| dmitri | speaches-ai/piper-ru_RU-dmitri-medium |
| denis | speaches-ai/piper-ru_RU-denis-medium |
TIP
У многоязычных моделей Kokoro 50 с лишним голосов, но русского среди них нет.
Проверить, что скачано: curl http://localhost:8770/v1/models.
3. Настройка в Homer
Настройки → Колонка → Речь и голос колонки.
- Узлы Хомера / Свой speaches по адресу — откуда брать распознавание и голос.
- Адрес speaches (только для своего speaches) — адрес компьютера с Docker и порт 8770, например
http://192.168.1.20:8770. Кнопка «Проверить» спросит speaches и покажет, сколько голосов и моделей распознавания уже скачано. Адрес можно проверить ещё до сохранения. - Распознавание — модель whisper из скачанных.
- Модель голоса и голос — при смене модели голос переключается на один из её голосов.
- Скорость речи — от 0,5× до 2×.
- Фраза для пробы: «Прослушать здесь» играет пробу на телефоне или в браузере, «На колонке» — говорит сама колонка.
- Сохранить — колонка подхватит настройку в течение минуты, без перезапуска. По умолчанию — вернуть исходные значения.
Пустое поле значит, что у колонки остаётся своё значение по умолчанию: адрес http://127.0.0.1:8770, голос irina.
4. Свой голос
Колонка может отвечать голосом владельца. Хватает записи на 10–15 секунд, но можно и длиннее, а можно загрузить готовый файл: голос по ней повторяет модель Qwen3-TTS на видеокарте ПК с колонкой. speaches этого не умеет, поэтому рядом с ним работает отдельный сервис tools/voiceclone.
Модель — Qwen3-TTS 1.7B, дообученная слушаться русских ударений. Ударения перед синтезом расставляет RUAccent: он различает омографы по смыслу, «замок на холме» и «замок на двери». Обе модели и сборка faster-qwen3-tts распространяются по свободным лицензиям (Apache 2.0 и MIT), их можно использовать и в коммерческих установках.
Запустить сервис — один раз на ПК с видеокартой NVIDIA (около 6 ГБ видеопамяти):
powershell -ExecutionPolicy Bypass -File tools\voiceclone\install-autostart.ps1Нужны Python 3.12 и git. Скрипт создаёт окружение Python с PyTorch под CUDA 12.8 (подходит и для RTX 50xx), регистрирует задачу homer-voiceclone при входе в систему и сразу её запускает. Порт — 8771, журнал — tmp\voiceclone.log. Модели (около 4,5 ГБ) скачиваются при первом старте; расстановка ударений готова примерно через минуту после запуска. Резервная колонка на GPD ходит к сервису по сети, поэтому разреши порт в брандмауэре (от администратора):
New-NetFirewallRule -DisplayName homer-voiceclone -Direction Inbound -Protocol TCP -LocalPort 8771 -Profile Private -Action AllowЗаписать голос — в той же карточке «Речь и голос», блок Свои голоса:
- Нажми «Записать» и прочитай текст с экрана спокойно, обычным голосом, в тихой комнате, держа телефон в 20–30 см. Когда закончишь, нажми «Стоп». Записывать можно сколько угодно, до получаса.
- Или нажми «Загрузить файл» и выбери готовую запись: wav, mp3, m4a, ogg, flac — подойдёт всё, что читает ffmpeg, размером до 300 МБ.
- «Прослушать запись» — проверь, что не слышно шума и музыки: клон повторит и их. Дай голосу имя и нажми «Добавить голос».
- Выбери, в каком роде колонка говорит о себе («включил» или «включила»): по записи это не угадывается.
- «▶ Проба» — послушать голос. «Говорить им» — колонка сразу начинает отвечать этим голосом.
Голосов можно хранить несколько (до 20) и переключать их на ходу. «Имя» переименовывает голос, «Удалить» убирает его из дома и с узлов. Если колонка говорила удалённым голосом, она вернётся к голосу по умолчанию.
Длинные записи. Qwen3-TTS не обучается на записи: он подражает образцу в 8–12 секунд. Образец длиннее только замедлит каждый ответ, а точнее голос не станет. Поэтому из длинной записи Хомер сам выбирает лучший кусок: тот, где больше всего речи, нет перегруза, а на краях стоят паузы, чтобы не резать посреди слова. В списке такой голос подписан, например, «образец 11 с из 3 мин». Вся запись тоже сохраняется. Запиши минуту-две в спокойном темпе — будет из чего выбрать.
Голос по обращению. Колонку можно звать разными именами, и каждое отвечает своим голосом: «Хомер, …» — одним, «Тони, …» — другим. В блоке «Голос по обращению» добавь имя и выбери голос, потом нажми «Сохранить обращения». У голоса в списке появится подпись «откликается на «Тони»». Имя отсюда колонка слышит, даже если его нет среди имён колонки. Дальше в разговоре говорит тот, кого позвали, пока не позовут другим именем. Обращение сильнее голоса комнаты.
Голос по комнатам. Колонки в разных комнатах могут говорить разными голосами: в детской одним, в гостиной другим. В блоке «Голос по комнатам» выбери голос для нужных комнат плана; остальные комнаты говорят голосом дома. Свою комнату колонка знает из настройки HOMER_ROOM (по умолчанию «Гостиная»). Запасная колонка на GPD и Smartbox передают её основной вместе с каждой репликой, и та отвечает голосом этой комнаты.
Фраза своим голосом синтезируется за 0,5–1,5 секунды, частые ответы берутся из готовых записей. Скорость у каждого голоса своя: ползунок «Скорость голоса» правит голос, выбранный выше, и сохраняется сразу. Она действует и в комнатах, и в обращениях. Свой голос ускоряется отдельно (у Qwen3-TTS скорости нет, темп меняет ffmpeg без смены высоты), и скорость дома, заданная раньше, на него не действует. Если сервис голоса недоступен, колонка 30 секунд отвечает голосом по умолчанию из speaches, а потом снова пробует свой.
Ударения
Ударения свой голос ставит сам и почти всегда верно. Если ошибся в каком-то слове, впиши его в поле Ударения с ударной гласной заглавной, по слову в строке:
замОк
гостИнаяСловарь сильнее автоматической расстановки. Каждая форма слова пишется отдельно: «гостИная» не поправит «гостиной». Понятны и другие записи — «зам+ок» и «замо́к»; сохраняются они в виде с заглавной. Колонка подхватывает словарь в течение минуты, частые ответы с новым ударением озвучиваются заново.
Своя модель голоса
В поле Сервис своего голоса можно указать другой сервер синтеза вместо tools/voiceclone, например на другом компьютере или со своей моделью. Пустое поле — сервис на том же ПК, что и колонка. Сервер должен отвечать так же:
PUT /v1/voices/<id>— тело: запись в wav; ответ{id, text, seconds};POST /v1/audio/speechс телом{voice, input, stress}— ответ: wav; 404, если голос с такимidне загружен (колонка тогда сама перешлёт запись);GET /— состояние.
Лицензия своей модели
За модель на своём сервере отвечает тот, кто её запустил. У многих моделей клонирования голоса, в том числе у F5-TTS и XTTS, лицензия разрешает только некоммерческое использование.
Если speaches недоступен
Колонка не ломается: на 30 секунд она переходит на запасной вариант — Vosk для распознавания и голос Windows для ответа, — а потом снова пробует speaches. В журнале колонки это строка «speaches недоступен — резерв».
Подогрев
speaches выгружает модель распознавания после нескольких минут простоя, и первая фраза потом ждёт загрузки 4–6 секунд. Чтобы этого не было, колонка раз в 4 минуты простоя шлёт полсекунды тишины.