Librosa.feature.mfcc: примеры (PYTHON)

Извлечение MFCC с помощью библиотеки Librosa в Python
Раздел: Обработка аудио, Извлечение признаков
librosa.feature.mfcc(y: ndarray, sr: int): ndarray

Функция librosa.feature.mfcc

Функция librosa.feature.mfcc является частью библиотеки Librosa для анализа и обработки аудиосигналов в Python. Ее основное назначение - извлечение мел-кепстральных коэффициентов (MFCC) из аудиоданных. MFCC представляют собой коротковременные спектральные характеристики, которые широко используются в задачах распознавания речи, идентификации говорящего, классификации звуков и музыкальном информационном поиске.

Использование функции оправдано в случаях, когда требуется получить компактное и информативное представление тембральной окраски звука, которое соответствует особенностям человеческого слухового восприятия.

Аргументы функции

  • y (np.ndarray): Аудиосигнал во временной области. Может быть одномерным (моно) или двумерным (стерео).
  • sr (число, >0): Частота дискретизации сигнала y в герцах.
  • S (np.ndarray, опционально): Логарифмическая мел-спектрограмма. Если указан этот параметр, аргументы y и sr игнорируются.
  • n_mfcc (int, по умолчанию 20): Количество возвращаемых MFCC коэффициентов. Обычно используется от 13 до 40.
  • dct_type (int, {1, 2, 3, 4}, по умолчанию 2): Тип дискретного косинусного преобразования (DCT). Тип 2 соответствует стандартному DCT-II.
  • norm (string или None, по умолчанию 'ortho'): Норма DCT. 'ortho' использует ортонормированное DCT.
  • lifter (число, по умолчанию 0): Коэффициент подъема (подъём cepstral). Если ненулевое значение, применяется подъём cepstral для сглаживания коэффициентов.
  • **kwargs: Дополнительные аргументы, передаваемые в функцию librosa.feature.melspectrogram для вычисления мел-спектрограммы, если не указан параметр S.

Возвращаемое значение

Функция возвращает двумерный массив NumPy формы (n_mfcc, t), где t - количество временных кадров. Каждый столбец массива содержит MFCC для соответствующего временного кадра.

Простые примеры использования

Пример базового извлечения MFCC из аудиофайла.

import librosa
import numpy as np

# Загрузка аудиофайла
y, sr = librosa.load(librosa.ex('trumpet'))

# Извлечение 13 MFCC коэффициентов
mfccs = librosa.feature.mfcc(y=y, sr=sr, n_mfcc=13)
print(f"Форма массива MFCC: {mfccs.shape}")
print(f"Первые 5 коэффициентов первого кадра: {mfccs[:5, 0]}")
Форма массива MFCC: (13, 97)
Первые 5 коэффициентов первого кадра: [-286.99377    -106.541115   -162.30196    -184.49768    -107.67304   ]

Пример с использованием предварительно вычисленной мел-спектрограммы и изменением типа DCT.

# Вычисление мел-спектрограммы
S = librosa.feature.melspectrogram(y=y, sr=sr)
log_S = librosa.power_to_db(S, ref=np.max)

# Извлечение MFCC из спектрограммы с DCT типа 3
mfccs_from_spec = librosa.feature.mfcc(S=log_S, n_mfcc=20, dct_type=3)
print(f"Форма: {mfccs_from_spec.shape}")
print(f"Среднее значение по всем коэффициентам: {np.mean(mfccs_from_spec):.2f}")
Форма: (20, 97)
Среднее значение по всем коэффициентам: -218.38

Пример с применением cepstral подъема (liftering).

# Извлечение MFCC с подъемом для сглаживания
mfccs_liftered = librosa.feature.mfcc(y=y, sr=sr, n_mfcc=13, lifter=22)
print(f"Разница между первым коэффициентом с подъемом и без: {mfccs[0,0] - mfccs_liftered[0,0]:.2f}")
Разница между первым коэффициентом с подъемом и без: 0.80

Похожие функции в Python

  • librosa.feature.melspectrogram: Прямое вычисление мел-спектрограммы без перехода к кепстральной области. Используется, когда нужны мел-банки, а не их сжатое представление через DCT.
  • python_speech_features.mfcc: Функция из библиотеки python_speech_features. Часто используется в классических задачах обработки речи, имеет схожий интерфейс, но может отличаться параметрами по умолчанию (например, количеством фильтров в мел-банке).
  • torchaudio.transforms.MFCC: Реализация MFCC в PyTorch через вычислительный граф. Предпочтительна при работе с нейронными сетями на PyTorch для интеграции преобразования в пайплайн обучения.
  • kapre.composed.get_melspectrogram_layer или kapre.composed.get_stft_melspectrogram_layer: Слои Keras для вычисления MFCC/спектрограмм непосредственно внутри модели глубокого обучения. Используются, когда требуется обучаемое или дифференцируемое преобразование.

