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.

Implementação (PR #541): main

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).

BreezeTTS · CLI · Swift API

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.

Uso de Swift e CLI

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

BackendHardwareModelos
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.

ModeloParametrosQuantizacaoTamanho em disco
Qwen3-ASR 0.6B (MLX)~600M4-bit / 8-bit680 MB / 1.0 GB
Qwen3-ASR 0.6B (CoreML)~186M (codificador)INT8~180 MB
Qwen3-ASR 1.7B (MLX)~1.7B4-bit / 8-bit2.1 GB / 3.2 GB
Parakeet-TDT 0.6B (CoreML)~600MINT8500 MB
Whisper Large-v3 Turbo (CoreML)809MFP161.6 GB
MOSS Transcribe Diarize 0.9B (MLX)908.5MFP16 audio + INT5 / INT8 decoder987.0 MiB / 1,200.1 MiB
MOSS Transcribe Diarize 0.9B (CoreML)~900MFP16 / INT8 block-321.7 GB / 1.2 GB
Parakeet-EOU 120M (CoreML)~120MINT8~120 MB
Omnilingual-ASR-CTC 300M (CoreML)326MINT8312 MB
Omnilingual-ASR-CTC 300M (MLX)326M4-bit / 8-bit193 MB / 342 MB
Omnilingual-ASR-CTC 1B (MLX)1.01B4-bit / 8-bit549 MB / 1006 MB
Omnilingual-ASR-CTC 3B (MLX)~3B4-bit / 8-bit1.71 GB / 3.16 GB
Omnilingual-ASR-CTC 7B (MLX)~7B4-bit / 8-bit3.55 GB / 6.63 GB
Cohere Transcribe 2B (MLX)2BFP16 / INT5 / INT83.85 / 1.62 / 2.25 GiB
Voxtral Mini 3B 2507 (MLX)3BFP16 / INT5 / INT88.71 / 3.77 / 5.18 GiB
Qwen3-ForcedAligner 0.6B (MLX)~600M4-bit / 8-bit979 MB / 1.4 GB
Qwen3-ForcedAligner 0.6B (CoreML)~600MINT4 / INT8630 MB / 1.0 GB
Qwen3-TTS 0.6B (MLX)~600M4-bit / 8-bit1.7 GB / 2.4 GB
Qwen3-TTS 1.7B (MLX)~1.7B4-bit / 8-bit3.2 GB / 4.8 GB
CosyVoice3 0.5B (MLX)~500MLLM 4-bit~1.2 GB
IndexTTS2 expanded bundle (MLX)1.5B-classFP16 + auxiliary models~4.8 GB
Kokoro-82M (CoreML)82MINT8 (1 bucket)~89 MB
Qwen3.5-Chat 0.8B (MLX)~800MINT4418 MB
Qwen3.5-Chat 0.8B (CoreML)~800MINT8981 MB
PersonaPlex 7B (MLX)~7B4-bit / 8-bit4.9 GB / 9.1 GB
VoiceChat 11B (MLX)~11BINT5 / INT88.56 GB / 12.11 GB
Pyannote VAD (MLX)~1.49Mfloat32~5.7 MB
Silero VAD v5~309Kfloat32~1.2 MB (MLX e CoreML)
p99 turn-1-mini5.3MFloat3222 MB (CoreML)
VAP (otoSpeech)5.8MFloat3239 MB (CoreML) / 40 MB (ONNX)
WeSpeaker ResNet34~6.6Mfloat32~25 MB (MLX e CoreML)
SpeechBrain ECAPA VoxLingua10721.25MFP16~40.6 MiB (MLX) / ~40.8 MiB (CoreML)
ReDimNet2-B612.3Mfloat16~25 MiB (CoreML)
Pyannote Community-1 (CoreML)8.35Mfloat32 + native VBx~32 MB
Nemotron 3 Diarization (CoreML / MLX)100MINT8~100 MB per backend
Sortformer (CoreML)—float16~50 MB
DeepFilterNet3 (CoreML)~2.1MFP16~4.2 MB
LocalVQE v1.4-AEC (CoreML + C++)200K + 2.742FP16 + 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

Processamento de audio

Todo o I/O de audio usa PCM Float32. A reamostragem interna lida com a conversao de formato:

ModeloTaxa esperadaFormato
Qwen3-ASR16 kHzMono Float32
Cohere Transcribe 2B16 kHzMono Float32
Voxtral Mini 3B16 kHzMono Float32
Qwen3-TTSsaida 24 kHzMono Float32
CosyVoice3saida 24 kHzMono Float32
Kokoro-82Msaida 24 kHzMono Float32
PersonaPlexI/O 24 kHzMono Float32
Pyannote VAD16 kHzMono Float32
Silero VAD16 kHzMono Float32
WeSpeaker16 kHzMono Float32
SpeechBrain ECAPA LID16 kHzMono Float32
ReDimNet2-B616 kHzMono Float32
DeepFilterNet348 kHzMono 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.

MOSS-TTS-Nano

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 PCM

Apenas 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.

Ler o guia do Voxtral TTS

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.

Medição de 4 bits

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.