Движок речи, который не привязан к одной модели

vox запускает Qwen3-TTS и F5-TTS из одного файла .tmod: на процессоре, на видеокарте через Vulkan и прямо в браузере через WebGPU. Один seed — один звук.

  • Подключается как библиотека (C ABI), как CLI, как Python-пакет и как один скрипт vox.js
  • F5-TTS в тестовом прогоне отличается от официального f5_tts меньше чем на 1e-6 от амплитуды сигнала
  • Шум не зависит от числа потоков, видеокарты и размера чанка
проверяю WebGPU…
Здесь появится спектрограмма голоса, посчитанного на вашей видеокарте
Тест берёт крошечную модель на 2 МБ со случайными весами: звук будет шумом, зато проверит весь путь.

Модель — это файл, а движок — всегда один

Веса лежат в одном .tmod, голос — в .tvoice. Новая модель подключается как «семейство» поверх того же рантайма, поэтому планировщик ресурсов, стриминг и тесты общие.

Ресурсы под контролем

Выбор устройства, лимиты RAM и VRAM, число потоков и режим работы. План размещения можно посмотреть, ничего не загружая: vox plan.

Стриминг без швов

Текст подаётся кусками, звук забирается по мере готовности. У F5-TTS куски склеиваются кроссфейдом 0,15 с, как в официальном инференсе.

Проверка против эталона

Каждое семейство сверяется с официальным пакетом на тестовой модели со случайными весами. Что не проверено — написано в README и ниже на этой странице.

Какие модели уже работают

Один движок, разные семейства. Следующие модели добавляются по одной за итерацию, каждая со своими тестами.

МодельПроцессорVulkanБраузер (WebGPU)Что проверено
Qwen3-TTS 12HzBase, CustomVoice, VoiceDesign; 0,6B и 1,7BдададаЯдро сверено с официальным qwen_tts, в том числе на настоящей 1,7B-Base; замеры скорости на RTX 3050 есть в README. В браузере: загрузка по ссылке HF и синтез сверены с ядром на крошечной модели; на настоящих весах и на реальной видеокарте не измерялось. Голос из записи в браузере пока не создаётся: нужен готовый .tvoice, диктор или описание
F5-TTSDiT + flow matching + Vocos, клонирование по образцудалинейные слоидаСверена с f5_tts и vocos на тестовой модели, в браузере тоже. На настоящих весах и на реальной видеокарте скорость не измерялась
XTTS, CosyVoice, Chatterboxв очередиБудут подключены по одной модели за итерацию

Путь от текста до звука

Все клиенты ходят через один и тот же контракт. Различается только то, где считается модель.

Конвертер

Веса из Hugging Face превращаются в .tmod: f32, f16, bf16, q8 или q4.

  • python -m vox build
  • python -m vox.build_f5

Семейство

Описывает стадии модели и умеет клонировать голос. Авторегрессионные модели идут через кодеки, остальные — через «прямой» режим.

Устройство

Планировщик раскладывает стадии по железу.

  • процессор: AVX2, aarch64
  • Vulkan: NVIDIA, AMD, Intel
  • WebGPU: браузер (vox.js)

Клиент

Звук — float32, mono. Забирайте его одним куском или потоком.

  • C ABI, C++, Rust, Go
  • Python, Node.js
  • HTTP-сервер, браузер

Как скачать

Репозиторий: github.com/dariumi/Vox. Лицензия Apache-2.0. Веса моделей в репозиторий не входят: у каждой модели своя лицензия.

Сборка из исходников

git clone https://github.com/dariumi/Vox.git
cd Vox
cmake -S . -B build -DVOX_NATIVE=ON
cmake --build build -j

Получатся build/vox (CLI) и build/libvox.so (библиотека; на macOS и Windows — .dylib и .dll). Vulkan включится сам, если найдёт заголовки.

Python-пакет

pip install .

Собирает нативный модуль (нужны CMake и компилятор). Дальше: import vox. Сервер: python -m vox serve.

Для браузера: один файл

<script src="vox.js"></script>

Без сборки и зависимостей, около 75 КБ. Лучше всего с WebGPU (иначе считает процессор, в разы медленнее): Chrome и Edge 113+ (Windows, macOS; на Linux WebGPU пока включается флагами), Firefox 141+ (Windows), Safari 26. Страница должна открываться по HTTPS или с localhost.

Файл модели .tmod

# Qwen3-TTS
python -m vox build --model ./Qwen3-TTS-12Hz-1.7B-Base \
    --dtype bf16 --quant q8 -o model.q8.tmod

# F5-TTS
python -m vox.build_f5 --ckpt model_1250000.safetensors \
    --vocab vocab.txt --vocos ./vocos-mel-24khz \
    --dtype bf16 -o f5.bf16.tmod

Для браузера берите bf16 или q8: файл F5 в f32 весит больше 1 ГБ.

Как использовать из разных языков

Все привязки идут через C ABI. Примеры из репозитория проверены автоматически: на тестовой модели каждый выдаёт ровно те же отсчёты, что и vox say с тем же seed.

vox say / vox voice create
# голос из записи (лучше WAV 24 кГц, 5–15 секунд чистой речи)
vox voice create ref.wav --model model.tmod --text "Текст, который сказан в записи" -o me.tvoice

# синтез в файл
vox say "Привет! Это проверка." --model model.tmod --voice me.tvoice -o out.wav

# потоком в плеер
vox say --stdin --stream --model model.tmod --voice me.tvoice | ffplay -f f32le -ar 24000 -i -

# F5-TTS: параметры называются как в официальном коде
vox say "Привет!" --model f5.tmod --voice me.tvoice --nfe 16 --cfg 2 --sway -1 --speed 1 -o out.wav
Список устройств и план без загрузки весов: vox devices, vox plan --model model.tmod.

Демо: F5-TTS и Qwen3-TTS на WebGPU

Всё считается у вас в браузере: на видеокарте (WebGPU), а если её нет — на процессоре. Ничего не отправляется на сервер: модель и запись голоса остаются на странице.

1. Модель не загружена

2. Голос нет

3. Текст

модель не загружена
Спектрограмма появится после первого синтеза

Загрузите модель, чтобы начать.

Скорость зависит от видеокарты и числа шагов. F5-TTS тяжёлая: на слабых встроенных видеокартах берите «Быстро». Замеров на реальных видеокартах у автора страницы пока нет.

Живой ввод: печатаете — звучит

Двусторонний стриминг. Текст подаётся на лету, звук идёт сразу, пока модель читает дальше. Модели разные: Qwen3-TTS читает текст по словам и начинает говорить на полуслове, F5-TTS озвучивает целыми кусками (по предложению или по паузе в наборе). Движок сам подбирает, как кормить выбранную модель. Нужна загруженная выше модель и голос.

Ввод остановлено

–до первого звука, с
–звука, с
0знаков передано модели

Загрузите модель и выберите голос, потом нажмите «Начать».

Режим manual собирает всё набранное в одну запись: нажмите «Закончить» и дождитесь звука. Правка уже озвученного не переозвучивается.