Architektur

Natives anweisungsgesteuertes TTS

Die native SDK-Unterstützung aus dem main-Quellcode bauen. Homebrew und andere vorgefertigte CLI-Versionen enthalten diese Engines möglicherweise noch nicht.

Implementierung (PR #541): main

Veröffentlichte MLX-Bundles: aufklarer/FireRedTTS3-Instruct-MLX-fp32 · aufklarer/MOSS-VoiceGenerator-MLX-bf16

FireRedTTS3-Instruct — FireRedTTS3TTS: FireRedTTS3-Instruct behält Float32-Modell- und Decodergewichte. Audio wird vollständig gepuffert zurückgegeben: --stream weglassen. --language akzeptiert englische und chinesische Aliase. Ein Generierungslimit führt zu einem Fehler statt zu abgeschnittenem Erfolg.

MOSS-VoiceGenerator — MossVoiceGeneratorTTS: MOSS-VoiceGenerator behält BF16-Sprachgewichte und den FP32-Synthesecodec. --stream liefert inkrementelles PCM. --language weglassen und Sprachanforderungen in --instruct setzen. Vor Abschluss werden alle sechzehn Codebücher geleert.

Text und Anweisung sind jeweils auf 32.768 UTF-8-Bytes begrenzt. Der vollständig gerenderte Eingabeprompt einschließlich Vorlage darf 4.096 Tokens nicht überschreiten. Eingaben oberhalb einer dieser Grenzen werden abgewiesen.

Die Anweisungsbefolgung ist unbewertet. Kurztextmessungen beschreiben den getesteten Aufbau; die Latenz-Regressionsprüfung bestehender Modelle bleibt ohne eindeutiges Ergebnis.

Breeze TTS 2 · BreezeTTS

Englische und chinesische Sprachsynthese mit Stimmdesign, Klonen und Steuerung einer Referenzstimme sowie Audiostreaming (MLX BF16/8-bit, 24 kHz; nur Forschung und nichtkommerzielle Nutzung).

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

Native Laufzeit für Apple · PocketTTS

PocketTTS ergänzt speech-swift um native CoreML-Sprachausgabe. Alle Stufen verwenden standardmäßig nur die CPU. Die englische Stimme Alba liefert jeweils 1.920 Samples mit 24 kHz, also 80 ms pro Audioblock.

Verwendung mit Swift und CLI

speech-swift ist als modulares Swift-Paket organisiert mit gemeinsamen Protokollen, unabhängigen Modellmodulen und einer einheitlichen CLI. Die gesamte Inferenz läuft auf dem Gerät über MLX (Metal-GPU) oder CoreML (Neural Engine).

Modul-Abhängigkeitsgraph

                    ┌──────────┐
                    │ AudioCLI │  (Einstiegspunkt)
                    └────┬─────┘
                         │
                  ┌──────┴──────┐
                  │ AudioCLILib │  (Befehle)
                  └──────┬──────┘
                         │
       ┌─────────┬───────┼───────┬──────────┬──────────────┐
       │         │       │       │          │              │
  ┌────┴───┐ ┌──┴──┐ ┌──┴──┐ ┌─┴────┐ ┌───┴────┐ ┌──────┴───────┐
  │Qwen3ASR│ │Qwen3│ │Cosy │ │Perso-│ │Speech- │ │  Speech-     │
  │Parakeet│ │ TTS │ │Voice│ │naPlex│ │  VAD   │ │Enhancement   │
  └────┬───┘ └──┬──┘ └──┬──┘ └──┬───┘ └───┬───┘ └──────┬───────┘
       │        │       │       │         │             │
       └────────┴───────┼───────┴─────────┘             │
                        │                               │
                 ┌──────┴──────┐                        │
                 │ Qwen3Common │  (gemeinsame Schichten)│
                 └──────┬──────┘                        │
                        │                               │
                 ┌──────┴──────┐                        │
                 │ AudioCommon │ ◄──────────────────────┘
                 └─────────────┘  (Protokolle, Audio-I/O)

Speicherbudget für den MLX-Puffercache

MLX-Modelle teilen vom Laden der Gewichte bis zum Ende ihrer Lebensdauer eine Standardgrenze von min(2 GiB, physical RAM / 4) für wiederverwendbare Puffer. Niedrigere Budgets des Aufrufers, einschließlich MLX.Memory.cacheLimit = 0, und bestehende modellspezifische Budgets bleiben erhalten. Die Grenze gilt für ungenutzte Puffer; aktive Gewichte, KV-Caches und der gesamte Prozessspeicher können sie überschreiten. MLX bereinigt den Cache bei Speicherzuweisungen. Der zuletzt freigegebene Puffer kann ihn deshalb bis zur nächsten Zuweisung vorübergehend über das Budget heben.

unload() gibt die Registrierung des Modells frei; Laufzeiten ohne diese Methode geben sie bei der Freigabe des Objekts zurück. Der letzte Besitzer stellt das Budget des Aufrufers wieder her. Frühere Entladevorgänge erhalten die Grenzen der übrigen Modelle. Reine CoreML-Pfade registrieren kein MLX-Budget.

MOSS Transcribe Diarize

MossTranscribe liefert Segmente mit Sprecherzuordnung und Zeitstempeln über native CoreML- und MLX-Backends. CoreML nutzt für kurze Aufnahmen einen festen Zustand mit 1.024 Tokens. MLX verwendet einen dynamischen Kontext mit 131.072 Tokens, affine INT5/INT8-Decodergewichte und optionale FP16/INT8-KV-Caches. Beide Laufzeiten arbeiten offline und autoregressiv, nicht als Streaming-Modell.

VoiceChat 11B

Aufgabe und Referenz: Duplex-Speech-to-Speech; SALM-Duplex: Efficient and Direct Duplex Modeling for Speech-to-Speech Language Model (Interspeech 2025), zitiert in NVIDIAs Upstream-VoiceChat-Modellkarte.

Vollständige Laufzeit, M5 Pro 48 GB, Release, 80-ms-Live-Takt: INT5 mit geschützten Heads erreicht etwa 8.69 GB Peak-RSS; drei kontrollierte Gesamtpfad-RTF-Ergebnisse waren 0.96, 0.96 und 0.99. Die optimierte INT8-Leistung wurde noch nicht neu gemessen.

VoiceChat implementiert den vollständigen nativen MLX-Audio-zu-Audio-Pfad: kausale FastConformer-Wahrnehmung, Nemotron-H-Duplex-Text-/Funktionskanäle, einen eigenständigen textkonditionierten EAR-TTS-Decoder mit acht MaskGIT-Iterationen und einen neuronalen 22,05-kHz-Codec. Das Streaming hält begrenzte Attention- und kausale Faltungs-Caches pro Schicht; das stabile Acht-Frame-Live-Codec-Fenster nutzt einen kompilierten Graphen. Jeder 80-ms-Eingangsframe erzeugt eine Sprachentscheidung, 31 RVQ-Codes und genau 1.764 Ausgabesamples. Der Loader verlangt ein vollständiges encoder/ + llm/ + tts/-Bundle und lehnt ältere reine Verständnis-Exporte ab. INT5 hält auf dem getesteten M5 Pro nun den durchschnittlichen RTF unter 1, obwohl der p95-Spielraum pro Frame knapp bleibt.

Inferenz-Backends

BackendHardwareModelle
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-Encoder (Hybrid), Parakeet TDT, Parakeet EOU Streaming, Omnilingual ASR 300M, Kokoro-82M, Qwen3.5-Chat (optional), Sortformer-Diarisierung, DeepFilterNet3, Silero VAD (optional), WeSpeaker (optional), MOSS Transcribe Diarize, SpeechBrain ECAPA LID, Nemotron 3 Diarization
Accelerate CPU (SIMD) Audio-Vorverarbeitung (STFT, Mel, FFT), Signalverarbeitung

Modell-Gewichtsformat

MLX-Modelle verwenden das Format safetensors mit 4-Bit- oder 8-Bit-Quantisierung (Gruppengröße 64). CoreML-Modelle verwenden das kompilierte Format .mlmodelc. Konvertierungsskripte in scripts/ konvertieren aus PyTorch-Checkpoints.

Cohere und Voxtral bieten zusätzlich affine MLX-INT5-Pakete. MLX unterstützt kein affines INT7; INT8 ist die unterstützte Option mit höherer Qualität.

ModellParameterQuantisierungGröße auf Disk
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)~500M4-Bit-LLM~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 & CoreML)
p99 turn-1-mini5.3MFloat3222 MB (CoreML)
VAP (otoSpeech)5.8MFloat3239 MB (CoreML) / 40 MB (ONNX)
WeSpeaker ResNet34~6,6Mfloat32~25 MB (MLX & 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

Initialisierung von MLX-Modellen

QuantizedLinear.preQuantized erstellt mit Nullen belegte Platzhalter für quantisierte lineare Schichten, deren Gewichte aus einem Checkpoint geladen werden. Dadurch entfallen zufällige Gewichte und ihre temporären Quantisierungsgraphen. withThrowawayRandomState trennt die später verworfene Gleitkomma-Initialisierung von der Zufallsschlüsselkette des Aufrufers. Bei zusammengesetzten Modellen wird jede Komponente separat gekapselt: T5 und EnCodec in MAGNeT, T5Gemma und SAME-L in Stable Audio 3 sowie der Mimi-Codec in CSM. Die quantisierten Embeddings von CSM verwenden weiterhin den Upstream-Initialisierer und behalten dessen bekannte Einschränkung bei der Lebensdauer des Initialisierungsgraphen.

Leistungsoptimierungen

Audio-Verarbeitung

Alle Audio-I/O verwenden Float32-PCM. Internes Resampling übernimmt die Formatkonvertierung:

ModellErwartete RateFormat
Qwen3-ASR16 kHzMono Float32
Cohere Transcribe 2B16 kHzMono Float32
Voxtral Mini 3B16 kHzMono Float32
Qwen3-TTS24 kHz AusgabeMono Float32
CosyVoice324 kHz AusgabeMono Float32
Kokoro-82M24 kHz AusgabeMono Float32
PersonaPlex24 kHz I/OMono Float32
Pyannote VAD16 kHzMono Float32
Silero VAD16 kHzMono Float32
WeSpeaker16 kHzMono Float32
SpeechBrain ECAPA LID16 kHzMono Float32
ReDimNet2-B616 kHzMono Float32
DeepFilterNet348 kHzMono Float32

Quellstruktur

Sources/
  AudioCommon/            Gemeinsame Protokolle, Audio-I/O, Systemausgabe-
                          Erfassung (SystemAudioTap), HuggingFace-
                          Downloader, SentencePieceModel (Protobuf-Reader)
  MLXCommon/              MLX-Hilfsprogramme: Gewichtsladen, QuantizedLinear-Helfer,
                          SDPA-Multi-Head-Attention-Helfer, Metal-Budget
  Qwen3Common/            Gemeinsame Modellkomponenten (KV-Cache, RoPE, Quantisierung)
  Qwen3ASR/               Qwen3-ASR Sprache-zu-Text
  ParakeetASR/            Parakeet TDT Sprache-zu-Text (CoreML)
  ParakeetStreamingASR/   Parakeet EOU 120M Streaming-Diktat (CoreML)
  OmnilingualASR/         Meta wav2vec2 + CTC, 1.672 Sprachen
                          (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-zu-Sprache
  FireRedTTS3TTS/         FireRedTTS3-Instruct (MLX, Float32)
  MossVoiceGeneratorTTS/  MOSS-VoiceGenerator (MLX, BF16 + FP32)
  CosyVoiceTTS/           CosyVoice3 Text-zu-Sprache
  KokoroTTS/              Kokoro-82M Text-zu-Sprache (CoreML)
  Qwen3Chat/              Qwen3.5-0.8B LLM-Chat auf dem Gerät (MLX + CoreML)
  PersonaPlex/            PersonaPlex Sprache-zu-Sprache
  SpeechVAD/              VAD (Silero + Pyannote), Diarisierung, Sprechereinbettungen
  SpeechLanguageID/       Identifikation der gesprochenen Sprache (SpeechBrain ECAPA, MLX + CoreML, 107 Labels)
  SpeechEnhancement/      DeepFilterNet3 Rauschunterdrückung (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-Befehlsimplementierungen
  AudioCLI/               CLI-Einstiegspunkt

scripts/              Modellkonvertierung (PyTorch → MLX/CoreML), Benchmarking
Tests/                Unit- und Integrationstests
Examples/             Demo-Apps (PersonaPlexDemo, SpeechDemo)

GLiNER2.5-Decide: native MLX-Klassifikation und Entitäten-Spans (Gewichte in INT8, FP16 oder FP32); zur Inferenz wird kein Python benötigt.

⚠ 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

Streaming-Sprachsynthese und Stimmklonen mit CoreML, 48 kHz Stereo und 80-ms-Blöcken.

MossTTSNanoModel serialisiert Anfragen und erzeugt pro Äußerung einen neuen CoreML-Zustand. synthesize und synthesizeStream erhalten Stereo; SpeechGenerationModel liefert eine Mono-Mischung. language: nil übergeben. Streams enden mit einer leeren Abschlussmarkierung.

macOS 15+ / iOS 18+; vier kompilierte Modelle mit insgesamt 367,6 MB. Prompt, Referenz und angeforderte Frames teilen sich 1.024 Kontextzeilen. Überlauf und maxFrames vor dem natürlichen Sprachende lösen Fehler aus. Standard ist CPU; gpu erlaubt CPU+GPU. PCG64-Seeds sind NumPy-kompatibel; numerische Backend-Unterschiede können die Ausgabe dennoch ändern.

MOSS-TTS-Nano

Optionale Modellverwaltung

SpeechRuntime bietet gemeinsames Laden, abbrechbare FIFO-Zulassung und serielle Ausführung. Qwen3ASRRuntime wählt MLX oder vollständiges CoreML über explizite Deskriptoren; native APIs und CLI-Optionen bleiben verfügbar.

Der Server hält eine Ausführungsfreigabe während der gesamten Anfrage einschließlich Streaming-Ausgabe und lässt bis zu 32 Anfragen warten. ASR-Fehler ergeben HTTP-Fehler oder WebSocket-Fehlerereignisse; gültige leere Transkripte bleiben erfolgreich. Die Wiedergabe behält überzählige Samples. Modelle im Cache und wartende Audiodaten belegen weiterhin Speicher.

Voxtral TTS

Voxtral 4B TTS 2603 läuft über das Modul VoxtralTTS lokal auf Apple Silicon: 20 voreingestellte Stimmen, neun Sprachen und Mono-Sprache mit 24 kHz.

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

Nur vorgegebene Stimmen; das Klonen anhand von Referenzaudio ist nicht verfügbar. SDK, CLI, WebSocket und HTTP PCM geben Audio während der Erzeugung aus. Der Eingabetext muss zu Beginn vollständig vorliegen. Die Modellgewichte stehen unter CC BY-NC 4.0.

Voxtral-TTS-Anleitung lesen

Fish Audio Drama 3

Experimentelle native MLX-Unterstützung für Drama 3 steht über FishAudioDrama3Model bereit. Ein MoE-Modell mit 35 Milliarden Parametern, hybrider Aufmerksamkeit, zeitlichem Audiodecoder und Fish DAC erzeugt Mono-Audio mit 44,1 kHz. Der 4-Bit-Checkpoint bestand auf Apple M5 Pro die Audio- und unabhängigen ASR-Tests für Spracherzeugung aus Text, Stimmklonen mit Referenz und CLI-Ausgabe. 8-Bit und BF16 sind noch ungeprüft.

Der Standardmodus balanced gibt an Phasengrenzen ungenutzte MLX-Puffer oberhalb von 512 MiB frei. Zusätzlich gilt die gemeinsame Cache-Grenze während der Modelllebensdauer; niedrigere Aufruferbudgets bleiben erhalten. Beide Maßnahmen begrenzen nicht den gesamten Prozessspeicher. --fish-drama3-memory-mode unrestricted oder memoryOptions: .unrestricted lädt Gewichte vorab und überspringt die Phasenbereinigung, behält aber die Lebensdauergrenze bei.

Bei reiner Textsynthese werden 794.4 MiB Referenzencoder-Gewichte erst später geladen. Die erste Referenzkodierung lädt und behält sie; halten Sie codec.safetensors bis dahin verfügbar. Vorab berechnete Referenzcodes benötigen den Encoder nicht.

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

Mit Fish Audio erstellt. Die Pakete enthalten die Community License und NOTICE.

4-Bit-Messung

PCM-Streaming ist über generateStreaming, generateStream und --stream verfügbar. Ein Chunk enthält standardmäßig 3 Codec-Frames, etwa 139 ms Audio. Automatische Aufteilung langer Texte und schrittweise Texteingabe werden noch nicht unterstützt.

Jedes Codebuch des Audioturms verwendet 4.096 Tokenwerte. Sowohl die gepufferte als auch die gestreamte Fish-DAC-Dekodierung begrenzt Residualcodes auf die Residualcodebücher des Codecs mit 1.024 Einträgen. Zurückgegebene Codebücher behalten die ursprünglichen Werte des Audioturms.

Ungültige Rotary-Dimensionen werden vor dem Laden der Modellgewichte abgewiesen.