Maskinöversättning · Engelskt original
Komponera - Musik & Audio Production
Tre moduler på enhet täcker musik- och ljudproduktionssidan av speech-swift, alla körs infödd på Apple Silicon via MLX eller CoreML. MAGNET genererar 30-sekunders musikklipp från ett textmeddelande. Källa Separation (Open-Unmix) delar en stereobana i fyra stammar (vokaler / trummor / bas / annat). Tal Förbättring (DeepFilterNet3) tar bort bakgrundsljud från tal i realtid.
| Modul | Uppgifter | Backend | Output | CLI |
|---|---|---|---|---|
| MAGNeT | Text → musik | MLX (INT4 / INT8) | 30 s @ 32 kHz mono | speech compose |
| Open-Unmix | Stam separation | MLX | 4 stammar @ 44,1 kHz stereo | speech separate |
| DeepFilterNet3 | Buller förtryck | CoreML (Neural Engine) | 48 kHz, realtid | speech denoise |
MAGNeT - text-till-musikgenerering
MLX Swift port of Meta's MAGNeT (Masked Audio Generation with a Single Non-Autoregressive Transformer) Generates 30 s clips of 32 kHz mono music from a free-form English prompt — "happy rock", "energetic EDM with synth lead" eller rik beskrivande text för renare resultat.
Arkitektur
Tre laddade komponenter, nedladdade på första samtalet:
| Komponent | Rollen | Källa |
|---|---|---|
| MAGNeT Decoder LM | Maskerad icke-autoregressiv transformator över 4 EnCodec kodböcker. 24 lager (Small, 300M) eller 48 (Medium, 1,5B). Kvantiserad Q/K/V/out prognoser + FFN linjärer (MLX-affin, grupp 64). | aufklarer/MAGNeT-{Small,Medium}-30secs-MLX-{4,8}bit |
| T5-base textkodare | 110M-parameter kodare för textkonditionering. FP32 (endast encoder-väg; ingen avkodare, inget LM-huvud). | t5-base |
| EnCodec 32 kHz decoder | SEANet decoder (Conv1d / ConvTranspose1d / ResnetBlock / 2-lager LSTM) + 4-kodbok Euclidean RVQ. Kartor LM: s diskreta tokens tillbaka till en 32 kHz vågform. | mlx-community/encodec-32khz-float32 |
Maskerad parallell avkodning
Till skillnad från autoregressiva syskon MusicGen kör MAGNeT 50 framåt passerar totalt (default split [20, 10, 10, 10] över de 4 kodböckerna) med kosin-schemad returg, klassificeringsfri vägledning förankrad och per-stegs lokala uppmärksamhetsfönster. Steg 0 har full självupptagning; steg 1–3 använder en lokal |q − k| ≤ 5
Varianter
| Variant | Params | LM on-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 under 1.0 = snabbare än realtid. Quantisation rör knappt väggklocka - uppmärksamhet dominerar, inte linjära prognoser - så den praktiska vinsten från INT4 är minne snarare än latens.
Snabbstart
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
Flaggor: --variant {small,medium}-{int4,int8}, --temperature (annealed, default 3.0), --top-p (standard 0.9), --cfg-max / --cfg-min (standard 10.0 / 1.0), --steps "20,10,10,10" (per-codebook iterations), --seed.
Korta taggar som "happy rock" arbete men känner sig tunna. Descriptive prompts som nämner instrument + tempo + humo + mood märkbart förbättra samstämmighet - i vår kvalitet sveper den rikare prompten gav högre noll-crossing rate (0.116 vs 0.093, dvs mer högfrekvent detalj) och noll clipping.
"happy rock"- tunn"energetic upbeat rock anthem with electric guitar riffs, driving drums, bass groove"- rikare, vanligtvis bättre
Bundles & licens
Alla fyra MLX buntar härrör från facebook/magnet-small-30secs och facebok/magnet-medium-30secs och ärver Metas licens: C-BY-NC 4.0 -- icke-kommersiell användning endast .
Källa separation - Open-Unmix (4 stjälkar)
Open-Unmix HQ / UMX-L porterad till MLX. Splits en stereoblandning i fyra stammar - Vocals, Trummor, bas, andra instrument - via per-stem BiLSTM-prediktorer och en multikanal Wiener-EM-postfilter, alla kör slut-to-end på MLX genom den inversa STFT. Real-world RTF ~ 0.031 (32 snabbare än realtid) på M-serien för 30 ljud.
# 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 = separator.separate(audio: stereoSamples, sampleRate: 44_100)
// stems[.vocals], stems[.drums], stems[.bass], stems[.other] — each [[Float]] (stereo)
Full arkitektur, stämning och referenspunkter på Source Separation guide.
Talförbättring - DeepFilterNet3
DeepFilterNet3 på Neural Engine (CoreML) tar bort bakgrundsljud från 48 kHz-tal i realtid med en 2.1M-parametermodell – tillräckligt liten för att springa tillsammans med en ASR pipeline som ett förbehandlingssteg.
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)
Full konfiguration på Speech Enhancement guide.
Plocka rätt verktyg
| Du vill... | Användning |
|---|---|
| Generera musik från en textprompt | MAGNeT (speech compose) |
| Dra sång eller trummor ur ett befintligt spår | Open-Unmix (speech separate) |
| Rengör upp bullriga tal före transkription | DeepFilterNet3 (speech denoise) |
| Konvertera text till tal (röstsyntes) | VoxCPM2 eller Qwen3-TTS |