Arquitectura

TTS nativo por instrucciones

Compile el SDK nativo desde el código de main. Las versiones precompiladas de CLI, incluido Homebrew, podrían no incluir aún estos motores.

Implementación (PR #541): main

Paquetes MLX publicados: aufklarer/FireRedTTS3-Instruct-MLX-fp32 · aufklarer/MOSS-VoiceGenerator-MLX-bf16

FireRedTTS3-Instruct — FireRedTTS3TTS: FireRedTTS3-Instruct conserva pesos Float32 del modelo y del decodificador. Devuelve el audio completo en memoria: omita --stream. --language acepta alias de inglés y chino. Alcanzar el límite genera un error, no un resultado truncado satisfactorio.

MOSS-VoiceGenerator — MossVoiceGeneratorTTS: MOSS-VoiceGenerator conserva pesos de lenguaje BF16 y el códec de síntesis FP32. Use --stream para PCM incremental. Omita --language e indique el idioma en --instruct. La finalización vacía los dieciséis libros de códigos.

Los campos de texto e instrucción tienen un límite individual de 32.768 bytes UTF-8. El mensaje de entrada completo, con su plantilla, debe caber en 4.096 tokens. Se rechazan las entradas que superen cualquiera de los límites.

El seguimiento de instrucciones aún no se ha puntuado. Las mediciones con textos cortos describen la configuración probada; la certificación de regresión de latencia sigue siendo inconclusa.

Breeze TTS 2 · BreezeTTS

TTS en inglés y chino con diseño de voz, clonación y dirección mediante audio de referencia y audio en streaming (MLX BF16/8-bit, 24 kHz; licencia de investigación y uso no 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 añade síntesis nativa con CoreML a speech-swift. Todas las etapas usan solo CPU por defecto. La voz inglesa Alba transmite bloques de 1.920 muestras a 24 kHz (80 ms por bloque).

Uso de Swift y CLI

speech-swift está organizado como un paquete Swift modular con protocolos compartidos, módulos de modelo independientes y una CLI unificada. Toda la inferencia se ejecuta en el dispositivo usando MLX (GPU Metal) o CoreML (Neural Engine).

Grafo de dependencias de módulos

                    ┌──────────┐
                    │ AudioCLI │  (punto de entrada)
                    └────┬─────┘
                         │
                  ┌──────┴──────┐
                  │ AudioCLILib │  (comandos)
                  └──────┬──────┘
                         │
       ┌─────────┬───────┼───────┬──────────┬──────────────┐
       │         │       │       │          │              │
  ┌────┴───┐ ┌──┴──┐ ┌──┴──┐ ┌─┴────┐ ┌───┴────┐ ┌──────┴───────┐
  │Qwen3ASR│ │Qwen3│ │Cosy │ │Perso-│ │Speech- │ │  Speech-     │
  │Parakeet│ │ TTS │ │Voice│ │naPlex│ │  VAD   │ │Enhancement   │
  └────┬───┘ └──┬──┘ └──┬──┘ └──┬───┘ └───┬───┘ └──────┬───────┘
       │        │       │       │         │             │
       └────────┴───────┼───────┴─────────┘             │
                        │                               │
                 ┌──────┴──────┐                        │
                 │ Qwen3Common │  (capas compartidas)   │
                 └──────┬──────┘                        │
                        │                               │
                 ┌──────┴──────┐                        │
                 │ AudioCommon │ ◄──────────────────────┘
                 └─────────────┘  (protocolos, E/S de audio)

Presupuesto de caché de búferes MLX

Los modelos MLX comparten un límite predeterminado de búferes reutilizables de min(2 GiB, physical RAM / 4) desde la carga de pesos hasta el final de su vida útil. Se respetan los presupuestos inferiores del llamador, incluido MLX.Memory.cacheLimit = 0, y los presupuestos específicos existentes. El límite afecta a los búferes inactivos; los pesos activos, las cachés KV y la memoria total del proceso pueden superarlo. MLX reduce la caché al asignar memoria; el último búfer liberado puede hacer que supere temporalmente el presupuesto hasta la siguiente asignación.

unload() libera el registro del modelo; los modelos sin este método lo liberan al destruirse. El último propietario restaura el presupuesto del llamador; las descargas anteriores mantienen los límites de los modelos restantes. Las rutas que solo usan CoreML no registran presupuestos MLX.

MOSS Transcribe Diarize

MossTranscribe devuelve segmentos con marcas de tiempo y hablante mediante backends nativos CoreML y MLX. CoreML usa un estado fijo de 1.024 tokens para grabaciones cortas. MLX usa un contexto dinámico de 131.072 tokens, pesos de decodificador affine INT5/INT8 y cachés KV opcionales FP16/INT8. Ambos son runtimes offline y autorregresivos, no de streaming.

VoiceChat 11B

Tarea y referencia: speech-to-speech dúplex; SALM-Duplex: Efficient and Direct Duplex Modeling for Speech-to-Speech Language Model (Interspeech 2025), citado por la ficha upstream de VoiceChat de NVIDIA.

Runtime completo, M5 Pro 48 GB, Release, cadencia live de 80 ms: el INT5 con cabezales protegidos alcanza unos 8.69 GB de RSS máximo; tres resultados controlados del RTF de la ruta completa fueron 0.96, 0.96 y 0.99. El rendimiento INT8 optimizado aún no se ha vuelto a medir.

VoiceChat implementa la ruta completa nativa de MLX de audio a audio: percepción FastConformer causal, canales dúplex de texto/función Nemotron-H, un decodificador EAR-TTS independiente condicionado por texto con ocho iteraciones MaskGIT y un códec neuronal de 22,05 kHz. El streaming conserva cachés acotadas de atención y convolución causal por capa, mientras que la ventana live estable de ocho tramas del códec usa un grafo compilado. Cada trama de entrada de 80 ms produce una decisión de lenguaje, 31 códigos RVQ y exactamente 1.764 muestras de salida. El cargador exige un bundle completo encoder/ + llm/ + tts/ y rechaza las exportaciones antiguas de solo comprensión. INT5 ahora mantiene un RTF agregado inferior a 1 en el M5 Pro probado, aunque el margen p95 por trama sigue siendo estrecho.

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) Encoder de Qwen3-ASR (híbrido), Parakeet TDT, Parakeet EOU streaming, Omnilingual ASR 300M, Kokoro-82M, Qwen3.5-Chat (opcional), diarización Sortformer, DeepFilterNet3, Silero VAD (opcional), WeSpeaker (opcional), MOSS Transcribe Diarize, SpeechBrain ECAPA LID, Nemotron 3 Diarization
Accelerate CPU (SIMD) Preprocesamiento de audio (STFT, mel, FFT), procesamiento de señales

Formato de pesos de los modelos

Los modelos MLX usan el formato safetensors con cuantización de 4 bits u 8 bits (tamaño de grupo 64). Los modelos CoreML usan el formato compilado .mlmodelc. Los scripts de conversión en scripts/ convierten desde checkpoints de PyTorch.

Cohere y Voxtral también ofrecen paquetes INT5 afines de MLX. MLX no admite INT7 afín; INT8 es la opción compatible de mayor calidad.

ModeloParámetrosCuantizaciónTamaño en disco
Qwen3-ASR 0.6B (MLX)~600M4-bit / 8-bit680 MB / 1.0 GB
Qwen3-ASR 0.6B (CoreML)~186M (encoder)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 en 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 y CoreML)
p99 turn-1-mini5.3MFloat3222 MB (CoreML)
VAP (otoSpeech)5.8MFloat3239 MB (CoreML) / 40 MB (ONNX)
WeSpeaker ResNet34~6.6Mfloat32~25 MB (MLX y 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

Inicialización de modelos MLX

QuantizedLinear.preQuantized crea matrices provisionales de ceros para las capas lineales cuantizadas que se cargan desde un checkpoint, evitando pesos aleatorios y sus grafos temporales de cuantización. withThrowawayRandomState mantiene la inicialización en coma flotante que se descarta fuera de la cadena de claves aleatorias del llamador. Los cargadores de modelos compuestos aíslan cada componente: T5 y EnCodec de MAGNeT, T5Gemma y SAME-L de Stable Audio 3 y el códec Mimi de CSM. Los embeddings cuantizados de CSM siguen usando el inicializador original y conservan su limitación conocida sobre la vida del grafo de inicialización.

Optimizaciones de rendimiento

Procesamiento de audio

Toda la E/S de audio usa PCM Float32. El remuestreo interno gestiona la conversión de formato:

ModeloTasa esperadaFormato
Qwen3-ASR16 kHzMono Float32
Cohere Transcribe 2B16 kHzMono Float32
Voxtral Mini 3B16 kHzMono Float32
Qwen3-TTS24 kHz de salidaMono Float32
CosyVoice324 kHz de salidaMono Float32
Kokoro-82M24 kHz de salidaMono Float32
PersonaPlex24 kHz E/SMono Float32
Pyannote VAD16 kHzMono Float32
Silero VAD16 kHzMono Float32
WeSpeaker16 kHzMono Float32
SpeechBrain ECAPA LID16 kHzMono Float32
ReDimNet2-B616 kHzMono Float32
DeepFilterNet348 kHzMono Float32

Estructura del código fuente

Sources/
  AudioCommon/            Protocolos compartidos, E/S de audio, captura de
                          la salida del sistema (SystemAudioTap),
                          descargador de HuggingFace, SentencePieceModel
                          (lector de protobuf)
  MLXCommon/              Utilidades MLX: carga de pesos, helpers QuantizedLinear,
                          helper de atención multi-head SDPA, presupuesto metal
  Qwen3Common/            Componentes de modelo compartidos (caché KV, RoPE, cuantización)
  Qwen3ASR/               Qwen3-ASR voz a texto
  ParakeetASR/            Parakeet TDT voz a texto (CoreML)
  ParakeetStreamingASR/   Dictado en streaming Parakeet EOU 120M (CoreML)
  OmnilingualASR/         Meta wav2vec2 + CTC, 1.672 idiomas
                          (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 texto a voz
  FireRedTTS3TTS/         FireRedTTS3-Instruct (MLX, Float32)
  MossVoiceGeneratorTTS/  MOSS-VoiceGenerator (MLX, BF16 + FP32)
  CosyVoiceTTS/           CosyVoice3 texto a voz
  KokoroTTS/              Kokoro-82M texto a voz (CoreML)
  Qwen3Chat/              Chat LLM en el dispositivo Qwen3.5-0.8B (MLX + CoreML)
  PersonaPlex/            PersonaPlex voz a voz
  SpeechVAD/              VAD (Silero + Pyannote), diarización, embeddings de hablante
  SpeechLanguageID/       Identificación del idioma hablado (SpeechBrain ECAPA, MLX + CoreML, 107 etiquetas)
  SpeechEnhancement/      Supresión de ruido 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/            Implementaciones de comandos de la CLI
  AudioCLI/               Punto de entrada de la CLI

scripts/              Conversión de modelos (PyTorch → MLX/CoreML), benchmarking
Tests/                Pruebas unitarias y de integración
Examples/             Apps de demostración (PersonaPlexDemo, SpeechDemo)

GLiNER2.5-Decide: clasificación y fragmentos de entidades nativos en MLX (pesos INT8, FP16 o FP32); sin Python en la inferencia.

⚠ 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íntesis de voz en streaming y clonación con CoreML, audio estéreo de 48 kHz y bloques de 80 ms.

MossTTSNanoModel serializa las solicitudes y crea un estado CoreML nuevo por frase. synthesize y synthesizeStream conservan el estéreo; SpeechGenerationModel devuelve una mezcla mono. Pasa language: nil. El flujo termina con un marcador final vacío.

Requiere macOS 15+ / iOS 18+; los cuatro modelos compilados suman 367,6 MB. El prompt, la referencia y los fotogramas solicitados comparten 1.024 filas de contexto. Se rechaza el desbordamiento y alcanzar maxFrames antes del final natural produce un error. CPU es el valor predeterminado; gpu permite CPU+GPU. Las semillas PCG64 son compatibles con NumPy; las diferencias numéricas entre backends pueden cambiar la salida.

MOSS-TTS-Nano

Gestión opcional de modelos

SpeechRuntime ofrece carga compartida, admisión FIFO cancelable y ejecución serializada. Qwen3ASRRuntime selecciona MLX o CoreML completo mediante descriptores explícitos; las API nativas y opciones CLI siguen disponibles.

El servidor mantiene un permiso durante toda la solicitud, incluida la salida en streaming, con hasta 32 solicitudes en espera. Los fallos ASR generan errores HTTP o eventos de error WebSocket; las transcripciones vacías válidas siguen siendo correctas. La reproducción conserva las muestras excedentes. Los modelos en caché y el audio pendiente siguen ocupando memoria.

Voxtral TTS

Voxtral 4B TTS 2603 se ejecuta localmente en Apple Silicon mediante el módulo VoxtralTTS: 20 voces predefinidas, nueve idiomas y voz mono a 24 kHz.

VoxtralTTS → 26-layer LM → 3-layer acoustic transformer → 24 kHz PCM

Solo voces predefinidas; no se admite clonación con audio de referencia. El SDK, la CLI, WebSocket y HTTP PCM transmiten audio durante la generación. El texto de entrada debe proporcionarse completo al principio. Los pesos usan CC BY-NC 4.0.

Leer la guía de Voxtral TTS

Fish Audio Drama 3

El soporte nativo experimental de Drama 3 en MLX está disponible mediante FishAudioDrama3Model. Una red MoE de 35 mil millones de parámetros con atención híbrida, un decodificador temporal y el códec Fish DAC producen audio mono de 44,1 kHz. El modelo de 4 bits superó las pruebas de audio y ASR independiente para generación desde texto, clonación con referencia y salida CLI en Apple M5 Pro. Las variantes de 8 bits y BF16 siguen sin validar.

El modo predeterminado balanced libera los búferes MLX inactivos por encima de 512 MiB entre etapas. También se aplica el límite compartido durante la vida del modelo, respetando presupuestos inferiores del llamador; ninguno limita la memoria total del proceso. --fish-drama3-memory-mode unrestricted o memoryOptions: .unrestricted carga los pesos de antemano y omite la limpieza entre etapas, pero mantiene el límite de vida útil.

La generación solo de texto aplaza la carga de 794.4 MiB de pesos del codificador de referencia. La primera codificación los carga y conserva; mantenga codec.safetensors disponible hasta entonces. Los códigos de referencia precalculados no necesitan el codificador.

FishAudioTTS: FishAudioDrama3Model · backbone.model.* · semantic_head.* · tower.* · codec.safetensors

Creado con Fish Audio. Los paquetes conservan la Community License y NOTICE.

Medición de 4 bits

El streaming PCM está disponible mediante generateStreaming, generateStream y --stream. Cada bloque contiene 3 fotogramas del códec por defecto, unos 139 ms de audio. La división automática de textos largos y la entrada progresiva de texto siguen sin estar disponibles.

Cada libro de códigos de la torre utiliza 4.096 valores de token. Tanto la decodificación completa como la transmisión con Fish DAC limitan los códigos residuales al rango de los libros residuales de 1.024 entradas del códec. Los libros de códigos devueltos conservan los valores originales de la torre.

Las dimensiones rotatorias no válidas se rechazan antes de cargar los pesos del modelo.