Arquitetura
TTS nativo por instruções
Compile o SDK nativo a partir do código de main. O Homebrew e outras versões CLI pré-compiladas podem ainda não incluir estes motores.
Bundles MLX publicados: aufklarer/FireRedTTS3-Instruct-MLX-fp32 · aufklarer/MOSS-VoiceGenerator-MLX-bf16
FireRedTTS3-Instruct — FireRedTTS3TTS: FireRedTTS3-Instruct mantém os pesos Float32 do modelo e do decodificador. Retorna áudio completo em memória: omita --stream. --language aceita aliases de inglês e chinês. Atingir o limite gera erro, em vez de sucesso com áudio truncado.
MOSS-VoiceGenerator — MossVoiceGeneratorTTS: MOSS-VoiceGenerator mantém pesos de linguagem BF16 e o codec de síntese FP32. Use --stream para PCM incremental. Omita --language e inclua o idioma em --instruct. A conclusão esvazia os dezesseis livros de códigos.
Os campos de texto e instrução têm um limite individual de 32.768 bytes UTF-8. O prompt de entrada completo, incluindo o modelo, deve caber em 4.096 tokens após renderização. Entradas que excedam qualquer limite são rejeitadas.
O cumprimento de instruções ainda não foi pontuado. As medições com textos curtos descrevem a configuração testada; a certificação de regressão de latência continua inconclusiva.
Breeze TTS 2 · BreezeTTS
TTS em inglês e chinês com criação de voz, clonagem e direção por áudio de referência e streaming de áudio (MLX BF16/8-bit, 24 kHz; licença de pesquisa e uso não comercial).
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
Motor nativo para Apple · PocketTTS
PocketTTS adiciona síntese nativa CoreML ao speech-swift. Todas as etapas usam apenas CPU por padrão. A voz inglesa Alba transmite blocos de 1.920 amostras a 24 kHz, ou 80 ms por bloco.
speech-swift e organizado como um pacote Swift modular com protocolos compartilhados, modulos de modelo independentes e um CLI unificado. Toda a inferencia roda no dispositivo usando MLX (GPU Metal) ou CoreML (Neural Engine).
Grafo de dependencias dos modulos
┌──────────┐
│ AudioCLI │ (entry point)
└────┬─────┘
│
┌──────┴──────┐
│ AudioCLILib │ (commands)
└──────┬──────┘
│
┌─────────┬───────┼───────┬──────────┬──────────────┐
│ │ │ │ │ │
┌────┴───┐ ┌──┴──┐ ┌──┴──┐ ┌─┴────┐ ┌───┴────┐ ┌──────┴───────┐
│Qwen3ASR│ │Qwen3│ │Cosy │ │Perso-│ │Speech- │ │ Speech- │
│Parakeet│ │ TTS │ │Voice│ │naPlex│ │ VAD │ │Enhancement │
└────┬───┘ └──┬──┘ └──┬──┘ └──┬───┘ └───┬───┘ └──────┬───────┘
│ │ │ │ │ │
└────────┴───────┼───────┴─────────┘ │
│ │
┌──────┴──────┐ │
│ Qwen3Common │ (shared layers) │
└──────┬──────┘ │
│ │
┌──────┴──────┐ │
│ AudioCommon │ ◄──────────────────────┘
└─────────────┘ (protocols, audio I/O)Orçamento da cache de buffers MLX
Os modelos MLX partilham um limite predefinido de buffers reutilizáveis de min(2 GiB, physical RAM / 4), desde o carregamento dos pesos até ao fim da sua vida útil. São preservados os orçamentos inferiores do chamador, incluindo MLX.Memory.cacheLimit = 0, e os orçamentos específicos existentes. O limite aplica-se aos buffers inativos; pesos ativos, caches KV e memória total do processo podem ultrapassá-lo. O MLX reduz a cache ao alocar memória; o último buffer libertado pode fazê-la ultrapassar temporariamente o orçamento até à alocação seguinte.
unload() liberta o registo do modelo; os modelos sem este método libertam-no ao serem destruídos. O último proprietário repõe o orçamento do chamador; os descarregamentos anteriores mantêm os limites dos modelos restantes. Os caminhos que usam apenas CoreML não registam orçamentos MLX.
MOSS Transcribe Diarize
MossTranscribe retorna segmentos com timestamps e identificação de locutor por backends nativos CoreML e MLX. CoreML usa estado fixo de 1.024 tokens para gravações curtas. MLX usa contexto dinâmico de 131.072 tokens, pesos de decoder affine INT5/INT8 e caches KV opcionais FP16/INT8. Ambos são runtimes offline e autoregressivos, sem streaming.
VoiceChat 11B
Tarefa e referência: speech-to-speech duplex; SALM-Duplex: Efficient and Direct Duplex Modeling for Speech-to-Speech Language Model (Interspeech 2025), citado pelo model card upstream da NVIDIA.
Runtime completo, M5 Pro 48 GB, Release, cadência live de 80 ms: o INT5 com heads protegidos atinge cerca de 8.69 GB de RSS de pico; três resultados controlados de RTF do pipeline completo foram 0.96, 0.96 e 0.99. O desempenho INT8 otimizado ainda não foi medido novamente.
VoiceChat implementa o caminho nativo completo de áudio para áudio em MLX: percepção FastConformer causal, canais duplex de texto/função Nemotron-H, decoder EAR-TTS independente condicionado por texto com oito iterações MaskGIT e codec neural de 22,05 kHz. O streaming mantém caches limitados de atenção e convolução causal por camada, enquanto a janela live estável de oito quadros do codec usa um grafo compilado. Cada quadro de entrada de 80 ms produz uma decisão de linguagem, 31 códigos RVQ e exatamente 1.764 amostras de saída. O loader exige um bundle completo encoder/ + llm/ + tts/ e rejeita exports antigos apenas de compreensão. INT5 agora mantém RTF médio abaixo de 1 no M5 Pro testado, embora a margem p95 por quadro continue estreita.
Backends de inferencia
| Backend | Hardware | Modelos |
|---|---|---|
| MLX | GPU Metal | 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) | Codificador Qwen3-ASR (hibrido), Parakeet TDT, streaming Parakeet EOU, Omnilingual ASR 300M, Kokoro-82M, Qwen3.5-Chat (opcional), diarizacao Sortformer, DeepFilterNet3, Silero VAD (opcional), WeSpeaker (opcional), MOSS Transcribe Diarize, SpeechBrain ECAPA LID, Nemotron 3 Diarization |
| Accelerate | CPU (SIMD) | Pre-processamento de audio (STFT, mel, FFT), processamento de sinais |
Formato dos pesos do modelo
Modelos MLX usam o formato safetensors com quantizacao de 4 bits ou 8 bits (tamanho de grupo 64). Modelos CoreML usam o formato compilado .mlmodelc. Scripts de conversao em scripts/ convertem a partir de checkpoints PyTorch.
Cohere e Voxtral também oferecem pacotes MLX INT5 afins. O MLX não aceita INT7 afim; INT8 é a opção compatível de maior qualidade.
| Modelo | Parametros | Quantizacao | Tamanho em disco |
|---|---|---|---|
| Qwen3-ASR 0.6B (MLX) | ~600M | 4-bit / 8-bit | 680 MB / 1.0 GB |
| Qwen3-ASR 0.6B (CoreML) | ~186M (codificador) | INT8 | ~180 MB |
| Qwen3-ASR 1.7B (MLX) | ~1.7B | 4-bit / 8-bit | 2.1 GB / 3.2 GB |
| Parakeet-TDT 0.6B (CoreML) | ~600M | INT8 | 500 MB |
| 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 MB |
| Omnilingual-ASR-CTC 300M (CoreML) | 326M | INT8 | 312 MB |
| Omnilingual-ASR-CTC 300M (MLX) | 326M | 4-bit / 8-bit | 193 MB / 342 MB |
| Omnilingual-ASR-CTC 1B (MLX) | 1.01B | 4-bit / 8-bit | 549 MB / 1006 MB |
| Omnilingual-ASR-CTC 3B (MLX) | ~3B | 4-bit / 8-bit | 1.71 GB / 3.16 GB |
| Omnilingual-ASR-CTC 7B (MLX) | ~7B | 4-bit / 8-bit | 3.55 GB / 6.63 GB |
| 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 MB / 1.4 GB |
| Qwen3-ForcedAligner 0.6B (CoreML) | ~600M | INT4 / INT8 | 630 MB / 1.0 GB |
| Qwen3-TTS 0.6B (MLX) | ~600M | 4-bit / 8-bit | 1.7 GB / 2.4 GB |
| Qwen3-TTS 1.7B (MLX) | ~1.7B | 4-bit / 8-bit | 3.2 GB / 4.8 GB |
| CosyVoice3 0.5B (MLX) | ~500M | LLM 4-bit | ~1.2 GB |
| IndexTTS2 expanded bundle (MLX) | 1.5B-class | FP16 + auxiliary models | ~4.8 GB |
| Kokoro-82M (CoreML) | 82M | INT8 (1 bucket) | ~89 MB |
| Qwen3.5-Chat 0.8B (MLX) | ~800M | INT4 | 418 MB |
| Qwen3.5-Chat 0.8B (CoreML) | ~800M | INT8 | 981 MB |
| PersonaPlex 7B (MLX) | ~7B | 4-bit / 8-bit | 4.9 GB / 9.1 GB |
| VoiceChat 11B (MLX) | ~11B | INT5 / INT8 | 8.56 GB / 12.11 GB |
| Pyannote VAD (MLX) | ~1.49M | float32 | ~5.7 MB |
| Silero VAD v5 | ~309K | float32 | ~1.2 MB (MLX e 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 MB (MLX e CoreML) |
| SpeechBrain ECAPA VoxLingua107 | 21.25M | FP16 | ~40.6 MiB (MLX) / ~40.8 MiB (CoreML) |
| ReDimNet2-B6 | 12.3M | float16 | ~25 MiB (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 MB |
| DeepFilterNet3 (CoreML) | ~2.1M | FP16 | ~4.2 MB |
| LocalVQE v1.4-AEC (CoreML + C++) | 200K + 2.742 | FP16 + FP32 | ~732 KB |
Inicialização de modelos MLX
QuantizedLinear.preQuantized cria matrizes provisórias de zeros para camadas lineares quantizadas carregadas de um checkpoint, evitando pesos aleatórios e os respetivos grafos temporários de quantização. withThrowawayRandomState mantém a inicialização em ponto flutuante que será descartada fora da cadeia de chaves aleatórias de quem chama. Os carregadores de modelos compostos isolam cada componente: T5 e EnCodec do MAGNeT, T5Gemma e SAME-L do Stable Audio 3 e o codec Mimi do CSM. Os embeddings quantizados do CSM continuam a usar o inicializador original e mantêm a sua limitação conhecida quanto ao tempo de vida do grafo de inicialização.
Otimizacoes de desempenho
- MLX compile() — Fusao de kernels para loops autoregressivos. Talker usa
compile(shapeless: true), Code Predictor usacompile(shapeless: false)com tamanhos de cache fixos. - Biblioteca de shaders Metal — Metallib pre-compilada evita ~5x de overhead de compilacao JIT. Construida via
scripts/build_mlx_metallib.sh. - Decode de codec em chunks — O decodificador TTS processa audio em chunks de 25 frames com sobreposicao de contexto de 10 frames para evitar timeout da GPU.
- CFG com batch duplicado — O DiT do CosyVoice3 reduz pela metade os passes de flow matching agrupando condicional + incondicional juntos.
- RoPE fusionado — Usa
MLXNN.RoPEapoiado por kernel Metal em vez de rotacao manual. - Fusao de BN — A batch normalization do WeSpeaker e fusionada nos pesos Conv2d em tempo de conversao.
Processamento de audio
Todo o I/O de audio usa PCM Float32. A reamostragem interna lida com a conversao de formato:
| Modelo | Taxa esperada | Formato |
|---|---|---|
| Qwen3-ASR | 16 kHz | Mono Float32 |
| Cohere Transcribe 2B | 16 kHz | Mono Float32 |
| Voxtral Mini 3B | 16 kHz | Mono Float32 |
| Qwen3-TTS | saida 24 kHz | Mono Float32 |
| CosyVoice3 | saida 24 kHz | Mono Float32 |
| Kokoro-82M | saida 24 kHz | Mono Float32 |
| PersonaPlex | I/O 24 kHz | Mono Float32 |
| Pyannote VAD | 16 kHz | Mono Float32 |
| Silero VAD | 16 kHz | Mono Float32 |
| WeSpeaker | 16 kHz | Mono Float32 |
| SpeechBrain ECAPA LID | 16 kHz | Mono Float32 |
| ReDimNet2-B6 | 16 kHz | Mono Float32 |
| DeepFilterNet3 | 48 kHz | Mono Float32 |
Estrutura de codigo-fonte
Sources/
AudioCommon/ Protocolos compartilhados, E/S de áudio, captura
da saída do sistema (SystemAudioTap), downloader
HuggingFace, SentencePieceModel (leitor protobuf)
MLXCommon/ MLX utilities: weight loading, QuantizedLinear helpers,
SDPA multi-head attention helper, metal budget
Qwen3Common/ Shared model components (KV cache, RoPE, quantization)
Qwen3ASR/ Qwen3-ASR speech-to-text
ParakeetASR/ Parakeet TDT speech-to-text (CoreML)
ParakeetStreamingASR/ Parakeet EOU 120M streaming dictation (CoreML)
OmnilingualASR/ Meta wav2vec2 + CTC, 1,672 languages
(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 text-to-speech
FireRedTTS3TTS/ FireRedTTS3-Instruct (MLX, Float32)
MossVoiceGeneratorTTS/ MOSS-VoiceGenerator (MLX, BF16 + FP32)
CosyVoiceTTS/ CosyVoice3 text-to-speech
KokoroTTS/ Kokoro-82M text-to-speech (CoreML)
Qwen3Chat/ Qwen3.5-0.8B on-device LLM chat (MLX + CoreML)
PersonaPlex/ PersonaPlex speech-to-speech
SpeechVAD/ VAD (Silero + Pyannote), diarization, speaker embeddings
SpeechLanguageID/ Identificação do idioma falado (SpeechBrain ECAPA, MLX + CoreML, 107 rótulos)
SpeechEnhancement/ DeepFilterNet3 noise suppression (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 command implementations
AudioCLI/ CLI entry point
scripts/ Model conversion (PyTorch → MLX/CoreML), benchmarking
Tests/ Unit and integration tests
Examples/ Demo apps (PersonaPlexDemo, SpeechDemo)GLiNER2.5-Decide: classificação e trechos de entidades nativos em MLX (pesos INT8, FP16 ou FP32); sem Python na inferência.
⚠ 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
Síntese de voz em streaming e clonagem com CoreML, áudio estéreo de 48 kHz e blocos de 80 ms.
MossTTSNanoModel serializa pedidos e cria um novo estado CoreML por fala. synthesize e synthesizeStream preservam estéreo; SpeechGenerationModel retorna uma mistura mono. Passe language: nil. O fluxo termina com um marcador final vazio.
macOS 15+ / iOS 18+; quatro modelos compilados somam 367,6 MB. Prompt, referência e quadros solicitados compartilham 1.024 linhas de contexto. Excesso de contexto ou atingir maxFrames antes do fim natural gera erro. CPU é o padrão; gpu permite CPU+GPU. As sementes PCG64 são compatíveis com NumPy; diferenças numéricas entre backends podem alterar a saída.
Gestão opcional de modelos
SpeechRuntime oferece carregamento compartilhado, admissão FIFO cancelável e execução serializada. Qwen3ASRRuntime seleciona MLX ou CoreML completo por descritores explícitos; APIs nativas e opções CLI continuam disponíveis.
O servidor mantém uma permissão durante toda a solicitação, incluindo a saída em streaming, com até 32 solicitações em espera. Falhas ASR geram erros HTTP ou eventos de erro WebSocket; transcrições vazias válidas continuam sendo sucesso. A reprodução preserva amostras excedentes. Modelos em cache e áudio pendente continuam ocupando memória.
Voxtral TTS
Voxtral 4B TTS 2603 executa localmente no Apple Silicon pelo módulo VoxtralTTS: 20 vozes predefinidas, nove idiomas e fala mono a 24 kHz.
VoxtralTTS → 26-layer LM → 3-layer acoustic transformer → 24 kHz PCMApenas vozes predefinidas; a clonagem com áudio de referência não está disponível. SDK, CLI, WebSocket e HTTP PCM emitem áudio durante a geração. O texto de entrada completo deve ser fornecido no início. Os pesos usam CC BY-NC 4.0.
Fish Audio Drama 3
O suporte nativo experimental ao Drama 3 em MLX está disponível por FishAudioDrama3Model. Uma rede MoE de 35 bilhões de parâmetros com atenção híbrida, um decodificador temporal e o codec Fish DAC produzem áudio mono de 44,1 kHz. O modelo de 4 bits passou nos testes de áudio e ASR independente para geração a partir de texto, clonagem com referência e saída CLI no Apple M5 Pro. As variantes de 8 bits e BF16 ainda não foram validadas.
O modo predefinido balanced liberta buffers MLX inativos acima de 512 MiB entre etapas. O limite partilhado também se aplica durante a vida do modelo, preservando orçamentos inferiores do chamador; nenhum destes controlos limita a memória total do processo. --fish-drama3-memory-mode unrestricted ou memoryOptions: .unrestricted carrega os pesos antecipadamente e omite a limpeza entre etapas, mantendo o limite de vida útil.
A geração somente de texto adia o carregamento de 794.4 MiB de pesos do codificador de referência. A primeira codificação os carrega e mantém; deixe codec.safetensors disponível até lá. Códigos de referência pré-calculados não precisam do codificador.
FishAudioTTS: FishAudioDrama3Model · backbone.model.* · semantic_head.* · tower.* · codec.safetensors
Criado com Fish Audio. Os pacotes preservam a Community License e NOTICE.
O streaming PCM está disponível por generateStreaming, generateStream e --stream. O bloco padrão contém 3 quadros do codec, cerca de 139 ms de áudio. A divisão automática de textos longos e a entrada progressiva de texto continuam indisponíveis.
Cada livro de códigos da torre usa 4.096 valores de token. A decodificação Fish DAC, tanto em buffer quanto em streaming, limita os códigos residuais ao intervalo dos livros residuais de 1.024 entradas do codec. Os livros de códigos retornados preservam os valores originais da torre.
Dimensões rotativas inválidas são rejeitadas antes do carregamento dos pesos do modelo.