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.

ModulUppgifterBackendOutputCLI
MAGNeTText → musikMLX (INT4 / INT8)30 s @ 32 kHz monospeech compose
Open-UnmixStam separationMLX4 stammar @ 44,1 kHz stereospeech separate
DeepFilterNet3Buller förtryckCoreML (Neural Engine)48 kHz, realtidspeech 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:

KomponentRollenKälla
MAGNeT Decoder LMMaskerad 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 textkodare110M-parameter kodare för textkonditionering. FP32 (endast encoder-väg; ingen avkodare, inget LM-huvud).t5-base
EnCodec 32 kHz decoderSEANet 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

VariantParamsLM on-diskPeak RSSWall (M-serie, 30 s)RTF
small-int4300M287 MB~1.4 GB~10.8 s0.36×
small-int8300M425 MB~1.5 GB11 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 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.

Prompt-engineering tip

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årOpen-Unmix (speech separate)
Rengör upp bullriga tal före transkriptionDeepFilterNet3 (speech denoise)
Konvertera text till tal (röstsyntes)VoxCPM2 eller Qwen3-TTS