Compose — Музыка и аудиопродакшен
Три модуля на устройстве охватывают сторону музыки и аудиопродакшена speech-swift, все они работают нативно на Apple Silicon через MLX или CoreML. MAGNeT генерирует 30-секундные музыкальные клипы по текстовой подсказке. Разделение источников (Open-Unmix) разделяет стерео-трек на четыре стема (вокал / ударные / бас / остальное). Улучшение речи (DeepFilterNet3) удаляет фоновый шум из речи в реальном времени.
| Модуль | Задача | Бэкенд | Выход | CLI |
|---|---|---|---|---|
| MAGNeT | Текст → музыка | MLX (INT4 / INT8) | 30 с @ 32 кГц моно | speech compose |
| Open-Unmix | Разделение стемов | MLX | 4 стема @ 44,1 кГц стерео | speech separate |
| DeepFilterNet3 | Подавление шума | CoreML (Neural Engine) | 48 кГц, в реальном времени | speech denoise |
MAGNeT — генерация музыки из текста
MLX Swift-порт MAGNeT от Meta (Masked Audio Generation with a Single Non-Autoregressive Transformer). Генерирует клипы по 30 с моно-музыки на 32 кГц из свободной английской подсказки — "happy rock", "energetic EDM with synth lead" или развёрнутого описательного текста для более чистых результатов.
Архитектура
Три загружаемых компонента, скачиваются при первом вызове:
| Компонент | Роль | Источник |
|---|---|---|
| LM-декодер MAGNeT | Маскированный неавторегрессивный трансформер над 4 кодбуками EnCodec. 24 слоя (Small, 300M) или 48 (Medium, 1.5B). Квантованные проекции Q/K/V/out + линейные слои FFN (MLX-affine, группа 64). | aufklarer/MAGNeT-{Small,Medium}-30secs-MLX-{4,8}bit |
| Текстовый энкодер T5-base | Энкодер с 110M параметрами для текстовой обусловленности. FP32 (только путь энкодера; без декодера, без LM-головы). | t5-base |
| Декодер EnCodec 32 кГц | Декодер SEANet (Conv1d / ConvTranspose1d / ResnetBlock / 2-слойный LSTM) + 4-кодбуковый Euclidean RVQ. Преобразует дискретные токены LM обратно в форму волны 32 кГц. | mlx-community/encodec-32khz-float32 |
Маскированное параллельное декодирование
В отличие от своего авторегрессивного родственника MusicGen, MAGNeT выполняет в общей сложности 50 прямых проходов (распределение по умолчанию [20, 10, 10, 10] по 4 кодбукам) с косинусным планированием ре-маскирования, отжигом classifier-free guidance и локальными окнами внимания по стадиям. Stage 0 имеет полное self-attention; stages 1–3 используют локальное окно |q − k| ≤ 5, поскольку более высокие кодбуки только уточняют детали.
Варианты
| Вариант | Параметры | LM на диске | Пиковый RSS | Время (M-серия, 30 с) | 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 = быстрее реального времени. Квантование почти не влияет на время выполнения — доминирует внимание, а не линейные проекции — поэтому практический выигрыш от 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" (итерации на кодбук), --seed.
Короткие теги вроде "happy rock" работают, но кажутся скудными. Описательные подсказки, упоминающие инструменты + темп + настроение, заметно улучшают связность — в нашем тесте качества более развёрнутая подсказка дала более высокую частоту переходов через ноль (0,116 против 0,093, то есть больше высокочастотных деталей) и нулевой клиппинг. Сравните:
"happy rock"— скудный"energetic upbeat rock anthem with electric guitar riffs, driving drums, bass groove"— более насыщенный, обычно лучше
Пакеты и лицензия
Все четыре пакета MLX являются производными от facebook/magnet-small-30secs и facebook/magnet-medium-30secs и наследуют лицензию Meta: CC-BY-NC 4.0 — только некоммерческое использование. Сгенерированный звук подчиняется тому же ограничению.
Разделение источников — Open-Unmix (4 стема)
Open-Unmix HQ / UMX-L, портированный на MLX. Разделяет стерео-микс на четыре стема — вокал, ударные, бас, другие инструменты — через BiLSTM-предикторы на стем и многоканальный пост-фильтр Wiener-EM, всё работает end-to-end на MLX через обратное STFT. Реальный RTF ~0,031 (в 32 раза быстрее реального времени) на M-серии для 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]
Полная архитектура, настройка и заметки бенчмарка в руководстве по разделению источников.
Улучшение речи — DeepFilterNet3
DeepFilterNet3 на Neural Engine (CoreML). Удаляет фоновый шум из 48 кГц речи в реальном времени с моделью на 2,1M параметров — достаточно малой, чтобы работать рядом с ASR-конвейером как шаг предобработки.
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)
Полная конфигурация в руководстве по улучшению речи.
Выбор правильного инструмента
| Вы хотите… | Используйте |
|---|---|
| Генерировать музыку из текстовой подсказки | MAGNeT (speech compose) |
| Извлечь вокал или ударные из существующего трека | Open-Unmix (speech separate) |
| Очистить шумную речь перед транскрипцией | DeepFilterNet3 (speech denoise) |
| Преобразовать текст в речь (синтез голоса) | VoxCPM2 or Qwen3-TTS |