Automatische vertaling · Engels origineel
Samenstellen van muziek & audioproductie
Drie on-device modules hebben betrekking op de muziek- en audioproductiezijde van speech-swift, die allemaal oorspronkelijk op Apple Silicon draait via MLX of CoreML. MAGNeT genereert 30-seconde muziekclips van een tekstprompt. Source Separation (Open-Unmix) splitst een stereotrack in vier stengels (zang / drums / bas / andere). Speech Enhancement (DeepFilterNet3) verwijdert in real time achtergrondgeluid uit spraak.
| Module | Taak | Backend | Uitvoer | CLI |
|---|---|---|---|---|
| MAGNeT | Tekst → muziek | MLX (INT4 / INT8) | 30 s @ 32 kHz mono | speech compose |
| Open-Unmix | Stamscheiding | MLX | 4 stengels @ 44,1 kHz stereo | speech separate |
| DeepFilterNet3 | Geluidsonderdrukking | CoreML (Neural Engine) | 48 kHz, realtime | speech denoise |
MAGNET .. tekst-naar-muziek generatie
MLX Swift-poort van Meta's MAGNeT (Masked Audio Generation with a Single Non-Autoregressive Transformer). Genereert 30 s clips van 32 kHz monomuziek uit een vrije Engelse prompt .. "happy rock," "energetic EDM with synth lead" of rijke beschrijvende tekst voor schonere resultaten.
Architectuur
Drie geladen componenten, gedownload op eerste oproep:
| Onderdeel | Rol | Bron |
|---|---|---|
| MAGNeT decoder LM | Gemaskerde niet-autoregressieve transformator over 4 EnCodec codebooks. 24 lagen (Klein, 300M) of 48 (Medium, 1.5B). Gekwantiseerde Q/K/V/out projecties + FFN-linears (MLX-affine, groep 64). | aufklarer/MAGNeT-{Small,Medium}-30secs-MLX-{4,8}bit |
| T5-base tekstcoder | 110M-parameter encoder voor tekstconditionering. FP32 (encoder-alleen pad; geen decoder, geen LM hoofd). | t5-base |
| Encodec 32 kHz decoder | SEANet decoder (Conv1d / ConvTranspose1d 'ResnetBlock' 2- laag LSTM) + 4-codeboek Euclidische RVQ. Maps de discrete tokens van de LM terug naar een 32 kHz golfvorm. | mlx-community/encodec-32khz-float32 |
Gemaskerde parallelle decodering
In tegenstelling tot autoregressieve broers en zussen MusicGen, MAGNeT draait 50 vooruit gaat totaal (standaard verdeling [20, 10, 10, 10] over de 4 codebooks) met cosinus-geplande hermasking, classifier-free guidance gloeien, en per-stage lokale aandacht vensters. Stage 0 heeft volledige zelf-aandacht; stadia 1Z3 gebruiken een lokale |q − k| ≤ 5 venster omdat hogere codeboeken alleen details verfijnen.
Varianten
| Variant | Params | LM on-disk | Piek RSS | Muur (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 lager dan 1,0 = sneller dan real time. Kwantisering beweegt nauwelijks de aandacht van de klok, niet de lineaire projecties, dus de praktische overwinning van INT4 is geheugen in plaats van latentie.
Snel starten
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
Vlaggen: --variant {small,medium}-{int4,int8}, --temperature (annealed, default 3,0), --top-p (standaard 0,9), --cfg-max / --cfg-min (standaard 10,0 / 1,0), --steps "20,10,10,10" (per-codeboekiteraties), --seed.
Korte tags als "happy rock" werken maar voelen zich dun. Descriptieve aanwijzingen die instrumenten noemen + tempo + stemming merkbaar de samenhang verbeteren .. in onze kwaliteit vegetatie gaf de rijkere prompt een hoger zero-crossing tarief (0,116 vs 0,093, d.w.z. meer high-frequency detail) en nul knippen. Vergelijk:
"happy rock""energetic upbeat rock anthem with electric guitar riffs, driving drums, bass groove"
Bundels & licentie
Alle vier MLX bundels zijn afgeleid van facebook/magnet-small-30secs en faceboek/magnet-medium-30secs en erf Meta's licentie: CC-BY-NC 4.0
Open-Unmix (4 stengels)
Open-Unmix HQ / UMX-L geporteerd naar MLX. Splitst een stereo mix in vier stengels zang, trommels, bas, overige instrumenten De zender heeft een BIL STM-voorspellers en een multikanaals Wiener-EM-postfilter, die allemaal end-to-end draaien op MLX via de omgekeerde STFT. Real-world RTF ~0.031 (32× sneller dan real time) op M-series voor 30 s van 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 = separator.separate(audio: stereoSamples, sampleRate: 44_100)
// stems[.vocals], stems[.drums], stems[.bass], stems[.other] — each [[Float]] (stereo)
Volledige architectuur, tuning en benchmarknoten op de Bronscheidingsgids.
Spraakverbetering . DeepFilterNet3
DeepFilterNet3 op de Neural Engine (CoreML). Verwijdert achtergrondgeluid van 48 kHz spraak in real time met een 2.1M-parameter model .. klein genoeg om naast een ASR pijpleiding te draaien als een voorbewerkingsstap.
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)
Volledige configuratie op de Speech Enhancement Guide.
Het juiste gereedschap kiezen
| Wil je... | Gebruik |
|---|---|
| Muziek van een tekstprompt genereren | MAGNeT (speech compose) |
| Trek zang of drums uit een bestaande track | Open-Unmix (speech separate) |
| Ruim luidruchtige speech op voor de transcriptie. | DeepFilterNet3 (speech denoise) |
| Tekst omzetten naar spraak (spraaksynthese) | VoxCPM2 of Qwen3-TTS |