Compose — ดนตรีและการผลิตเสียง
สามโมดูลที่ทำงานบนอุปกรณ์ครอบคลุมส่วนดนตรีและการผลิตเสียงของ speech-swift ทั้งหมดทำงานแบบ native บน Apple Silicon ผ่าน MLX หรือ CoreML MAGNeT สร้างคลิปดนตรียาว 30 วินาทีจาก prompt ข้อความ การแยกแหล่งเสียง (Open-Unmix) แบ่งแทร็ก stereo เป็นสี่ stem (vocals / drums / bass / other) การปรับปรุงคุณภาพเสียงพูด (DeepFilterNet3) ลดเสียงรบกวนพื้นหลังออกจากเสียงพูดแบบเรียลไทม์
| โมดูล | งาน | Backend | เอาต์พุต | CLI |
|---|---|---|---|---|
| MAGNeT | ข้อความ → ดนตรี | MLX (INT4 / INT8) | 30 วินาที @ 32 kHz mono | speech compose |
| Open-Unmix | การแยก stem | MLX | 4 stem @ 44.1 kHz stereo | speech separate |
| DeepFilterNet3 | การลดเสียงรบกวน | CoreML (Neural Engine) | 48 kHz, เรียลไทม์ | speech denoise |
MAGNeT — สร้างดนตรีจากข้อความ
เวอร์ชัน MLX Swift port ของ MAGNeT จาก Meta (Masked Audio Generation with a Single Non-Autoregressive Transformer) สร้างคลิปดนตรี mono ยาว 30 วินาทีที่ 32 kHz จาก prompt ภาษาอังกฤษแบบอิสระ — "happy rock", "energetic EDM with synth lead" หรือ prompt บรรยายรายละเอียดเพื่อผลลัพธ์ที่สะอาดยิ่งขึ้น
สถาปัตยกรรม
สามองค์ประกอบจะถูกโหลด ดาวน์โหลดในการเรียกครั้งแรก:
| องค์ประกอบ | บทบาท | แหล่งที่มา |
|---|---|---|
| LM ตัวถอดรหัส MAGNeT | Transformer แบบ non-autoregressive ที่มี mask บน 4 codebook ของ EnCodec 24 ชั้น (Small, 300M) หรือ 48 ชั้น (Medium, 1.5B) การ projection Q/K/V/out + linear FFN ทั้งหมดถูกลดความละเอียด (MLX-affine, กลุ่มละ 64) | aufklarer/MAGNeT-{Small,Medium}-30secs-MLX-{4,8}bit |
| Encoder ข้อความ T5-base | Encoder 110M พารามิเตอร์ ใช้สำหรับการ condition ข้อความ FP32 (เฉพาะเส้นทาง encoder; ไม่มี decoder, ไม่มี LM head) | t5-base |
| Decoder EnCodec 32 kHz | Decoder SEANet (Conv1d / ConvTranspose1d / ResnetBlock / LSTM 2 ชั้น) + Euclidean RVQ 4 codebook แมป token แบบไม่ต่อเนื่องของ LM กลับเป็นรูปคลื่นที่ 32 kHz | mlx-community/encodec-32khz-float32 |
การถอดรหัสแบบขนานที่มี mask
ต่างจากญาติ autoregressive อย่าง MusicGen MAGNeT จะรัน รวม 50 รอบ forward (ค่าเริ่มต้นแบ่งเป็น [20, 10, 10, 10] ใน 4 codebook) โดยใช้การ remask ตามตาราง cosine การลดอุณหภูมิของ classifier-free guidance และ window attention แบบ local ในแต่ละช่วง ช่วงที่ 0 ใช้ self-attention แบบเต็ม; ช่วงที่ 1–3 ใช้ local window |q − k| ≤ 5 เพราะ codebook ลำดับสูงกว่าจะปรับแต่งรายละเอียดเท่านั้น
รูปแบบ
| รูปแบบ | พารามิเตอร์ | LM บนดิสก์ | RSS สูงสุด | Wall (ชิป M-series, 30 วินาที) | 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 ต่ำกว่า 1.0 = เร็วกว่าเรียลไทม์ การลดความละเอียดแทบไม่เปลี่ยนเวลา wall — attention เป็นส่วนที่ครอบงำ ไม่ใช่ projection แบบ linear — ดังนั้นประโยชน์ที่แท้จริงของ INT4 คือหน่วยความจำ ไม่ใช่ความหน่วง
เริ่มต้นอย่างรวดเร็ว
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
แฟล็ก: --variant {small,medium}-{int4,int8}, --temperature (การลดอุณหภูมิ, ค่าเริ่มต้น 3.0), --top-p (ค่าเริ่มต้น 0.9), --cfg-max / --cfg-min (ค่าเริ่มต้น 10.0 / 1.0), --steps "20,10,10,10" (จำนวนรอบลูปต่อ codebook), --seed
แท็กสั้น ๆ อย่าง "happy rock" ยังใช้ได้แต่ให้ความรู้สึกบางเบา prompt แบบบรรยายที่ระบุ เครื่องดนตรี + tempo + อารมณ์ ช่วยเพิ่มความสอดคล้องอย่างมาก — ในการสำรวจคุณภาพของเรา prompt ที่มีรายละเอียดมากกว่าให้ค่า zero-crossing rate สูงกว่า (0.116 เทียบกับ 0.093 หมายถึงรายละเอียดความถี่สูงมากกว่า) และไม่มี clipping เปรียบเทียบ:
"happy rock"— บางเบา"energetic upbeat rock anthem with electric guitar riffs, driving drums, bass groove"— มีรายละเอียดมากกว่า มักจะดีกว่า
Bundle และไลเซนส์
bundle MLX ทั้งสี่อนุพันธ์มาจาก facebook/magnet-small-30secs และ facebook/magnet-medium-30secs และสืบทอดไลเซนส์ของ Meta: CC-BY-NC 4.0 — ใช้เพื่อวัตถุประสงค์ที่ไม่ใช่เชิงพาณิชย์เท่านั้น เสียงที่สร้างขึ้นก็อยู่ภายใต้ข้อจำกัดเดียวกัน
การแยกแหล่งเสียง — Open-Unmix (4 stem)
Open-Unmix HQ / UMX-L ถูก port มาที่ MLX แยก mix แบบ stereo เป็นสี่ stem — vocals, drums, bass, เครื่องดนตรีอื่น ๆ — ผ่าน predictor BiLSTM ต่อ stem และ post-filter Wiener-EM แบบหลายช่อง ทั้งหมดทำงาน end-to-end บน MLX ผ่าน inverse STFT RTF จริงประมาณ ~0.031 (เร็วกว่าเรียลไทม์ 32×) บนชิป M-series สำหรับเสียงยาว 30 วินาที
# 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]
สถาปัตยกรรมเต็ม วิธีการ fine-tune และโน้ตของ benchmark อยู่ใน คู่มือการแยกแหล่งเสียง
การปรับปรุงคุณภาพเสียงพูด — DeepFilterNet3
DeepFilterNet3 ทำงานบน Neural Engine (CoreML) ลดเสียงรบกวนพื้นหลังออกจากเสียงพูด 48 kHz แบบเรียลไทม์ด้วยโมเดล 2.1M พารามิเตอร์ — เล็กพอที่จะทำงานควบคู่กับ pipeline ASR ในฐานะขั้นตอน preprocessing
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)
การตั้งค่าครบถ้วนอยู่ใน คู่มือการปรับปรุงคุณภาพเสียงพูด
เลือกเครื่องมือที่เหมาะสม
| คุณต้องการ… | ใช้ |
|---|---|
| สร้างดนตรีจาก prompt ข้อความ | MAGNeT (speech compose) |
| แยก vocal หรือ drum ออกจากแทร็กที่มีอยู่ | Open-Unmix (speech separate) |
| ทำความสะอาดเสียงพูดที่มีเสียงรบกวนก่อนถอดเสียง | DeepFilterNet3 (speech denoise) |
| แปลงข้อความเป็นเสียง (การสังเคราะห์เสียง) | VoxCPM2 หรือ Qwen3-TTS |