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 monospeech compose
Open-Unmixการแยก stemMLX4 stem @ 44.1 kHz stereospeech 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 ตัวถอดรหัส MAGNeTTransformer แบบ 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-baseEncoder 110M พารามิเตอร์ ใช้สำหรับการ condition ข้อความ FP32 (เฉพาะเส้นทาง encoder; ไม่มี decoder, ไม่มี LM head)t5-base
Decoder EnCodec 32 kHzDecoder SEANet (Conv1d / ConvTranspose1d / ResnetBlock / LSTM 2 ชั้น) + Euclidean RVQ 4 codebook แมป token แบบไม่ต่อเนื่องของ LM กลับเป็นรูปคลื่นที่ 32 kHzmlx-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-int4300M287 MB~1.4 GB~10.8 วินาที0.36×
small-int8300M425 MB~1.5 GB~11 วินาที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 ต่ำกว่า 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

เคล็ดลับการเขียน prompt

แท็กสั้น ๆ อย่าง "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