Traduzione automatica · Originale inglese
Compose — Produzione musicale e audio
Tre moduli on-device coprono il lato musicale e audio-produzione di speech-swift, tutti in esecuzione nativo su Apple Silicon tramite MLX o CoreML. MAGNET genera clip musicali 30-secondo da un prompt di testo. Separazione della fonte (Open-Unmix) divide una traccia stereo in quattro gambi (voce / batteria / basso / altro). Miglioramento del discorso (DeepFilterNet3) rimuove il rumore di fondo dal discorso in tempo reale.
| Modulo | Compiti | Indietro | Produzione | CLI |
|---|---|---|---|---|
| MAGNET | Testo → musica | MLX (INT4 / INT8) | 30 s @ 32 kHz mono | speech compose |
| Open-Unmix | Separazione dello stelo | MLX | 4 steli @ 44.1 kHz stereo | speech separate |
| DeepFilterNet3 | Soppressione del rumore | CoreML (Neural Engine) | 48 kHz, in tempo reale | speech denoise |
MAGNeT — Generazione testi-musicale
MLX Swift port of Meta's MAGNeT (Masked Audio Generation with a Single Non-Autoregressive Transformer). Genera 30 clips di 32 kHz mono music da un prompt inglese free-form — "happy rock", "energetic EDM con synth lead Cleaner", o risultati descrittivi ricchi.
Architettura
Tre componenti caricati, scaricati sulla prima chiamata:
| Componenti | Role | Fonte |
|---|---|---|
| MAGNeT decoder LM | Trasformatore non autoregressivo mascherato su 4 codebook EnCodec. 24 strati (Small, 300M) o 48 (Medium, 1.5B). Proiezioni quantizzate Q/K/V/out + lineari FFN (MLX-affine, gruppo 64). | aufklarer/MAGNeT-{Small,Medium}-30secs-MLX-{4,8}bit |
| T5-base text encoder | Encoder di 110m-parametro per il condizionamento del testo. FP32 (percorso di sola ecoder; nessun decoder, nessuna testa LM). | t5-base |
| decoder EnCodec 32 kHz | Decoder SEANet (SeaNet decoder)Conv1d / ConvTranspose1d / ResnetBlock / 2-layer LSTM) + 4-codebook Euclidean RVQ. Mappa i token discreti di LM di nuovo ad un 32 forma d'onda kHz. | mlx-community/encodec-32khz-float32 |
Decodifica parallela mascherata
A differenza di sibling autoregressivo MusicGen, funziona MAGNeT 50 passi avanti totale (diffusione di default) [20, 10, 10, 10] attraverso il 4 codebooks) con ridimensionamento del coseno-scheduled, ricottura di guida senza classificatore, e finestre di attenzione locali per-stadio. 0 ha piena autoattenzione; stadi 1–3 utilizzare un locale |q − k| ≤ 5 finestra perché più alti codebooks solo perfezionare i dettagli.
Varianti
| Variante | Params | LM on-disk | picco RSS | Muro (Serie M, 30 s) | RTF |
|---|---|---|---|---|---|
small-int4 | 300M | 287 MB | ~1.4 GB | - 10.8 | 0.36× |
small-int8 | 300M | 425 MB | ~ 1,5 GB | 11. | 0.37× |
medium-int4 | 1.5B | 1.36 GB | ~2.2 GB | - 36. | 1.20× |
medium-int8 | 1.5B | 2,10 GB | ~3.0 GB | - 36. | 1.20× |
RTF sotto 1.0 = più veloce del tempo reale. La quantizzazione si muove a malapena a parete-clock — l'attenzione domina, non le proiezioni lineari — quindi la vittoria pratica da INT4 è la memoria piuttosto che la latenza.
Avvio rapido
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
Bandiere: --variant {small,medium}-{int4,int8}, --temperature (annealed, default 3.0), --top-p (default 0.9), --cfg-max / --cfg-min (default 10.0 / 1.0), --steps "20,10,10,10" (per-codebook iterations), --seed.
Brevi tag come "happy rock" ma senti sottile. Segnali descrittivi che menzionano instruments + tempo + umore notevolmente migliorano la coerenza - nella nostra qualità spazzare il prompt più ricco ha dato più alto tasso di zero-crossing (0.116 vs 0.093, cioè più alta frequenza dettaglio) e zero clipping.
"happy rock"— sottile"energetic upbeat rock anthem with electric guitar riffs, driving drums, bass groove"
Bundles & licenza
Tutti e quattro i fasci MLX sono derivati da facebook/magnet-small-30secs e facebook/magnet-medium-30secs e ereditare la licenza di Meta: CC-BY-NC 4.0 — uso non commerciale solo. L'audio generato porta la stessa restrizione.
Separazione della sorgente — Open-Unmix (4 steli)
HQ Open-Unmix / UMX-L portato a MLX. Spalato un mix stereo in quattro gambi — voce, tamburi, basso, altri strumenti — tramite i predittori BiLSTM e un multicanale Wiener-EM post-filtro, tutto in esecuzione end-to-end MLX attraverso l'inverso STFT. RTF ~0.031 (32× più veloce del tempo reale) su serie M per 30 s di 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)
Architettura completa, sintonizzazione e note di riferimento sulla guida Source Separation
Miglioramento del discorso — DeepFilterNet3
DeepFilterNet3 sul Neural Engine ( CoreML). Rimuove il rumore di fondo dal discorso di 48 kHz in tempo reale con un modello di 2,1 M-parametro — abbastanza piccolo da funzionare a fianco di un ASR pipeline come passo di pre-processing.
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)
Configurazione completa sulla guida Speech Enhancement
Scegliere lo strumento giusto
| Vuoi... | Uso |
|---|---|
| Generare musica da un prompt dei testi | MAGNeT ( speech compose |
| Tirare voci o tamburi su una traccia esistente | Open-Unmix ( speech separate) |
| Pulire il discorso rumoroso prima della trascrizione | DeepFilterNet3 (speech denoise) |
| Convertire testo in parola (sintesi vocale) | VoxCPM2 o Qwen3-TTS |