Реализация AI-мастеринга аудио
AI-мастеринг автоматизирует финальную обработку трека для дистрибуции: нормализацию громкости, частотную коррекцию, компрессию, лимитирование. Заменяет ручной мастеринг в конвейерных задачах — подкасты, корпоративный аудиоконтент, игровые ассеты.
matchering — референсный мастеринг
import matchering as mg
def master_to_reference(
target_path: str,
reference_path: str,
output_path: str
) -> None:
"""Мастерим target под звучание reference"""
mg.process(
target=mg.pcm16(target_path),
reference=mg.pcm16(reference_path),
results=[
mg.Result(output_path, subtype="PCM_16"),
]
)
Matchering анализирует спектральные и динамические характеристики reference-трека и применяет EQ + компрессию к target, чтобы они звучали схожим образом.
Loudnorm — стандарт громкости для вещания
import subprocess
import json
def loudnorm_two_pass(input_path: str, output_path: str, target_lufs: float = -14.0) -> None:
"""
-14 LUFS = Spotify/Apple Music
-16 LUFS = YouTube
-23 LUFS = EBU R128 (вещание)
"""
# Pass 1: анализ
probe = subprocess.run([
"ffmpeg", "-i", input_path,
"-af", f"loudnorm=I={target_lufs}:TP=-1.5:LRA=11:print_format=json",
"-f", "null", "-"
], capture_output=True, text=True)
# Парсим статистику из stderr
stats = json.loads(probe.stderr.split("Parsed_loudnorm")[1].split("\n", 2)[2])
# Pass 2: финальная нормализация с измеренными параметрами
subprocess.run([
"ffmpeg", "-i", input_path,
"-af", (
f"loudnorm=I={target_lufs}:TP=-1.5:LRA=11"
f":measured_I={stats['input_i']}"
f":measured_LRA={stats['input_lra']}"
f":measured_TP={stats['input_tp']}"
f":measured_thresh={stats['input_thresh']}"
":linear=true:print_format=summary"
),
"-ar", "44100", output_path
], check=True)
Автоматическая частотная коррекция
import librosa
import numpy as np
from scipy.signal import butter, filtfilt
class AutoEqualizer:
"""Простой автоматический EQ на основе анализа спектра"""
TARGET_SPECTRUM = {
"podcast": {
100: -3, # убираем гул
250: -2, # чистим мутность
3000: +2, # присутствие голоса
8000: +1, # воздух
},
"music": {
60: +2,
200: -1,
3000: +1,
10000: +2,
}
}
def analyze_and_correct(self, audio: np.ndarray, sr: int, profile: str = "podcast") -> np.ndarray:
spectrum = np.abs(librosa.stft(audio))
freqs = librosa.fft_frequencies(sr=sr)
corrections = self.TARGET_SPECTRUM.get(profile, {})
corrected = audio.copy()
for freq_hz, gain_db in corrections.items():
gain_linear = 10 ** (gain_db / 20)
# Применяем пиковый фильтр вокруг целевой частоты
b, a = self._peak_filter(freq_hz, sr, gain_db, Q=2.0)
corrected = filtfilt(b, a, corrected)
return corrected
Пайплайн для подкаст-продакшна
class PodcastMasteringPipeline:
async def process(self, raw_audio_path: str, output_path: str) -> dict:
steps = [
("noise_reduction", self.denoise),
("eq_correction", self.auto_eq),
("compression", self.compress),
("loudnorm", self.normalize_loudness),
("limiter", self.true_peak_limit),
]
audio, sr = self.load(raw_audio_path)
metrics = {}
for step_name, step_fn in steps:
audio = await step_fn(audio, sr)
metrics[step_name] = self.measure(audio, sr)
self.export(audio, sr, output_path, format="mp3", bitrate="128k")
return metrics
Платные API-альтернативы
| Сервис | API | Качество | Стоимость |
|---|---|---|---|
| LANDR | REST | Высокое | $10–25/трек |
| eMastered | REST | Высокое | $9/трек |
| Dolby.io Media API | REST | Профессиональное | $0.01/мин |
| iZotope Ozone AI | SDK/AU/VST | Топовое | Лицензия |
Для массовой обработки (подкасты, аудиокниги, корпоративный контент) — self-hosted matchering + ffmpeg loudnorm дают уровень качества, достаточный для Spotify/YouTube дистрибуции без затрат на API. Сроки: базовый мастеринг-пайплайн — 1 неделя. С веб-интерфейсом загрузки и очередью — 2–3 недели.







