VoXtream2-RU ONNX для NVIDIA Jetson

Это переносимая часть x0rium/voxtream2-ru-jetson: четыре ONNX-графа и остальные модельные данные, необходимые для запуска русского TTS на Jetson без PyTorch в процессе синтеза.

Готовые TensorRT plan-файлы здесь не публикуются. Они зависят от архитектуры GPU, JetPack/L4T и точной сборки TensorRT, поэтому создаются непосредственно на целевом Jetson из этих ONNX.

Что входит в релиз

Файл Назначение Размер, MiB
models/phone-encoder.onnx Кодировщик фонем, длина 2–640 175,8
models/temp-former-q1-q420.onnx Единый temporal graph: q=1 для генерации, q=420 для sink replay 374,3
models/dep-former-q1-q2.onnx Acoustic dep-former вместе с audio head 273,2
models/mimi-decoder-step.onnx Один потоковый шаг Mimi decoder 110,7
assets/audio-embeddings.bf16 Таблица audio embeddings в raw BF16 64,1
assets/mimi-decoder-initial-state.json и .bin Начальное состояние Mimi 4,0
assets/phoneme-to-token.json Таблица фонем VoXtream2-RU <0,1
voices/example-f1.json и .bin Подготовленное состояние демонстрационного голоса 193,6

Общий объём — около 1,17 GiB. Размеры, SHA-256, параметры сборки и происхождение файлов находятся в manifest.json. Полный контракт входов, выходов и state tensors TensorRT записан в abi.json.

Быстрый путь

hf download x0rium/voxtream2-ru-jetson-onnx \
  --revision v0.2.2 \
  --local-dir release

Дальше на Jetson нужно:

  1. собрать runtime-образ без PyTorch;
  2. проверить SHA-256 скачанных файлов;
  3. собрать четыре TensorRT engine с указанными профилями;
  4. собрать два небольших CUDA kernel для sm_87;
  5. скачать зафиксированный набор RUAccent;
  6. выполнить первый синтез или запустить резидентный потоковый процесс.

Все команды, включая первый WAV и проверку torch_imported=false, приведены в инструкции docs/jetson-install.md.

Примеры голоса с Jetson

Все записи ниже сгенерированы опубликованным runtime на Jetson Orin Nano 8 GB, без PyTorch в процессе синтеза. Формат файлов — PCM WAV, 24 кГц, mono. Точный текст после нормализации, длительность, RTF и SHA-256 собраны в samples/manifest.json.

Обычная речь

Привет! Я работаю прямо на компактном Джетсоне и начинаю говорить ещё до того, как фраза сгенерирована целиком.

Длинная связная реплика

Представьте домашнего голосового помощника, который работает локально и не зависит от качества интернета. Утром он сообщает прогноз погоды, напоминает о встречах и включает музыку. Днём помогает вести список дел, управляет освещением и отвечает на простые вопросы. Вечером читает сообщения и продолжает разговор с того места, где вы остановились. Вся обработка речи выполняется на небольшом компьютере, поэтому ответ приходит быстро, а личные данные остаются дома. Даже если соединение пропадёт, основные команды и озвучивание продолжат работать. Система остаётся автономной.

Длительность — 46,16 с, RTF — 0,851. Во время этой реплики runtime один раз пересобрал sink-attention cache и выполнил 420 replay-шагов за 0,112 с.

Дата, время, процент и температура

Сегодня 1 сентября 2026 года. Время 18:45, заряд аккумулятора — 73,5 процента, температура — 42 градуса.

Телефонный номер

Телефон службы поддержки: +7 999 123-45-67.

Текущий normalizer ошибочно воспринимает сырой номер как одно большое число. Поэтому в frontend передана подготовленная форма: «плюс семь, девять девять девять, один два три, четыре пять, шесть семь». Это ограничение не скрыто в демонстрации и отражено в manifest.

Деньги, дробь и единицы измерения

Заказ стоит 12 490 рублей 50 копеек. Расстояние — 3,7 километра, скорость — 60 километров в час.

Версия, сборка и код подтверждения

Версия 2.4.1, сборка 2026-09-01. Код подтверждения: 804 217.

Версия, дата сборки и код переданы словами и отдельными цифрами. Сырые строки вида 2.4.1 и 804 217 текущий normalizer читает как дробь и большое число; подготовленный текст приведён в manifest.

Что исполняется на устройстве

