Maskinoversettelse · Engelsk original
Komponer — Musikk & Lydproduksjon
Tre on-device-moduler dekker musikk- og lydproduksjonssiden til speech-swift, alle kjører innfødt på Apple Silicon via MLX eller CoreML. MAGNET genererer 30 sekunders musikkklipp fra en tekstprompt. Kjeldseparasjon (Open-Unmix) deler et stereospor i fire stengler (vokal / trommer / bass / andre). Beregningsforsterkning (DeepFilterNet3) fjerner bakgrunnsstøy fra tale i sanntid.
| Modul | Oppgave | Motor | Utgang | CLI |
|---|---|---|---|---|
| MAGNET | Tekst → musikk | MLX (INT4 / INT8) | 30 s @ 32 kHz mono | speech compose |
| Open-Ummix | Stemseparering | MLX | 4 stengler @ 44.1 kHz stereo | speech separate |
| DeepFilterNet3 | Støysuppression | CoreML (Neural Engine) | 48 kHz, sanntid | speech denoise |
MAGNET — tekst til musikkgenerasjon
MLX Swift port av Metas MAGNET (Masked lydgenerasjon med en enkelt ikke-automatisk transformer). Oppretter 30 s klipp på 32 kHz mono musikk fra en gratis form engelsk spør - - - lykkelig rock --energisk EDM med synth bly - eller rik beskrivende tekst for renere resultater.
Arkitektur
Tre lastede komponenter, lastet ned ved første anrop:
| Komponent | Rolle | Kilde |
|---|---|---|
| MAGNET dekoder LM | Maskert ikke-autoregressiv transformator over 4 EnCodec-kodebøker. 24 lag (Små, 300M) eller 48 (medium, 1,5B). Quantized Q/K/V/out-framspring + FFN-linjer (MLX-affin, gruppe 64). | aufklarer/MAGNeT-{Small,Medium}-30secs-MLX-{4,8}bit |
| T5-base tekstkoder | 110M-parameter-koder for tekstkondisjonering. FP32 (encoder-beskyttet bane; ingen dekoder, ingen LM-hode). | t5-base |
| EnCodec 32 kHz dekoder | SEANet dekoder (Conv1d / ConvTranspose1d / ResnetBlock / 2-lag LSTM) 4-Kodebok Euklidian RVQ. Kart LMs diskrete polletter tilbake til en 32 kHz bølgeform. | mlx-community/encodec-32khz-float32 |
Maskert parallell dekoding
I motsetning til autoregressive søsken MusicGen kjører MAGNET 50 fremover passerer totalt (standard delt [20, 10, 10, 10] på tvers av de 4 kodebøkene) med cosinusformet ommaskering, klassefri veiledningsforandring og per fase lokale oppmerksomhetsvinduer. Stage 0 har full selvtillit; trinn 1-3 bruker en lokal |q − k| ≤ 5 vindu fordi høyere kodebøker bare raffinerererer detaljer.
Varianter
| Variant | Params | LM på disken | Peak RSS | Vegg (M-serien, 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 = raskere enn sanntid. Quantisasjon beveger seg knapt vegg-klokke - oppmerksomhet dominerer, ikke de lineære fremspringene - så den praktiske seieren fra INT4 er minne i stedet for latens.
Rask start
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
Flagg: --variant {small,medium}-{int4,int8}, --temperature (annforseglet, standard 3.0), --top-p (standard 0,9), --cfg-max / --cfg-min (standard 10,0 / 1.0), --steps "20,10,10,10" (per-kodebok iterasjoner), --seed.
Korte tagger som "happy rock" fungerer, men føler seg tynn. Deskriptive spør som nevner instruments + tempo + humør merkbart forbedre sammenhengen - i vår kvalitet feie den rikere hurtigen ga høyere null-kryssingsrate (0,116 mot 0,093, dvs. mer høyfrekvent detalj) og null clipping.
"happy rock"— tynn"energetic upbeat rock anthem with electric guitar riffs, driving drums, bass groove"— rikere, vanligvis bedre
Bundles & lisens
Alle fire MLX bundter er avledet fra facebook/magnet-small-30secs og facebook /magnet-medium-30secs og arv Meta-lisens: CC-BY-NC 4.0 — ikke-kommersiell bruk bare.
Kildeseparasjon - Open-Unmix (4 stengler)
Open-Unmix HQ / UMX-L ported til MLX. Deler en stereomiks i fire stengler - vokal, dromer, bass, andre instrumenter — via per-stem BiLSTM prediktorer og et flerkanals Wiener-EM post-filter, alle kjører end-to-end på MLX gjennom den inverse STFT. Real-verden RTF ~0.031 (32× raskere enn sanntid) på M-serien for 30 s lyd.
# 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, tuning og benchmarknoter på Kjeldseparasjonsveiledningen.
Taleforbedring — DeepFilterNet3
DeepFilterNet3 på Neural Engine (CoreML). Fjerner bakgrunnsstøy fra 48 kHz tale i sanntid med en 2.1M-parameter modell - liten nok til å kjøre sammen med en ASR rørledning som et forhåndsbehandlingssteg.
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 konfigurasjon på Speech Enhancement Guide.
Velg riktig verktøy
| Du vil ha... | Bruk |
|---|---|
| Opprette musikk fra en tekstprompt | MAGNET (speech compose) |
| Trekk vokal eller trommer ut av et eksisterende spor | Åpne-Unmix (speech separate) |
| Rens støyende tale før transkripsjon | DeepFilterNet3 (speech denoise) |
| Konverter tekst til tale (stemmesyntese) | VoxCPM2 eller Qwen3-TTS |