Когда мы работаем с mel-spectrogram для создания функции для сети глубокого обучения, размер функции имеет важное значение. Эта статья позволяет людям понять, как рассчитывается размер функции, после чего мы можем реализовать извлечение функций самостоятельно. мы сделаем несколько шагов, сначала загрузим данные из wav-файла, затем напрямую воспользуемся API mel_spectrogram из librosa, после этого мы будем шаг за шагом вычислять mel_spectrogram вручную. Наконец, мы сравним руководство со сквозной версией.

Шаг 1. Загрузите данные из wav-файла в программу.

Если вы используете Python, используйте librosa lib с функцией загрузки, чтобы загрузить только 1 канал из файла wav, мы можем реализовать это

def load_sound_file(path, mono=False, channel=0):
  signal, sr = librosa.load(path, sr=None, mono=mono)
  if signal.ndim < 2:
  sound_file = signal, sr
  else:
  sound_file = signal[channel, :], sr
  return sound_file

y,sr= load_sound_file('cant-do-that-44100.wav')

dur = librosa.get_duration(y=y,sr=sr)
print(len(y),sr,dur)

# Output is 
# 166671 44100 3.7793877551020407

Шаг 2: Сгенерируйте мел-спектрограмму непосредственно с помощью librora lib

n_fft (длина БПФ), n_mel (количество ячеек мела), настройки hop_length, которые являются параметрами по умолчанию во многих библиотеках и приложениях.

n_fft= 2048
n_mels= 128
win_length = n_fft
hop_length= 512

S=librosa.feature.melspectrogram(y=y,sr=sr,n_fft=n_fft, hop_length=hop_length, n_mels=n_mels, win_length=win_length)
import matplotlib.pyplot as plt
fig, ax = plt.subplots()
S_dB = librosa.power_to_db(S, ref=np.max)
img = librosa.display.specshow(S_dB, x_axis='time',
                         y_axis='mel', sr=sr,
                         ax=ax)
fig.colorbar(img, ax=ax, format='%+2.0f dB')
ax.set(title='Mel-frequency spectrogram')
print(S_dB.shape)

# Output is 
(128, 326)

Что делает мел-шкала, так это то, что мел-шкала больше фокусируется на низких частотах и ​​подавляет высокие, а затем помещает все частоты в мел-бин, поэтому на выходе будет ровно мел-бин.

Шаг 3. Создайте банк мел-фильтров и рассчитайте power_spectrogram

filter_banks = librosa.filters.mel(n_fft = n_fft, sr = sr, n_mels = n_mels)
print('filterBankSize:',filter_banks.shape)

D = np.abs(librosa.stft(y,n_fft=n_fft, hop_length=hop_length,win_length=win_length))**2
librosa.display.specshow(librosa.amplitude_to_db(D,ref=np.max),sr=sr,
                         y_axis='log', x_axis='time')
plt.title('Power spectrogram')
plt.colorbar(format='%+2.0f dB')
plt.tight_layout()
print('Power_SpectSize:', D.shape)

# Output
# FilterBankSize: (128, 1025)
# PowerSpectSize: (1025, 326)

Шаг 4. Сгенерируйте mel из спектрограммы мощности и сравните две версии

my_S= filter_banks.dot(D)
my_S_dB =librosa.power_to_db(my_S, ref=np.max)

print(my_S_dB.shape)
librosa.display.specshow(my_S_dB,sr=sr,
                         y_axis='mel', x_axis='time')
plt.title('mel from power spectrogram')
plt.colorbar(format='%+2.0f dB')
plt.tight_layout()

Спектрограмма Mel теперь может быть заархивирована из спектрограммы мощности после применения банка фильтров mel. Давайте сравним результат между ними

from sklearn.metrics import mean_squared_error
mean_squared_error(my_S_dB,S_dB)

# Output is 0.0 means perfectly matching between them