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.

ModuloCompitiIndietroProduzioneCLI
MAGNETTesto → musicaMLX (INT4 / INT8)30 s @ 32 kHz monospeech compose
Open-UnmixSeparazione dello steloMLX4 steli @ 44.1 kHz stereospeech separate
DeepFilterNet3Soppressione del rumoreCoreML (Neural Engine)48 kHz, in tempo realespeech 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:

ComponentiRoleFonte
MAGNeT decoder LMTrasformatore 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 encoderEncoder di 110m-parametro per il condizionamento del testo. FP32 (percorso di sola ecoder; nessun decoder, nessuna testa LM).t5-base
decoder EnCodec 32 kHzDecoder 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

VarianteParamsLM on-diskpicco RSSMuro (Serie M, 30 s)RTF
small-int4300M287 MB~1.4 GB- 10.80.36×
small-int8300M425 MB~ 1,5 GB11.0.37×
medium-int41.5B1.36 GB~2.2 GB- 36.1.20×
medium-int81.5B2,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.

Prompt-engineering tip

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 trascrizioneDeepFilterNet3 (speech denoise)
Convertire testo in parola (sintesi vocale)VoxCPM2 o Qwen3-TTS