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.

ModuleTác vụBackendĐầu raCLI
MAGNeTVăn bản → nhạcMLX (INT4 / INT8)30 s @ 32 kHz monospeech compose
Open-UnmixTách stemMLX4 stem @ 44.1 kHz stereospeech separate
DeepFilterNet3Khử nhiễuCoreML (Neural Engine)48 kHz, thời gian thựcspeech 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ầnVai tròNguồn
LM giải mã MAGNeTTransformer 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-baseEncoder 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 kHzDecoder 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 đĩaRSS đỉnhWall (chip M-series, 30 s)RTF
small-int4300M287 MB~1.4 GB~10.8 s0.36×
small-int8300M425 MB~1.5 GB~11 s0.37×
medium-int41.5B1.36 GB~2.2 GB~36 s1.20×
medium-int81.5B2.10 GB~3.0 GB~36 s1.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.

Mẹo viết prompt

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-30secsfacebook/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ảnMAGNeT (speech compose)
Trích vocal hoặc drum khỏi một bản nhạc có sẵnOpen-Unmix (speech separate)
Làm sạch tiếng nói có nhiễu trước khi phiên âmDeepFilterNet3 (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