Архитектура
Нативный TTS с инструкциями
Соберите нативный SDK из исходников main. Homebrew и другие готовые сборки CLI могут пока не содержать эти движки.
Опубликованные пакеты MLX: aufklarer/FireRedTTS3-Instruct-MLX-fp32 · aufklarer/MOSS-VoiceGenerator-MLX-bf16
FireRedTTS3-Instruct — FireRedTTS3TTS: FireRedTTS3-Instruct сохраняет веса модели и декодера Float32. Аудио возвращается целиком из буфера: не используйте --stream. --language принимает английские и китайские обозначения языка. Достижение лимита вызывает ошибку, а не успешную выдачу обрезанной записи.
MOSS-VoiceGenerator — MossVoiceGeneratorTTS: MOSS-VoiceGenerator сохраняет языковые веса BF16 и кодек синтеза FP32. Для постепенной выдачи PCM используйте --stream. Не задавайте --language: укажите язык в --instruct. Завершение полностью выводит все шестнадцать кодовых книг.
Текст и инструкция ограничены каждый 32 768 байтами UTF-8. Полный сформированный входной промпт вместе с шаблоном должен укладываться в 4 096 токенов. При превышении любого ограничения ввод отклоняется.
Качество выполнения инструкций ещё не оценивалось. Короткие тексты описывают лишь проверенную конфигурацию; проверка регрессии задержки остаётся без однозначного результата.
Breeze TTS 2 · BreezeTTS
Синтез английской и китайской речи с дизайном голоса, клонированием и управлением по образцу, потоковый звук (MLX BF16/8-bit, 24 kHz; только исследования и некоммерческое использование).
speech speak "The quick brown fox jumps over the lazy dog." --engine breeze \
--instruct "A clear, calm English narrator." --stream -o design.wav--breeze-model-id:aufklarer/Breeze-TTS-2-MLX-8bit--breeze-bundle-dir--breeze-cache-limit-mib--breeze-reference-text--breeze-temperature:0.9--breeze-top-k:50--breeze-top-p:1--breeze-cfg-scale:4--breeze-max-frames:750--breeze-seed:42--first-chunk-frames:3--chunk-frames:25
Нативная среда для Apple · PocketTTS
PocketTTS добавляет в speech-swift нативный синтез CoreML. По умолчанию все этапы работают только на CPU. Английский голос Alba передаёт блоки по 1 920 отсчётов при 24 кГц, то есть по 80 мс.
speech-swift организован как модульный Swift-пакет с общими протоколами, независимыми модулями моделей и единым CLI. Весь инференс выполняется на устройстве через MLX (Metal GPU) или CoreML (Neural Engine).
Граф зависимостей модулей
┌──────────┐
│ AudioCLI │ (точка входа)
└────┬─────┘
│
┌──────┴──────┐
│ AudioCLILib │ (команды)
└──────┬──────┘
│
┌─────────┬───────┼───────┬──────────┬──────────────┐
│ │ │ │ │ │
┌────┴───┐ ┌──┴──┐ ┌──┴──┐ ┌─┴────┐ ┌───┴────┐ ┌──────┴───────┐
│Qwen3ASR│ │Qwen3│ │Cosy │ │Perso-│ │Speech- │ │ Speech- │
│Parakeet│ │ TTS │ │Voice│ │naPlex│ │ VAD │ │Enhancement │
└────┬───┘ └──┬──┘ └──┬──┘ └──┬───┘ └───┬───┘ └──────┬───────┘
│ │ │ │ │ │
└────────┴───────┼───────┴─────────┘ │
│ │
┌──────┴──────┐ │
│ Qwen3Common │ (общие слои) │
└──────┬──────┘ │
│ │
┌──────┴──────┐ │
│ AudioCommon │ ◄──────────────────────┘
└─────────────┘ (протоколы, аудио I/O)Бюджет кэша буферов MLX
Среды выполнения моделей MLX используют общий лимит повторно используемых буферов min(2 GiB, physical RAM / 4) от загрузки весов до завершения жизненного цикла модели. Более низкие бюджеты вызывающего кода, включая MLX.Memory.cacheLimit = 0, и существующие бюджеты отдельных моделей сохраняются. Лимит относится к неиспользуемым буферам; активные веса, KV-кэши и общая память процесса могут его превышать. MLX сокращает кэш при выделении памяти, поэтому последний освобожденный буфер может временно вывести его за пределы бюджета до следующего выделения.
unload() освобождает регистрацию модели; при отсутствии этого метода она освобождается при уничтожении объекта. Последний владелец восстанавливает бюджет вызывающего кода; более ранние выгрузки сохраняют ограничения остальных моделей. Пути, использующие только CoreML, не регистрируют бюджет MLX.
MOSS Transcribe Diarize
MossTranscribe возвращает сегменты с говорящими и временными метками через нативные CoreML- и MLX-бэкенды. CoreML использует фиксированное состояние на 1 024 токена для коротких записей. MLX использует динамический контекст на 131 072 токена, affine INT5/INT8-веса декодера и необязательные FP16/INT8 KV-кэши. Оба рантайма офлайн и авторегрессионные, без потокового вывода.
VoiceChat 11B
Задача и ссылка: дуплексный speech-to-speech; SALM-Duplex: Efficient and Direct Duplex Modeling for Speech-to-Speech Language Model (Interspeech 2025), указанный в upstream-карточке VoiceChat NVIDIA.
Полный рантайм, M5 Pro 48 ГБ, Release, live-такт 80 мс: INT5 с защищёнными головами даёт пиковый RSS около 8.69 GB; три контролируемых RTF всего пайплайна составили 0.96, 0.96 и 0.99. Оптимизированная INT8 ещё не перемерена.
VoiceChat реализует полный нативный MLX-тракт аудио-в-аудио: каузальное восприятие FastConformer, дуплексные текстовый/функциональный каналы Nemotron-H, автономный текстово-обусловленный декодер EAR-TTS с восемью итерациями MaskGIT и нейронный кодек 22,05 кГц. Потоковый режим хранит ограниченные кэши внимания и каузальной свёртки для каждого слоя, а стабильное восьмикадровое live-окно кодека использует скомпилированный граф. Каждый входной кадр 80 мс создаёт языковое решение, 31 RVQ-код и ровно 1 764 выходных отсчёта. Загрузчик требует полный bundle encoder/ + llm/ + tts/ и отвергает старые экспорты только для понимания. INT5 теперь удерживает средний RTF ниже 1 на протестированном M5 Pro, хотя запас p95 на кадр остаётся небольшим.
Бэкенды инференса
| Бэкенд | Оборудование | Модели |
|---|---|---|
| MLX | Metal GPU | Qwen3-ASR, Qwen3-TTS, Breeze TTS 2, CosyVoice3, IndexTTS2, Qwen3.5-Chat, PersonaPlex, VoiceChat 11B, Omnilingual ASR (300M / 1B / 3B / 7B), Cohere Transcribe 2B, Voxtral Mini 3B, Pyannote, Silero VAD, WeSpeaker, MOSS Transcribe Diarize, SpeechBrain ECAPA LID, Nemotron 3 Diarization, FireRedTTS3-Instruct, MOSS-VoiceGenerator |
| CoreML | CPU / GPU / Neural Engine (ANE) | Энкодер Qwen3-ASR (гибрид), Parakeet TDT, потоковый Parakeet EOU, Omnilingual ASR 300M, Kokoro-82M, Qwen3.5-Chat (опционально), диаризация Sortformer, DeepFilterNet3, Silero VAD (опционально), WeSpeaker (опционально), MOSS Transcribe Diarize, SpeechBrain ECAPA LID, Nemotron 3 Diarization |
| Accelerate | CPU (SIMD) | Предобработка аудио (STFT, мел, FFT), обработка сигналов |
Формат весов моделей
MLX-модели используют формат safetensors с 4-битной или 8-битной квантизацией (размер группы 64). CoreML-модели используют скомпилированный формат .mlmodelc. Скрипты конвертации в scripts/ конвертируют из чекпоинтов PyTorch.
Для Cohere и Voxtral также доступны пакеты MLX с аффинным INT5. MLX не поддерживает аффинный INT7; поддерживаемый вариант повышенного качества — INT8.
| Модель | Параметры | Квантизация | Размер на диске |
|---|---|---|---|
| Qwen3-ASR 0.6B (MLX) | ~600M | 4-bit / 8-bit | 680 МБ / 1.0 ГБ |
| Qwen3-ASR 0.6B (CoreML) | ~186M (энкодер) | INT8 | ~180 МБ |
| Qwen3-ASR 1.7B (MLX) | ~1.7B | 4-bit / 8-bit | 2.1 ГБ / 3.2 ГБ |
| Parakeet-TDT 0.6B (CoreML) | ~600M | INT8 | 500 МБ |
| Whisper Large-v3 Turbo (CoreML) | 809M | FP16 | 1.6 GB |
| MOSS Transcribe Diarize 0.9B (MLX) | 908.5M | FP16 audio + INT5 / INT8 decoder | 987.0 MiB / 1,200.1 MiB |
| MOSS Transcribe Diarize 0.9B (CoreML) | ~900M | FP16 / INT8 block-32 | 1.7 GB / 1.2 GB |
| Parakeet-EOU 120M (CoreML) | ~120M | INT8 | ~120 МБ |
| Omnilingual-ASR-CTC 300M (CoreML) | 326M | INT8 | 312 МБ |
| Omnilingual-ASR-CTC 300M (MLX) | 326M | 4-bit / 8-bit | 193 МБ / 342 МБ |
| Omnilingual-ASR-CTC 1B (MLX) | 1.01B | 4-bit / 8-bit | 549 МБ / 1006 МБ |
| Omnilingual-ASR-CTC 3B (MLX) | ~3B | 4-bit / 8-bit | 1.71 ГБ / 3.16 ГБ |
| Omnilingual-ASR-CTC 7B (MLX) | ~7B | 4-bit / 8-bit | 3.55 ГБ / 6.63 ГБ |
| Cohere Transcribe 2B (MLX) | 2B | FP16 / INT5 / INT8 | 3.85 / 1.62 / 2.25 GiB |
| Voxtral Mini 3B 2507 (MLX) | 3B | FP16 / INT5 / INT8 | 8.71 / 3.77 / 5.18 GiB |
| Qwen3-ForcedAligner 0.6B (MLX) | ~600M | 4-bit / 8-bit | 979 МБ / 1.4 ГБ |
| Qwen3-ForcedAligner 0.6B (CoreML) | ~600M | INT4 / INT8 | 630 МБ / 1.0 ГБ |
| Qwen3-TTS 0.6B (MLX) | ~600M | 4-bit / 8-bit | 1.7 ГБ / 2.4 ГБ |
| Qwen3-TTS 1.7B (MLX) | ~1.7B | 4-bit / 8-bit | 3.2 ГБ / 4.8 ГБ |
| CosyVoice3 0.5B (MLX) | ~500M | 4-bit LLM | ~1.2 ГБ |
| IndexTTS2 expanded bundle (MLX) | 1.5B-class | FP16 + auxiliary models | ~4.8 GB |
| Kokoro-82M (CoreML) | 82M | INT8 (1 bucket) | ~89 МБ |
| Qwen3.5-Chat 0.8B (MLX) | ~800M | INT4 | 418 МБ |
| Qwen3.5-Chat 0.8B (CoreML) | ~800M | INT8 | 981 МБ |
| PersonaPlex 7B (MLX) | ~7B | 4-bit / 8-bit | 4.9 ГБ / 9.1 ГБ |
| VoiceChat 11B (MLX) | ~11B | INT5 / INT8 | 8.56 GB / 12.11 GB |
| Pyannote VAD (MLX) | ~1.49M | float32 | ~5.7 МБ |
| Silero VAD v5 | ~309K | float32 | ~1.2 МБ (MLX и CoreML) |
| p99 turn-1-mini | 5.3M | Float32 | 22 MB (CoreML) |
| VAP (otoSpeech) | 5.8M | Float32 | 39 MB (CoreML) / 40 MB (ONNX) |
| WeSpeaker ResNet34 | ~6.6M | float32 | ~25 МБ (MLX и CoreML) |
| SpeechBrain ECAPA VoxLingua107 | 21.25M | FP16 | ~40.6 MiB (MLX) / ~40.8 MiB (CoreML) |
| ReDimNet2-B6 | 12.3M | float16 | ~25 МиБ (CoreML) |
| Pyannote Community-1 (CoreML) | 8.35M | float32 + native VBx | ~32 MB |
| Nemotron 3 Diarization (CoreML / MLX) | 100M | INT8 | ~100 MB per backend |
| Sortformer (CoreML) | — | float16 | ~50 МБ |
| DeepFilterNet3 (CoreML) | ~2.1M | FP16 | ~4.2 МБ |
| LocalVQE v1.4-AEC (CoreML + C++) | 200K + 2 742 | FP16 + FP32 | ~732 КБ |
Инициализация моделей MLX
QuantizedLinear.preQuantized создаёт нулевые массивы-заполнители для квантованных линейных слоёв, загружаемых из контрольной точки, без случайных весов и временных графов их квантования. withThrowawayRandomState изолирует от цепочки случайных ключей вызывающего кода инициализацию с плавающей точкой, результаты которой затем отбрасываются. Загрузчики составных моделей изолируют каждый компонент: T5 и EnCodec в MAGNeT, T5Gemma и SAME-L в Stable Audio 3 и кодек Mimi в CSM. Квантованные эмбеддинги CSM по-прежнему используют исходный инициализатор и сохраняют известное ограничение времени жизни графа инициализации.
Оптимизации производительности
- MLX compile() — Слияние ядер для авторегрессивных циклов. Talker использует
compile(shapeless: true), Code Predictor —compile(shapeless: false)с фиксированными размерами кеша. - Библиотека Metal-шейдеров — Предкомпилированный metallib избавляет от ~5x накладных расходов JIT-компиляции. Собирается через
scripts/build_mlx_metallib.sh. - Декодирование кодека чанками — Декодер TTS обрабатывает аудио чанками по 25 кадров с перекрытием контекста в 10 кадров, чтобы избежать таймаута GPU.
- Batch-doubled CFG — DiT в CosyVoice3 вдвое сокращает проходы flow matching, батчируя условный и безусловный проходы вместе.
- Fused RoPE — Использует
MLXNN.RoPEна базе Metal-ядра вместо ручной ротации. - Слияние BN — Батч-нормализация WeSpeaker сливается в веса Conv2d на этапе конвертации.
Обработка аудио
Весь аудио I/O использует PCM Float32. Внутренний ресемплинг выполняет конвертацию форматов:
| Модель | Ожидаемая частота | Формат |
|---|---|---|
| Qwen3-ASR | 16 кГц | Моно Float32 |
| Cohere Transcribe 2B | 16 kHz | Mono Float32 |
| Voxtral Mini 3B | 16 kHz | Mono Float32 |
| Qwen3-TTS | 24 кГц на выходе | Моно Float32 |
| CosyVoice3 | 24 кГц на выходе | Моно Float32 |
| Kokoro-82M | 24 кГц на выходе | Моно Float32 |
| PersonaPlex | 24 кГц I/O | Моно Float32 |
| Pyannote VAD | 16 кГц | Моно Float32 |
| Silero VAD | 16 кГц | Моно Float32 |
| WeSpeaker | 16 кГц | Моно Float32 |
| SpeechBrain ECAPA LID | 16 kHz | Mono Float32 |
| ReDimNet2-B6 | 16 кГц | Моно Float32 |
| DeepFilterNet3 | 48 кГц | Моно Float32 |
Структура исходников
Sources/
AudioCommon/ Общие протоколы, аудио I/O, захват системного
вывода (SystemAudioTap), загрузчик HuggingFace,
SentencePieceModel (ридер protobuf)
MLXCommon/ Утилиты MLX: загрузка весов, хелперы QuantizedLinear,
хелпер SDPA multi-head attention, metal budget
Qwen3Common/ Общие компоненты моделей (KV cache, RoPE, квантизация)
Qwen3ASR/ Qwen3-ASR распознавание речи
ParakeetASR/ Parakeet TDT распознавание речи (CoreML)
ParakeetStreamingASR/ Parakeet EOU 120M потоковая диктовка (CoreML)
OmnilingualASR/ Meta wav2vec2 + CTC, 1 672 языка
(CoreML 300M + MLX 300M / 1B / 3B / 7B)
CohereTranscribeASR/ Cohere Transcribe 2B speech-to-text (MLX)
VoxtralASR/ Voxtral Mini 3B speech-to-text (MLX)
Qwen3TTS/ Qwen3-TTS синтез речи
FireRedTTS3TTS/ FireRedTTS3-Instruct (MLX, Float32)
MossVoiceGeneratorTTS/ MOSS-VoiceGenerator (MLX, BF16 + FP32)
CosyVoiceTTS/ CosyVoice3 синтез речи
KokoroTTS/ Kokoro-82M синтез речи (CoreML)
Qwen3Chat/ Qwen3.5-0.8B on-device LLM-чат (MLX + CoreML)
PersonaPlex/ PersonaPlex речь в речь
SpeechVAD/ VAD (Silero + Pyannote), диаризация, эмбеддинги спикеров
SpeechLanguageID/ Определение языка речи (SpeechBrain ECAPA, MLX + CoreML, 107 меток)
SpeechEnhancement/ DeepFilterNet3 подавление шума (CoreML)
SourceSeparation/ Open-Unmix HQ / UMX-L + HTDemucs (Demucs v4) music source separation (MLX, 4 stems)
MAGNeTMusicGen/ MAGNeT text-to-music generation (MLX, 30 s @ 32 kHz, INT4/INT8)
VoxCPM2TTS/ VoxCPM2 text-to-speech (MLX, 48 kHz, voice cloning + voice design)
IndexTTS2TTS/ IndexTTS2 voice cloning (MLX, semantic GPT + emotion/tempo/pause control + S2Mel + BigVGAN)
VibeVoiceTTS/ VibeVoice long-form / multi-speaker TTS (MLX, EN/ZH)
MADLADTranslation/ MADLAD-400 many-to-many translation (MLX, 400+ languages)
GLiNER/ GLiNER2.5-Decide classification + entity spans (MLX, INT8/FP16/FP32)
AudioCLILib/ Реализации команд CLI
AudioCLI/ Точка входа CLI
scripts/ Конвертация моделей (PyTorch → MLX/CoreML), бенчмаркинг
Tests/ Юнит- и интеграционные тесты
Examples/ Демо-приложения (PersonaPlexDemo, SpeechDemo)GLiNER2.5-Decide: нативная классификация и фрагменты сущностей на MLX (веса INT8, FP16 или FP32); Python при инференсе не нужен.
⚠ Translation out of date — English guide. The new Clef section below awaits translation.
Clef-flash: development preview of local text decisions (9B, affine 4-bit MLX), with a joint schema head and a separate output-embedding prior.
MOSS-TTS-Nano
Потоковый синтез и клонирование голоса через CoreML: стерео 48 кГц и блоки по 80 мс.
MossTTSNanoModel выполняет запросы последовательно и создаёт новое состояние CoreML для каждого высказывания. synthesize и synthesizeStream сохраняют стерео; SpeechGenerationModel возвращает моно. Передайте language: nil. Поток завершается пустым финальным маркером.
Нужны macOS 15+ / iOS 18+; четыре скомпилированных модели занимают 367,6 МБ. Промпт, эталон и запрошенные кадры делят контекст из 1 024 строк. Переполнение или достижение maxFrames до естественного конца речи вызывает ошибку. По умолчанию CPU; gpu разрешает CPU+GPU. Сиды PCG64 совместимы с NumPy; численные различия бэкендов всё же могут изменить результат.
Необязательное управление моделями
SpeechRuntime обеспечивает совместную загрузку, отменяемую очередь FIFO и последовательное выполнение. Qwen3ASRRuntime выбирает MLX или полный CoreML через явные дескрипторы; нативные API и параметры CLI остаются доступны.
Сервер удерживает разрешение на протяжении всего запроса, включая потоковый вывод, и допускает до 32 ожидающих запросов. Сбои ASR передаются как ошибки HTTP или события ошибок WebSocket; корректная пустая расшифровка остаётся успешной. Воспроизведение сохраняет избыточные отсчёты. Кэшированные модели и ожидающее аудио продолжают занимать память.
Voxtral TTS
Voxtral 4B TTS 2603 работает локально на Apple Silicon через модуль VoxtralTTS: 20 готовых голосов, девять языков и монофоническая речь с частотой 24 кГц.
VoxtralTTS → 26-layer LM → 3-layer acoustic transformer → 24 kHz PCMДоступны только готовые голоса; клонирование по образцу аудио не поддерживается. SDK, CLI, WebSocket и HTTP PCM выдают аудио по мере генерации. Полный входной текст необходимо передать в начале. Веса модели распространяются по CC BY-NC 4.0.
Fish Audio Drama 3
Экспериментальная нативная поддержка Drama 3 в MLX доступна через FishAudioDrama3Model. Модель MoE с 35 млрд параметров, гибридным вниманием, временным аудиодекодером и кодеком Fish DAC создаёт монофонический звук 44,1 кГц. Версия с 4-битными весами прошла на Apple M5 Pro проверку звука и независимую ASR-проверку для генерации по тексту, клонирования по образцу и вывода CLI. Варианты 8 бит и BF16 ещё не проверены.
Режим balanced по умолчанию очищает неиспользуемые буферы MLX свыше 512 MiB на границах этапов. Также действует общий лимит кэша на время жизни модели с сохранением более низкого бюджета вызывающего кода; ни один из механизмов не ограничивает общую память процесса. --fish-drama3-memory-mode unrestricted или memoryOptions: .unrestricted загружает веса заранее и отключает очистку между этапами, но сохраняет лимит на время жизни модели.
При синтезе только по тексту загрузка 794.4 MiB весов энкодера образца откладывается. Первое кодирование образца загружает и сохраняет их; до этого файл codec.safetensors должен оставаться доступным. Заранее вычисленные коды образца не требуют энкодера.
FishAudioTTS: FishAudioDrama3Model · backbone.model.* · semantic_head.* · tower.* · codec.safetensors
Создано с Fish Audio. Пакеты сохраняют Community License и NOTICE.
Потоковый PCM доступен через generateStreaming, generateStream и --stream. По умолчанию блок содержит 3 кадра кодека, около 139 мс аудио. Автоматическое разбиение длинного текста и потоковый ввод текста пока не поддерживаются.
Каждая кодовая книга башни использует 4 096 значений токенов. При буферизованном и потоковом декодировании Fish DAC остаточные коды ограничиваются диапазоном остаточных кодовых книг кодека из 1 024 записей. Возвращаемые кодовые книги сохраняют исходные значения башни.
Недопустимые размерности вращательного позиционного кодирования отклоняются до загрузки весов модели.