Compose — Müzik ve ses üretimi
Cihaz üzerinde çalışan üç modül, speech-swift'in müzik ve ses üretimi tarafını kapsar; hepsi MLX ya da CoreML aracılığıyla Apple Silicon üzerinde yerel olarak çalışır. MAGNeT, bir metin isteminden 30 saniyelik müzik klipleri üretir. Kaynak ayırma (Open-Unmix), stereo bir parçayı dört stem'e (vocals / drums / bass / other) böler. Konuşma iyileştirme (DeepFilterNet3) ise konuşmadan arka plan gürültüsünü gerçek zamanlı olarak temizler.
| Modül | Görev | Backend | Çıktı | CLI |
|---|---|---|---|---|
| MAGNeT | Metin → müzik | MLX (INT4 / INT8) | 30 s @ 32 kHz mono | speech compose |
| Open-Unmix | Stem ayırma | MLX | 4 stem @ 44.1 kHz stereo | speech separate |
| DeepFilterNet3 | Gürültü bastırma | CoreML (Neural Engine) | 48 kHz, gerçek zamanlı | speech denoise |
MAGNeT — metinden müzik üretimi
Meta'nın MAGNeT (Masked Audio Generation with a Single Non-Autoregressive Transformer) modelinin MLX Swift portu. Serbest formdaki İngilizce bir prompttan 32 kHz mono 30 saniyelik klipler üretir — "happy rock", "energetic EDM with synth lead" ya da daha temiz sonuçlar için zengin tanımlayıcı metinler kullanılabilir.
Mimari
İlk çağrıda indirilen ve yüklenen üç bileşen:
| Bileşen | Rol | Kaynak |
|---|---|---|
| MAGNeT decoder LM | 4 EnCodec codebook üzerinde maskeli, otoregresif olmayan transformer. 24 katman (Small, 300M) veya 48 katman (Medium, 1.5B). Q/K/V/out projeksiyonları ve FFN lineerleri niceleştirilmiş (MLX-affine, grup 64). | aufklarer/MAGNeT-{Small,Medium}-30secs-MLX-{4,8}bit |
| T5-base metin encoder | Metin koşullandırması için 110M parametreli encoder. FP32 (yalnız encoder yolu; decoder yok, LM head yok). | t5-base |
| EnCodec 32 kHz decoder | SEANet decoder (Conv1d / ConvTranspose1d / ResnetBlock / 2 katmanlı LSTM) + 4 codebook'lu Euclidean RVQ. LM'in ayrık tokenlerini 32 kHz dalga formuna geri eşler. | mlx-community/encodec-32khz-float32 |
Maskeli paralel kod çözme
Otoregresif kardeşi MusicGen'in aksine, MAGNeT toplam 50 ileri geçiş yürütür (4 codebook arasında varsayılan bölünme [20, 10, 10, 10]); kosinüs çizelgeli yeniden maskeleme, classifier-free guidance tavlanması ve aşama bazlı yerel attention pencereleri kullanır. 0. aşamada tam self-attention vardır; 1–3. aşamalar |q − k| ≤ 5 yerel penceresi kullanır; çünkü daha yüksek codebook'lar yalnızca ayrıntıları rafine eder.
Varyantlar
| Varyant | Parametre | Diskte LM | Tepe RSS | Wall (M-serisi, 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 1.0'ın altı = gerçek zamandan hızlı. Niceleştirme wall-clock'u neredeyse değiştirmez — baskın olan attention'dır, lineer projeksiyonlar değil — dolayısıyla INT4'ün pratik kazancı gecikme değil bellektir.
Hızlı başlangıç
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
Bayraklar: --variant {small,medium}-{int4,int8}, --temperature (tavlanmış, varsayılan 3.0), --top-p (varsayılan 0.9), --cfg-max / --cfg-min (varsayılan 10.0 / 1.0), --steps "20,10,10,10" (codebook başına yineleme sayısı), --seed.
"happy rock" gibi kısa etiketler işe yarar ama yüzeysel hissettirir. Enstrüman + tempo + ruh hâli içeren tanımlayıcı promptlar tutarlılığı belirgin biçimde artırır — kalite taramamızda zengin prompt, daha yüksek zero-crossing rate (0.116'ya karşı 0.093, yani daha fazla yüksek frekans ayrıntısı) ve sıfır clipping verdi. Karşılaştırın:
"happy rock"— yüzeysel"energetic upbeat rock anthem with electric guitar riffs, driving drums, bass groove"— zengin, genelde daha iyi
Paketler ve lisans
Dört MLX paketinin tümü facebook/magnet-small-30secs ve facebook/magnet-medium-30secs'den türetilmiştir ve Meta'nın lisansını miras alır: CC-BY-NC 4.0 — yalnızca ticari olmayan kullanım. Üretilen ses de aynı kısıtlamaya tabidir.
Kaynak ayırma — Open-Unmix (4 stem)
MLX'e port edilmiş Open-Unmix HQ / UMX-L. Bir stereo karışımı dört stem'e ayırır — vocals, drums, bass, diğer enstrümanlar — stem başına BiLSTM tahmin edicileri ve çok kanallı Wiener-EM son filtresiyle, hepsi MLX üzerinde ters STFT'ye kadar uçtan uca çalışır. M-serisi üzerinde 30 sn ses için gerçek dünya RTF'si ~0.031 (gerçek zamandan 32× hızlı).
# 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 = try separator.separate(audio: stereoSamples, sampleRate: 44_100)
// stems.vocals, stems.drums, stems.bass, stems.other — each [Float]
Mimari, ince ayar ve benchmark notlarının tamamı için Kaynak ayırma kılavuzuna bakın.
Konuşma iyileştirme — DeepFilterNet3
Neural Engine (CoreML) üzerinde çalışan DeepFilterNet3. 2,1M parametreli bir modelle 48 kHz konuşmadan arka plan gürültüsünü gerçek zamanlı temizler — bir ASR pipeline'ının yanında ön işleme adımı olarak çalıştırılabilecek kadar küçüktür.
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)
Tam yapılandırma için Konuşma iyileştirme kılavuzuna bakın.
Doğru aracı seçmek
| İsteğiniz… | Kullanın |
|---|---|
| Bir metin promptundan müzik üretmek | MAGNeT (speech compose) |
| Mevcut bir parçadan vocal veya drum çıkarmak | Open-Unmix (speech separate) |
| Transkripsiyondan önce gürültülü konuşmayı temizlemek | DeepFilterNet3 (speech denoise) |
| Metni konuşmaya dönüştürmek (ses sentezi) | VoxCPM2 veya Qwen3-TTS |