Compose — Musik & Audioproduktion
Drei On-Device-Module decken den Musik- und Audioproduktionsbereich von speech-swift ab, alle laufen nativ auf Apple Silicon über MLX oder CoreML. MAGNeT generiert 30-Sekunden-Musikclips aus einem Text-Prompt. Quelltrennung (Open-Unmix) teilt eine Stereospur in vier Stems auf (Gesang / Drums / Bass / Sonstiges). Sprachverbesserung (DeepFilterNet3) entfernt in Echtzeit Hintergrundgeräusche aus der Sprache.
| Modul | Aufgabe | Backend | Ausgabe | CLI |
|---|---|---|---|---|
| MAGNeT | Text → Musik | MLX (INT4 / INT8) | 30 s @ 32 kHz mono | speech compose |
| Open-Unmix | Stem-Trennung | MLX | 4 Stems @ 44,1 kHz stereo | speech separate |
| DeepFilterNet3 | Rauschunterdrückung | CoreML (Neural Engine) | 48 kHz, Echtzeit | speech denoise |
MAGNeT — Text-zu-Musik-Generierung
MLX-Swift-Port von Metas MAGNeT (Masked Audio Generation with a Single Non-Autoregressive Transformer). Generiert 30-s-Clips von 32-kHz-Mono-Musik aus einem freiformatigen englischen Prompt — "happy rock", "energetic EDM with synth lead" oder reicher beschreibender Text für sauberere Ergebnisse.
Architektur
Drei geladene Komponenten, beim ersten Aufruf heruntergeladen:
| Komponente | Rolle | Quelle |
|---|---|---|
| MAGNeT-Decoder-LM | Maskierter nicht-autoregressiver Transformer über 4 EnCodec-Codebooks. 24 Schichten (Small, 300M) oder 48 (Medium, 1.5B). Quantisierte Q/K/V/out-Projektionen + FFN-Linears (MLX-affine, Gruppe 64). | aufklarer/MAGNeT-{Small,Medium}-30secs-MLX-{4,8}bit |
| T5-base Text-Encoder | Encoder mit 110M Parametern für Text-Konditionierung. FP32 (nur Encoder-Pfad; kein Decoder, kein LM-Head). | t5-base |
| EnCodec-32-kHz-Decoder | SEANet-Decoder (Conv1d / ConvTranspose1d / ResnetBlock / 2-Layer-LSTM) + 4-Codebook Euklidisches RVQ. Bildet die diskreten Tokens des LM zurück auf eine 32-kHz-Wellenform ab. | mlx-community/encodec-32khz-float32 |
Maskierte parallele Dekodierung
Im Gegensatz zum autoregressiven Geschwister MusicGen führt MAGNeT insgesamt 50 Vorwärts-Durchläufe aus (Standardaufteilung [20, 10, 10, 10] über die 4 Codebooks) mit Cosinus-geplanter Remaskierung, Classifier-Free-Guidance-Annealing und stufenweisen lokalen Attention-Fenstern. Stufe 0 hat volle Self-Attention; Stufen 1–3 verwenden ein lokales |q − k| ≤ 5-Fenster, weil höhere Codebooks nur Details verfeinern.
Varianten
| Variante | Parameter | LM auf Disk | Peak RSS | Wall (M-Serie, 30 s) | RTF |
|---|---|---|---|---|---|
small-int4 | 300M | 287 MB | ~1.4 GB | ~10.8 s | 0.36× |
small-int8 | 300M | 425 MB | ~1.5 GB | ~11 s | 0.37× |
medium-int4 | 1.5B | 1.36 GB | ~2.2 GB | ~36 s | 1.20× |
medium-int8 | 1.5B | 2.10 GB | ~3.0 GB | ~36 s | 1.20× |
RTF unter 1,0 = schneller als Echtzeit. Quantisierung verändert die Wall-Clock kaum — Attention dominiert, nicht die linearen Projektionen — daher liegt der praktische Gewinn von INT4 im Speicher und nicht in der Latenz.
Schnellstart
import MAGNeTMusicGen
let model = try await MAGNeTMusicGen.fromPretrained(variant: .smallInt4)
let pcm = model.generate(text: "energetic upbeat rock anthem with electric guitar riffs, driving drums, bass groove")
// pcm: [Float] length 960_000 (30 s × 32 kHz mono)
try WAVWriter.write(samples: pcm, sampleRate: 32_000,
to: URL(fileURLWithPath: "out.wav"))
CLI
# Default: small-int4 (~10 s on M-series for 30 s of audio)
speech compose "happy rock" -o happy_rock.wav
# Larger model — better prompt following, ~3.5× slower
speech compose "lo-fi hip hop with mellow piano and warm vinyl crackle" \
--variant medium-int4 -o lofi.wav
# Reproducible
speech compose "energetic EDM with synth lead" --seed 42 -o edm.wav
Flags: --variant {small,medium}-{int4,int8}, --temperature (annealed, Standard 3,0), --top-p (Standard 0,9), --cfg-max / --cfg-min (Standard 10,0 / 1,0), --steps "20,10,10,10" (Iterationen pro Codebook), --seed.
Kurze Tags wie "happy rock" funktionieren, wirken aber dünn. Beschreibende Prompts, die Instrumente + Tempo + Stimmung erwähnen, verbessern die Kohärenz spürbar — in unserem Qualitätstest lieferte der reichhaltigere Prompt eine höhere Nulldurchgangsrate (0,116 vs 0,093, d. h. mehr Hochfrequenzdetail) und null Clipping. Vergleiche:
"happy rock"— dünn"energetic upbeat rock anthem with electric guitar riffs, driving drums, bass groove"— reicher, meist besser
Bundles & Lizenz
Alle vier MLX-Bundles sind von facebook/magnet-small-30secs und facebook/magnet-medium-30secs abgeleitet und erben Metas Lizenz: CC-BY-NC 4.0 — nur nicht-kommerzielle Nutzung. Generiertes Audio unterliegt derselben Einschränkung.
Quelltrennung — Open-Unmix (4 Stems)
Open-Unmix HQ / UMX-L nach MLX portiert. Teilt einen Stereo-Mix in vier Stems auf — Gesang, Drums, Bass, weitere Instrumente — über Stem-spezifische BiLSTM-Prädiktoren und einen mehrkanaligen Wiener-EM-Nachfilter, alles End-to-End auf MLX durch die inverse STFT. Reale RTF ~0,031 (32× schneller als Echtzeit) auf M-Serie für 30 s Audio.
# Split mix.wav into vocals/drums/bass/other.wav next to it
speech separate mix.wav
# Or keep stems together
speech separate mix.wav --output stems/
import SourceSeparation
let separator = try await SourceSeparator.fromPretrained()
let stems = try separator.separate(audio: stereoSamples, sampleRate: 44_100)
// stems.vocals, stems.drums, stems.bass, stems.other — each [Float]
Vollständige Architektur, Tuning- und Benchmark-Notizen im Quelltrennungs-Leitfaden.
Sprachverbesserung — DeepFilterNet3
DeepFilterNet3 auf der Neural Engine (CoreML). Entfernt Hintergrundgeräusche aus 48-kHz-Sprache in Echtzeit mit einem 2,1M-Parameter-Modell — klein genug, um als Vorverarbeitungsschritt neben einer ASR-Pipeline zu laufen.
speech denoise noisy.wav -o clean.wav
import SpeechEnhancement
let enhancer = try await SpeechEnhancer.fromPretrained()
let clean = try enhancer.enhance(audio: noisy, sampleRate: 48_000)
Vollständige Konfiguration im Sprachverbesserungs-Leitfaden.
Das richtige Werkzeug wählen
| Du möchtest… | Nutze |
|---|---|
| Musik aus einem Text-Prompt generieren | MAGNeT (speech compose) |
| Gesang oder Drums aus einem vorhandenen Track extrahieren | Open-Unmix (speech separate) |
| Verrauschte Sprache vor der Transkription bereinigen | DeepFilterNet3 (speech denoise) |
| Text in Sprache umwandeln (Sprachsynthese) | VoxCPM2 or Qwen3-TTS |