Это исходный отчёт фазы как есть — со всеми таблицами и методикой. Живая версия: 🗣️ Синтез речи.
Фаза 3: синтез речи (TTS) на NAS
Прогон: 19 октября 2026
Хост: UGREEN DXP4800 Pro, i3-1315U, 32 GB, iGPU Intel RPL-U (Xe-LP, 64 EU)
Что меряли: насколько разборчиво и быстро разные модели говорят по-русски на CPU и на iGPU: ответы голосового ассистента, числа, даты, сокращения, латиница. Ударения, «ё» и естественность звучания оцениваются на слух (страница для слепого прослушивания).
Коротко
- Для ответов голосового ассистента лучше всего подходит Silero v5_6_ru на CPU, но с нормализацией текста. Нормализация переписывает числа, даты, единицы, валюты и латиницу словами.
- Silero выиграл слепое прослушивание: 4.4 (голос aidar) и 4.0 (xenia) из 5 на фразах без цифр.
- Ни одной ошибки в ударениях, «ё» и интонации на этих 8 фразах, у остальных моделей 1–7.
- 0.1 с на ответ, RTF 0.04, 0.7 GiB.
- Без нормализации Silero молча выбрасывает цифры и латиницу: «У меня новый iPhone 15 Pro» звучит как «У меня новый». С нормализацией CER на трудных фразах падает с 19.6% до 4.1%.
- Проверка через STT ударений не видит, и прослушивание перевернуло её рейтинг. Piper irina по разборчивости шёл первым (3.2% CER), а на слух оказался почти последним: 2.1 из 5, на 5 из 8 фраз ошибки в ударении или «ё». С Supertonic 3 то же самое: 3.2 из 5, 4 ошибки из 8.
- Самая качественная модель с клонированием голоса — Qwen3-TTS 1.7B Base.
- На слух 4.1 из 5 (две ошибки в ударениях), по STT самая разборчивая (2.5% CER).
- Клонирует голос по 8 секундам записи.
- Медленнее реального времени даже на iGPU: RTF 3.5, 13 с на ответ в 3 секунды, 5.5 GiB. Подходит для заранее готовящихся сообщений и озвучки текстов, для живого диалога нет.
- Остальные модели с клонированием:
- Qwen3-TTS 0.6B — хуже на слух (3.0, пять ошибок из восьми) при почти той же скорости;
- CosyVoice3 — 3.9 на слух, но RTF 7.5;
- OmniVoice — 3.9 на слух, но RTF 25, около 70 с на ответ, веса только для некоммерческого использования;
- MOSS-TTS-Nano не годится: сочиняет и повторяет слова, 1.1 на слух.
- Тяжёлым моделям iGPU через Vulkan даёт примерно вдвое больше скорости, чем CPU, но в реальное время они всё равно не укладываются.
Как мерили
-
Фразы. 195 русских фраз в 10 категориях (
make_phrases.py), у каждой записано ожидаемое прочтение:- типичные ответы ассистента (30);
- числа с падежами (25): «21 яйцо», «1 250 рублей», «XIX век»;
- даты и время (20);
- единицы и валюты (15): «312 кВт·ч», «−12 °C», «1 250,50 ₽»;
- сокращения (20): «г.», «ул.», «т. е.», «ООО», «МЧС»;
- ударения и омографы (25): «зАмок/замкУ», «мукА/мУка», «плАчу/плачУ»;
- «ё», написанная как «е» (15);
- латиница и бренды (20): Wi-Fi, Home Assistant, USB-C;
- интонация (15): вопросы, восклицания, перечисления;
- имена и топонимы (10).
Медленные модели гоняли на подвыборке: по 6 фраз из каждой категории (60), OmniVoice — по 3 (30). - Разборчивость. Синтезированную речь распознаёт whisper-large-v3-turbo int8 в OVMS на iGPU (лучший STT из фазы 2), считается CER. - Сравнение идёт и с ожидаемым прочтением («двадцать три градуса»), и с исходным текстом («23 градуса»). Цифры в расшифровке переводятся в слова, засчитывается лучший вариант. - Так модель не штрафуется за то, что STT пишет числа цифрами. А если модель прочитала «23» как «два три», STT это запишет, и будет ошибка. - Ударения, «ё» и интонацию STT не различает, это проверяется только на слух. - Голоса. - У Piper, Silero и Supertonic голоса встроенные. - Модели с клонированием (MOSS-TTS-Nano, Qwen3-TTS Base, CosyVoice3, OmniVoice) получают один эталон: фразу из FLEURS ru (женский голос, 8.4 с) с её текстом. Эту фразу все STT-модели фазы 2 распознали без ошибок. - Рантаймы: - piper-tts 1.8.0 (голоса
rhasspy/piper-voices, medium); - Silerov5_6_ruчерезtorch.hubна PyTorch 2.8 CPU, автоударения, «ё» и омографы включены; - audio.cpp (образыghcr.io/0xshug0/audio.cpp:full-{cpu,vulkan}-20261016-6dbb915, это первая сборка после v0.9.2), GGUF q8_0 изaudio-cpp/audio.cpp-gguf, HTTP/v1/audio/speech,seed1234. - Скорость. Фразы идут последовательно, по одной. Первый запрос (загрузка модели) вынесен в «старт». RTF — время синтеза, делённое на длительность получившегося звука. - Память: раз в 2 с снимается RSS процессов контейнера иdocker stats, в таблицу идёт максимум. - Воспроизведение: - на NAS:fetch.sh,run_tts.sh <движок> [N],run_matrix.sh,rt_all.sh; - клиенты:tts_client.py,py_tts.py; - оценка:rt_prepare.py,score_tts.py; - сырые результаты лежат вraw/, таблицы генерируетpython3 make_report.py, страницу прослушивания —make_listen.py.
Разборчивость и скорость
CER — доля ошибочных символов, когда синтезированную речь распознаёт whisper-large-v3-turbo (лучший STT из фазы 2). Сравнение с ожидаемым прочтением и с исходным текстом, берётся лучшее, цифры в расшифровке переводятся в слова. Сам STT добавляет ~1–2% (на живой речи у него 1.4% CER), это нижняя граница. Все модели сравниваются на одних и тех же 30 фразах (по 3 из каждой категории): «кириллица» — 15 фраз без цифр, символов и латиницы (ответы, ударения, «ё», интонация, имена), «цифры и пр.» — 15 фраз с числами, датами, единицами, сокращениями и латиницей. «Провалы» — фразы с CER больше 30% (пропущенные или неразборчивые слова, обрыв, отказ синтеза) на своём наборе. RTF — время синтеза / длительность звука. «Ответ» — медианное время синтеза короткого ответа ассистента (2–4 с звука). «Старт» — загрузка и первая фраза. RAM — пик памяти (максимум из RSS процессов и docker stats).
| Модель | Рантайм | Устройство | Голос | CER на 30 общих | кириллица / цифры и пр. | Своих фраз | CER / провалы на своих | RTF | Ответ, с | Старт, с | RAM, GiB |
|---|---|---|---|---|---|---|---|---|---|---|---|
| Piper irina (medium) | piper-tts | CPU | встроенный, ж | 3.2 | 0.0 / 6.3 | 195 | 4.7 / 5% | 0.04 | 0.1 | 1 | 0.3 |
| Piper denis (medium) | piper-tts | CPU | встроенный, м | 6.0 | 2.0 / 10.1 | 195 | 6.7 / 6% | 0.04 | 0.1 | 1 | 0.3 |
| Piper dmitri (medium) | piper-tts | CPU | встроенный, м | 3.0 | 1.8 / 4.2 | 195 | 7.5 / 6% | 0.05 | 0.1 | 2 | 0.3 |
| Piper ruslan (medium) | piper-tts | CPU | встроенный, м | 6.2 | 5.7 / 6.6 | 195 | 6.0 / 4% | 0.04 | 0.1 | 1 | 0.3 |
| Silero v5_6_ru xenia | PyTorch | CPU | встроенный, ж | 8.5 | 0.0 / 17.0 | 195 | 10.1 / 8% | 0.04 | 0.1 | 5 | 0.7 |
| Silero v5_6_ru aidar | PyTorch | CPU | встроенный, м | 9.3 | 0.2 / 18.5 | 195 | 10.2 / 8% | 0.04 | 0.1 | 4 | 0.7 |
| Supertonic 3 (F1) | audio.cpp | CPU | встроенный, ж | 6.0 | 0.2 / 11.7 | 195 | 5.9 / 5% | 0.51 | 1.8 | 1 | 0.6 |
| MOSS-TTS-Nano 100M | audio.cpp | CPU | клон | 24.4 | 14.3 / 34.5 | 195 | 26.0 / 37% | 0.68 | 2.3 | 3 | 1.1 |
| Qwen3-TTS 0.6B Base | audio.cpp | iGPU Vulkan | клон | 4.3 | 0.5 / 8.1 | 60 | 4.0 / 2% | 2.57 | 10.3 | 12 | 5.0 |
| Qwen3-TTS 1.7B Base | audio.cpp | iGPU Vulkan | клон | 2.5 | 0.2 / 4.8 | 60 | 2.6 / 2% | 3.48 | 13.0 | 13 | 5.5 |
| CosyVoice3 0.5B | audio.cpp | iGPU Vulkan | клон | 5.3 | 0.0 / 10.6 | 60 | 3.2 / 2% | 7.47 | 26.6 | 25 | 3.3 |
| OmniVoice 0.6B | audio.cpp | iGPU Vulkan | клон | 3.7 | 0.9 / 6.5 | 30 | 3.7 / 3% | 25.18 | 69.8 | 66 | 2.5 |
CER по категориям, %
На своём наборе фраз (195, 60 или 30). Ударения, «ё» и интонацию STT не различает, их нужно слушать (см. ниже).
| Модель | ответы | числа | даты | единицы | сокращ. | латиница | имена |
|---|---|---|---|---|---|---|---|
| Piper irina (medium), CPU | 0.6 | 8.1 | 2.9 | 11.9 | 10.0 | 9.8 | 1.9 |
| Piper denis (medium), CPU | 3.4 | 7.0 | 12.4 | 12.1 | 16.9 | 6.2 | 3.7 |
| Piper dmitri (medium), CPU | 3.7 | 10.1 | 6.8 | 14.9 | 14.8 | 10.4 | 6.2 |
| Piper ruslan (medium), CPU | 3.6 | 5.7 | 4.0 | 12.2 | 10.4 | 11.9 | 5.5 |
| Silero v5_6_ru xenia, CPU | 0.1 | 15.5 | 21.1 | 27.0 | 10.6 | 26.7 | 0.3 |
| Silero v5_6_ru aidar, CPU | 0.1 | 15.6 | 20.9 | 27.7 | 10.9 | 26.5 | 0.3 |
| Supertonic 3 (F1), CPU | 0.4 | 10.7 | 9.2 | 32.5 | 8.8 | 0.4 | 0.6 |
| MOSS-TTS-Nano 100M, CPU | 7.4 | 36.7 | 45.6 | 57.0 | 35.7 | 23.6 | 17.3 |
| Qwen3-TTS 0.6B Base, iGPU Vulkan | 0.5 | 11.4 | 6.2 | 13.8 | 6.5 | 0.0 | 0.5 |
| Qwen3-TTS 1.7B Base, iGPU Vulkan | 0.5 | 3.8 | 3.8 | 13.5 | 3.3 | 0.0 | 1.0 |
| CosyVoice3 0.5B, iGPU Vulkan | 0.0 | 4.1 | 2.0 | 15.8 | 3.5 | 5.1 | 0.0 |
| OmniVoice 0.6B, iGPU Vulkan | 0.9 | 0.7 | 0.0 | 7.1 | 24.8 | 0.0 | 1.9 |
Если нормализовать текст перед синтезом
100 фраз с числами, датами, единицами, сокращениями и латиницей. «Как есть» — исходный текст, «нормализованный» — тот же текст, переписанный словами («23 °C» → «двадцать три градуса», «Wi-Fi» → «вай-фай»). Так текст будет выглядеть, если перед TTS поставить нормализатор или попросить LLM отвечать словами.
| Модель | CER как есть | CER нормализованный | Провалы как есть / нормализованный |
|---|---|---|---|
| Piper irina (medium), CPU | 8.4 | 4.9 | 9% / 2% |
| Silero v5_6_ru xenia, CPU | 19.6 | 4.1 | 16% / 1% |
| Supertonic 3 (F1), CPU | 11.2 | 2.7 | 10% / 0% |
Слепое прослушивание
Один слушатель, 10 фраз, варианты перемешаны и подписаны буквами. Оценка от 1 до 5, отдельно отмечалась ошибка (ударение, «ё», интонация, неверное чтение). «Без цифр» — 8 фраз на ударения (зАмок/замкУ, мукА), «ё» (ёлки, её, ещё) и интонацию (вопрос, восклицание); «числа» — «23 градуса» и «18.10.2026» как есть, без нормализации.
| Модель | Устройство | Средняя оценка | Без цифр: оценка / ошибок | Числа: оценка / ошибок |
|---|---|---|---|---|
| Silero v5_6_ru aidar | CPU | 3.9 | 4.4 / 0 из 8 | 2.0 / 2 из 2 |
| Qwen3-TTS 1.7B Base | iGPU Vulkan | 3.8 | 4.1 / 2 из 8 | 2.5 / 1 из 2 |
| Silero v5_6_ru xenia | CPU | 3.6 | 4.0 / 0 из 8 | 2.0 / 2 из 2 |
| CosyVoice3 0.5B | iGPU Vulkan | 3.7 | 3.9 / 1 из 8 | 3.0 / 1 из 2 |
| OmniVoice 0.6B | iGPU Vulkan | 3.9 | 3.9 / 2 из 8 | 4.0 / 1 из 2 |
| Supertonic 3 (F1) | CPU | 3.3 | 3.2 / 4 из 8 | 3.5 / 0 из 2 |
| Qwen3-TTS 0.6B Base | iGPU Vulkan | 2.9 | 3.0 / 5 из 8 | 2.5 / 1 из 2 |
| Piper ruslan (medium) | CPU | 3.0 | 2.8 / 5 из 8 | 4.0 / 0 из 2 |
| Piper irina (medium) | CPU | 2.4 | 2.1 / 5 из 8 | 3.5 / 1 из 2 |
| MOSS-TTS-Nano 100M | CPU | 1.1 | 1.1 / 7 из 8 | 1.0 / 2 из 2 |
Скорость на другом устройстве (пробный прогон, 5 фраз)
| Модель | Устройство | RTF | Ответ, с | Старт, с |
|---|---|---|---|---|
| Supertonic 3 (F1) | iGPU Vulkan | 0.19 | 0.9 | 3 |
| MOSS-TTS-Nano 100M | iGPU Vulkan | 0.68 | 2.8 | 5 |
| Qwen3-TTS 0.6B Base | CPU | 5.15 | 23.1 | 15 |
| Qwen3-TTS 1.7B Base | CPU | 6.44 | 28.0 | 16 |
| CosyVoice3 0.5B | CPU | 17.45 | 85.8 | 61 |
| OmniVoice 0.6B | CPU | 56.37 | 214.5 | 172 |
Лицензии
| Модель | Лицензия |
|---|---|
| Piper irina (medium) | датасет: не указана; рантайм piper-tts — GPL-3.0 |
| Piper denis (medium) | датасет CC0; рантайм GPL-3.0 |
| Piper dmitri (medium) | датасет CC0; рантайм GPL-3.0 |
| Piper ruslan (medium) | датасет CC BY-NC-SA 4.0; рантайм GPL-3.0 |
| Silero v5_6_ru | CC BY-NC-SA 4.0 |
| Supertonic 3 | OpenRAIL-M |
| MOSS-TTS-Nano 100M | Apache 2.0 в метаданных, но README просит считать веса пока нелицензированными |
| Qwen3-TTS Base | Apache 2.0 |
| CosyVoice3 0.5B | Apache 2.0 |
| OmniVoice 0.6B | CC BY-NC (веса) |
Выводы и рекомендации
Что ставить
| Сценарий | Рекомендация | Почему |
|---|---|---|
| Ответы голосового ассистента | Silero v5_6_ru (aidar или xenia) на CPU + нормализация текста | лучший на слух, без ошибок в ударениях и «ё», 0.1 с на ответ, 0.7 GiB. Лицензия CC BY-NC-SA: дома можно, в коммерческом продукте нельзя |
| Озвучка готовых текстов, свой голос | Qwen3-TTS 1.7B Base на iGPU | второй на слух, самый разборчивый, клонирует голос, но RTF 3.5 |
| Не брать | Piper, Supertonic 3, Qwen3-TTS 0.6B, MOSS-TTS-Nano, OmniVoice | ошибки в ударениях и «ё» (Piper, Supertonic, Qwen 0.6B), галлюцинации (MOSS), 70 с на ответ (OmniVoice) |
Piper всё же стоит держать в уме как запасной вариант: он уже встроен в Home Assistant (Wyoming) и сам читает цифры. Но звучит он заметно хуже Silero.
Что видно в цифрах
-
Числа и символы чинит нормализация, ударения и «ё» зависят только от модели. На 100 фразах с числами, датами, единицами, сокращениями и латиницей CER после нормализации падает:
- у Silero — с 19.6% до 4.1%;
- у Supertonic — с 11.2% до 2.7%;
- у Piper — с 8.4% до 4.9%.
Для ассистента это значит одно из двух: LLM отвечает словами, или между ним и TTS стоит нормализатор. Это стоит заложить в фазы 4 и 5. - Разборчивость и правильность — разные вещи. STT распознаёт «замОк» как «замок», поэтому Piper и Supertonic с ошибками в ударениях выглядят по CER почти идеально. Кириллицу без ошибок прочитал только Silero, у которого есть отдельные модули автоударения, «ё» и омографов (
put_accent,put_yo,put_stress_homo,put_yo_homo). - У тяжёлых моделей проблема в скорости, а не в разборчивости. Qwen3-TTS, CosyVoice3 и OmniVoice по STT на кириллице почти не ошибаются (0–0.9%) и лучше лёгких справляются с числами. На слух у Qwen3-TTS 1.7B, CosyVoice3 и OmniVoice 1–2 ошибки в ударениях из 8, у Qwen3-TTS 0.6B — 5. Но на этом iGPU они в 2.5–25 раз медленнее реального времени. - В режиме offline ответ приходит только после синтеза всей фразы. Потоковый вывод (у Qwen3-TTS и OmniVoice в audio.cpp он есть) сократил бы время до первого звука, но не общую скорость. Его здесь не мерили. - Vulkan против CPU в audio.cpp: у Qwen3-TTS, CosyVoice3 и OmniVoice iGPU быстрее в 1.9–2.3 раза, у Supertonic в 2.7 раза. У маленькой MOSS-TTS-Nano разницы нет.
Заметки для фреймворка
- audio.cpp подходит как общий рантайм для TTS.
- Один образ на десятки моделей, HTTP
/v1/audio/speechв стиле OpenAI. - Конфиг — JSON со списком моделей.
voice_ref— путь к файлу на стороне сервера. - В фазе 2 он не участвовал, но там же есть
/v1/audio/transcriptions(Parakeet, Qwen3-ASR и другие).
- Один образ на десятки моделей, HTTP
- У Silero нет HTTP-сервера, нужна своя обёртка над
torch.hub. У Piper есть Wyoming-сервер для Home Assistant. - Нормализатор текста нужен общий, перед любым TTS.
Ограничения
- Разборчивость меряется через STT, а он сам ошибается и сокращает. Например, «0,5 чайной ложки» whisper записывает как «0,5 ч.л.», и это засчитывается как ошибка модели. Абсолютные цифры поэтому завышены на 1–2%, сравнивать модели между собой можно.
- Тяжёлые модели гоняли на 60 и 30 фразах. Общая таблица считается на одинаковых 30 фразах, и разница меньше ~2 п.п. на них в пределах шума.
- Клонирование проверено на одном эталонном голосе. Похожесть на эталон и естественность (MOS) автоматически не мерили.
- Прослушивание — один слушатель и 10 фраз. Вывод про Silero и Piper надёжный: 0 ошибок против 5 из 8 на одних и тех же фразах. Разница в 0.1–0.3 балла между соседними моделями — шум.
- Синтез шёл по одной фразе, в режиме offline. Параллельно работали остальные сервисы NAS.