текст
  └─ ru-normalizr → RUAccent ONNX → espeak-ng
       └─ phone encoder (TensorRT BF16)
            └─ temp_former (TensorRT BF16 + CUDA Graph)
                 └─ dep_former (TensorRT BF16 + CUDA Graph)
                      └─ Mimi decoder (TensorRT BF16)
                           └─ PCM s16le, 24 kHz, mono

PyTorch использовался при экспорте, но не установлен в проверенном окружении синтеза. Runtime выдаёт PCM по 1920 сэмплов, то есть по 80 мс звука, не ожидая завершения всей реплики. Для диалога модели и RUAccent держатся в одном резидентном процессе.

Как послушать результат на macOS

Файл, созданный параметром --output, — обычный WAV. Скопируйте его с Jetson и запустите системный консольный проигрыватель:

scp jetson:/path/to/smoke.wav .
afplay smoke.wav

Если сохранён не WAV, а сырой PCM-вывод, проигрывателю нужно явно сообщить формат:

brew install ffmpeg
ffplay -nodisp -autoexit -f s16le -ar 24000 -ac 1 output.pcm

Бинарный stdout резидентного процесса — это записи протокола с заголовками, а не WAV и не сплошной PCM. Его нельзя напрямую передавать в afplay или ffplay; используйте playback-клиент из GitHub runtime, который извлекает PCM-чанки.

Проверенная конфигурация

  • Jetson Orin Nano 8 GB;
  • JetPack 6.2.3 / Jetson Linux R36.5.2;
  • CUDA compiler 12.6.68;
  • TensorRT package 10.3.0.30-1+cuda12.5;
  • TensorRT BF16;
  • Python runtime без импорта PyTorch.
Проверка Результат на этой конфигурации
Первый PCM-чанк короткой реплики 0,418 с после получения запроса
RTF короткой реплики 0,924
Длинная реплика 42,32 с аудио, RTF 0,852
Sink-attention rebuild 420 шагов за 0,112 с
Текст длиннее phone-профиля 767 позиций → 2 сегмента, 55,76 с аудио, RTF 0,849
Peak RSS резидентного процесса 3519,5 MiB

Единый temp_former с профилями q=1/q=420 прошёл короткую побитовую регрессию, длинную генерацию через границу sink-attention и A/B-прослушивание. В проведённой проверке слышимой разницы после восстановления кэша не было. Подробные параметры сборки и результаты находятся в validation/jetson-orin-nano-r36.5.2.json. Это измерения одного устройства, а не универсальный результат VoXtream2-RU. Отдельный прогон новой инструкции в чистом каталоге заново собрал все четыре engines и получил 7,12 с аудио с RTF 0,893, без неизвестных фонем.

Что не входит

  • TensorRT .engine, поскольку они не являются переносимыми;
  • RUAccent — он скачивается из исходного репозитория с зафиксированной revision;
  • исходный checkpoint и инструменты PyTorch — они нужны только для повторного экспорта модели или подготовки нового голоса;
  • исходная аудиозапись голоса;
  • готовый сетевой TTS-сервис.

Релиз уже содержит один голос, достаточный для запуска. Подготовка другого голоса пока не сведена к одной поддерживаемой команде: это отдельная офлайн- операция с PyTorch, prompt cache и fixed-prompt state. Сам процесс синтеза после такой подготовки остаётся PyTorch-less.

Ограничения

  • Проверен Jetson Orin (sm_87); другие поколения Jetson пока не проверялись.
  • Русская нормализация ошибается на части падежей, версиях программ, телефонных номерах и единицах измерения.
  • Phone encoder намеренно собран с TensorRT-профилем до 640 позиций на один сегмент. Это не предел общей длины: runtime v0.2.2 автоматически делит более длинный текст по естественным границам и продолжает тот же PCM-поток. На границе сегмента возможно небольшое изменение просодии.
  • Резидентный протокол обрабатывает реплики последовательно; отмена текущей реплики и несколько параллельных клиентов не реализованы.
  • Это исследовательский runtime и набор воспроизводимых артефактов, а не поддерживаемый облачный API.

Происхождение и лицензия

ONNX и производные модельные данные экспортированы из simba9/voxtream2-ru, который основан на herimor/voxtream2. Зафиксированная исходная revision — 79475fec8ada3b507a6a2be659e0f2e154fdf3c0.

Модельные артефакты сохраняют условия OpenRAIL-M; полный текст находится в LICENSE. Код Jetson runtime опубликован отдельно под MIT.

Downloads last month
-
Inference Providers NEW
This model isn't deployed by any Inference Provider. 🙋 Ask for provider support

Model tree for x0rium/voxtream2-ru-jetson-onnx

Quantized
(1)
this model