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.

ModulAufgabeBackendAusgabeCLI
MAGNeTText → MusikMLX (INT4 / INT8)30 s @ 32 kHz monospeech compose
Open-UnmixStem-TrennungMLX4 Stems @ 44,1 kHz stereospeech separate
DeepFilterNet3RauschunterdrückungCoreML (Neural Engine)48 kHz, Echtzeitspeech 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:

KomponenteRolleQuelle
MAGNeT-Decoder-LMMaskierter 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-EncoderEncoder mit 110M Parametern für Text-Konditionierung. FP32 (nur Encoder-Pfad; kein Decoder, kein LM-Head).t5-base
EnCodec-32-kHz-DecoderSEANet-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

VarianteParameterLM auf DiskPeak RSSWall (M-Serie, 30 s)RTF
small-int4300M287 MB~1.4 GB~10.8 s0.36×
small-int8300M425 MB~1.5 GB~11 s0.37×
medium-int41.5B1.36 GB~2.2 GB~36 s1.20×
medium-int81.5B2.10 GB~3.0 GB~36 s1.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.

Prompt-Engineering-Tipp

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 generierenMAGNeT (speech compose)
Gesang oder Drums aus einem vorhandenen Track extrahierenOpen-Unmix (speech separate)
Verrauschte Sprache vor der Transkription bereinigenDeepFilterNet3 (speech denoise)
Text in Sprache umwandeln (Sprachsynthese)VoxCPM2 or Qwen3-TTS