Выбор функции зависит от контекста: librosa.feature.mfcc подходит для общего анализа и прототипирования благодаря широким возможностям настройки и интеграции с другими инструментами Librosa. Для продакшена в связке с PyTorch или TensorFlow чаще применяют соответствующие имплементации этих фреймворков.

Типичные ошибки

1. Передача сигнала с неправильной частотой дискретизации или ее отсутствие.

import librosa
y = librosa.load(librosa.ex('trumpet'), sr=None)[0] # Загрузка с родной частотой
try:
    # Ошибка: не указан аргумент sr
    mfccs = librosa.feature.mfcc(y=y)
except TypeError as e:
    print(f"Ошибка: {e}")
Ошибка: mfcc() missing 1 required positional argument: 'sr'

2. Некорректное значение параметра n_mfcc.

y, sr = librosa.load(librosa.ex('trumpet'), duration=1.0)
try:
    # Запрос отрицательного количества коэффициентов
    mfccs = librosa.feature.mfcc(y=y, sr=sr, n_mfcc=-5)
except Exception as e:
    print(f"Ошибка: {type(e).__name__}")
Ошибка: ParameterError

3. Одновременная передача сигнала (y) и спектрограммы (S). Приоритет имеет параметр S.

y, sr = librosa.load(librosa.ex('trumpet'), duration=1.0)
S_dummy = librosa.feature.melspectrogram(y=y, sr=sr)
# Будет использована S_dummy, y и sr проигнорированы
mfccs = librosa.feature.mfcc(y=y, sr=sr, S=S_dummy)
# Код выполнится, но это может быть неочевидно

4. Ожидание, что MFCC будут иметь фиксированную длину, независимо от длительности аудио. Количество кадров зависит от параметров кадрирования (hop_length, n_fft), передаваемых через **kwargs.

Изменения в последних версиях

В версии Librosa 0.9.0 и выше произошли следующие существенные изменения, связанные с функцией MFCC:

  • Изменение значения по умолчанию для параметра norm: В версиях до 0.8.0 по умолчанию использовалось norm=None. Начиная с версии 0.9.0, значение по умолчанию изменено на norm='ortho' для соответствия стандартному ортонормированному DCT-II. Это приводит к иным численным значениям коэффициентов, хотя их информационная сущность сохраняется. Код, написанный для старых версий, может давать другие числовые результаты.
  • Рекомендация использовать power_to_db: При вычислении MFCC из спектрограммы (параметр S) документация теперь явно рекомендует передавать логарифмическую мел-спектрограмму, полученную через librosa.power_to_db(S), хотя функция внутренне выполняет логарифмирование, если спектрограмма линейна. Для согласованности лучше передавать уже логарифмированные значения.
  • Улучшение обработки ключевых аргументов: Повышена стабильность передачи **kwargs в базовые функции (melspectrogram, stft).

При миграции кода со старых версий следует проверять значения параметров norm и, при необходимости, явно устанавливать norm=None для воспроизведения старого поведения.

Расширенные примеры применения

Пример 1: Извлечение MFCC с кастомными параметрами мел-спектрограммы и их визуализация.

Пример python
import librosa
import librosa.display
import matplotlib.pyplot as plt
import numpy as np

y, sr = librosa.load(librosa.ex('brahms'), duration=5.0)

# Извлечение MFCC с увеличенным размером окна и шагом для снижения частоты кадров
mfccs_custom = librosa.feature.mfcc(y=y, sr=sr, n_mfcc=13, n_fft=2048, hop_length=512, n_mels=128)
print(f"Форма с кастомными параметрами: {mfccs_custom.shape}")

# Визуализация первых 13 коэффициентов
plt.figure(figsize=(10, 4))
librosa.display.specshow(mfccs_custom, x_axis='time', sr=sr, hop_length=512)
plt.colorbar(format='%+2.0f dB')
plt.title('MFCC (n_fft=2048, hop_length=512, n_mels=128)')
plt.tight_layout()
plt.show()

Пример 2: Сравнение MFCC для разных источников звука и вычисление статистик.

Пример python
# Сравнение MFCC для двух разных аудиосэмплов
from scipy.spatial.distance import cosine

y1, sr1 = librosa.load(librosa.ex('trumpet'), duration=2.0)
y2, sr2 = librosa.load(librosa.ex('vibeace'), duration=2.0)

