Compose — Âm nhạc và sản xuất âm thanh
Ba module chạy ngay trên thiết bị bao quát phần âm nhạc và sản xuất âm thanh của speech-swift, tất cả đều chạy native trên Apple Silicon qua MLX hoặc CoreML. MAGNeT sinh các đoạn nhạc 30 giây từ một câu lệnh văn bản. Tách nguồn âm (Open-Unmix) chia một bản stereo thành bốn stem (vocals / drums / bass / other). Cải thiện giọng nói (DeepFilterNet3) khử nhiễu nền khỏi tiếng nói theo thời gian thực.
| Module | Tác vụ | Backend | Đầu ra | CLI |
|---|---|---|---|---|
| MAGNeT | Văn bản → nhạc | MLX (INT4 / INT8) | 30 s @ 32 kHz mono | speech compose |
| Open-Unmix | Tách stem | MLX | 4 stem @ 44.1 kHz stereo | speech separate |
| DeepFilterNet3 | Khử nhiễu | CoreML (Neural Engine) | 48 kHz, thời gian thực | speech denoise |
MAGNeT — sinh nhạc từ văn bản
Bản port MLX Swift của MAGNeT từ Meta (Masked Audio Generation with a Single Non-Autoregressive Transformer). Sinh đoạn nhạc mono 30 giây ở 32 kHz từ câu lệnh tiếng Anh tự do — "happy rock", "energetic EDM with synth lead", hoặc câu lệnh mô tả chi tiết để có kết quả gọn gàng hơn.
Kiến trúc
Ba thành phần được tải, tải xuống ở lần gọi đầu tiên:
| Thành phần | Vai trò | Nguồn |
|---|---|---|
| LM giải mã MAGNeT | Transformer phi tự hồi quy có mask trên 4 codebook EnCodec. 24 lớp (Small, 300M) hoặc 48 (Medium, 1.5B). Phép chiếu Q/K/V/out + linear FFN đều được lượng tử hóa (MLX-affine, nhóm 64). | aufklarer/MAGNeT-{Small,Medium}-30secs-MLX-{4,8}bit |
| Encoder văn bản T5-base | Encoder 110M tham số dùng để điều kiện hóa văn bản. FP32 (chỉ đường encoder; không có decoder, không có LM head). | t5-base |
| Decoder EnCodec 32 kHz | Decoder SEANet (Conv1d / ConvTranspose1d / ResnetBlock / LSTM 2 lớp) + Euclidean RVQ 4 codebook. Ánh xạ các token rời rạc của LM trở lại dạng sóng 32 kHz. | mlx-community/encodec-32khz-float32 |
Giải mã song song có mask
Khác với người anh em tự hồi quy MusicGen, MAGNeT chạy tổng cộng 50 lượt forward (mặc định chia [20, 10, 10, 10] qua 4 codebook) với việc remask theo lịch cosine, làm nguội classifier-free guidance, và cửa sổ attention cục bộ theo từng giai đoạn. Giai đoạn 0 dùng self-attention đầy đủ; các giai đoạn 1–3 dùng cửa sổ cục bộ |q − k| ≤ 5 vì các codebook cao hơn chỉ tinh chỉnh chi tiết.
Các biến thể
| Biến thể | Tham số | LM trên đĩa | RSS đỉnh | Wall (chip M-series, 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 dưới 1.0 = nhanh hơn thời gian thực. Việc lượng tử hóa hầu như không thay đổi thời gian wall — attention là phần áp đảo, chứ không phải các phép chiếu tuyến tính — nên lợi ích thực tế của INT4 là bộ nhớ chứ không phải độ trễ.
Bắt đầu nhanh
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
Cờ: --variant {small,medium}-{int4,int8}, --temperature (làm nguội, mặc định 3.0), --top-p (mặc định 0.9), --cfg-max / --cfg-min (mặc định 10.0 / 1.0), --steps "20,10,10,10" (số vòng lặp theo từng codebook), --seed.
Những thẻ ngắn như "happy rock" vẫn dùng được nhưng cho cảm giác mỏng. Câu lệnh mô tả nhắc đến nhạc cụ + tempo + tâm trạng giúp tăng đáng kể tính mạch lạc — trong đợt khảo sát chất lượng của chúng tôi, câu lệnh giàu chi tiết hơn cho zero-crossing rate cao hơn (0.116 so với 0.093, tức nhiều chi tiết tần số cao hơn) và không bị clipping. So sánh:
"happy rock"— mỏng"energetic upbeat rock anthem with electric guitar riffs, driving drums, bass groove"— chi tiết hơn, thường tốt hơn
Bundle và giấy phép
Cả bốn bundle MLX đều dẫn xuất từ facebook/magnet-small-30secs và facebook/magnet-medium-30secs và kế thừa giấy phép của Meta: CC-BY-NC 4.0 — chỉ cho mục đích phi thương mại. Âm thanh sinh ra cũng có cùng hạn chế.
Tách nguồn âm — Open-Unmix (4 stem)
Open-Unmix HQ / UMX-L được port sang MLX. Tách một bản mix stereo thành bốn stem — vocals, drums, bass, các nhạc cụ khác — qua các predictor BiLSTM theo từng stem và post-filter Wiener-EM đa kênh, tất cả chạy end-to-end trên MLX qua STFT nghịch đảo. RTF thực tế ~0.031 (nhanh hơn 32× thời gian thực) trên chip M-series cho 30 s âm thanh.
# 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]
Toàn bộ kiến trúc, cách tinh chỉnh và ghi chú benchmark có trong hướng dẫn Tách nguồn âm.
Cải thiện giọng nói — DeepFilterNet3
DeepFilterNet3 chạy trên Neural Engine (CoreML). Khử nhiễu nền khỏi giọng nói 48 kHz theo thời gian thực với mô hình 2.1M tham số — đủ nhỏ để chạy song song với một pipeline ASR như bước tiền xử lý.
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)
Cấu hình đầy đủ có trong hướng dẫn Cải thiện giọng nói.
Chọn công cụ phù hợp
| Bạn muốn… | Dùng |
|---|---|
| Sinh nhạc từ câu lệnh văn bản | MAGNeT (speech compose) |
| Trích vocal hoặc drum khỏi một bản nhạc có sẵn | Open-Unmix (speech separate) |
| Làm sạch tiếng nói có nhiễu trước khi phiên âm | DeepFilterNet3 (speech denoise) |
| Chuyển văn bản thành giọng nói (tổng hợp giọng) | VoxCPM2 hoặc Qwen3-TTS |