mfcc1 = librosa.feature.mfcc(y=y1, sr=sr1, n_mfcc=13)
mfcc2 = librosa.feature.mfcc(y=y2, sr=sr2, n_mfcc=13)

# Усреднение по времени для получения одного вектора признаков на трек
mfcc1_mean = np.mean(mfcc1, axis=1)
mfcc2_mean = np.mean(mfcc2, axis=1)

print(f"Средние MFCC для трубы: {mfcc1_mean[:4].round(2)}...")
print(f"Средние MFCC для вибрафона: {mfcc2_mean[:4].round(2)}...")
print(f"Косинусное расстояние между усредненными векторами: {cosine(mfcc1_mean, mfcc2_mean):.4f}")

# Можно вычислить и другие статистики, например, производные (дельта коэффициенты)
mfcc1_delta = librosa.feature.delta(mfcc1)
print(f"Форма дельта-коэффициентов: {mfcc1_delta.shape}")
Средние MFCC для трубы: [-279.93 -132.67 -178.12 -181.89]...
Средние MFCC для вибрафона: [-419.91 -268.13 -261.67 -238.47]...
Косинусное расстояние между усредненными векторами: 0.0065
Форма дельта-коэффициентов: (13, 97)

Пример 3: Использование MFCC в пайплайне предобработки для классификации (упрощенный пример).

Пример python
import numpy as np
from sklearn.preprocessing import StandardScaler

# Имитация извлечения признаков из нескольких файлов
all_mfcc_features = []
for i in range(5): # Предположим, 5 аудиофайлов
    # Здесь должна быть загрузка конкретного файла y, sr = ...
    y, sr = librosa.load(librosa.ex('trumpet'), duration=1.0, offset=i*0.5) # Имитация разных сегментов
    mfcc = librosa.feature.mfcc(y=y, sr=sr, n_mfcc=13, hop_length=256)
    # Усреднение и конкатенация с дельта-признаками
    mfcc_mean = np.mean(mfcc, axis=1)
    mfcc_delta_mean = np.mean(librosa.feature.delta(mfcc), axis=1)
    features = np.concatenate([mfcc_mean, mfcc_delta_mean])
    all_mfcc_features.append(features)

X = np.array(all_mfcc_features)
print(f"Матрица признаков для классификатора: {X.shape}")

# Нормализация признаков
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
print(f"Среднее после нормализации: {np.mean(X_scaled[:, 0]):.2f}")
Матрица признаков для классификатора: (5, 26)
Среднее после нормализации: 0.00

Альтернативы в других языках программирования

Прямых аналогов librosa.feature.mfcc в других языках, предоставляющих такую же степень абстракции и удобства, часто не существует. Реализации обычно являются частью более крупных библиотек для обработки сигналов или машинного обучения.

JavaScript (библиотека Meyda)

// Упрощенный пример. На практике требуется загрузка аудиобуфера.
const Meyda = require('meyda');

// Предположим, есть аудиобуфер audioBuffer и частота дискретизации sampleRate
let audioBuffer = ...;
let sampleRate = ...;

// Создание экстрактора признаков
let extractor = Meyda.createMeydaExtractor({
    sampleRate: sampleRate,
    bufferSize: 512,
    featureExtractors: ["mfcc"],
    numberOfMFCCCoefficients: 13
});

// Извлечение признаков из буфера
let features = extractor(audioBuffer.getChannelData(0));
console.log(features.mfcc); // Массив MFCC коэффициентов

Java (библиотека TarsosDSP)

// Примерная структура кода
import be.tarsos.dsp.Mfcc;

float sampleRate = 44100;
int audioBufferSize = 1024;
int amountOfMelFilters = 40;
int amountOfCepstrumCoef = 13;

Mfcc mfccConverter = new Mfcc(audioBufferSize, sampleRate, amountOfMelFilters, amountOfCepstrumCoef, 0, sampleRate/2);

// Для каждого кадра аудиоданных:
float[] audioFrame = ...; // данные кадра
float[] mfcc = mfccConverter.getMFCC(audioFrame);

C# (библиотека Accord.NET Extensions или NAudio со своими обработками)

Прямого аналога нет, требуется каскад преобразований: FFT -> Mel-фильтры -> Логарифм -> DCT.

Общее замечание

В отличие от лаконичного вызова в Librosa, альтернативы на других языках часто требуют больше шагов для настройки конвейера обработки, явного управления памятью и буферами. Функция в Python скрывает эти детали, предлагая высокоуровневый интерфейс.

питон librosa.feature.mfcc function comments

En
Librosa.feature.mfcc Extract MFCC features