функции извлечения звука kearas.features.melspectrogram для использования с conv2D - PullRequest
0 голосов
/ 25 мая 2020

Приветствую, Сейчас я пытаюсь создать правильную форму извлечения звука для подачи на слой conv2D (вход, первый уровень)

Сценарий: Я хочу создать CNN на основе статьи: http://www.ofai.at/~jan.schlueter/pubs/2017_eusipco.pdf

Цель состоит в том, чтобы извлечь функции из аудио с помощью каналов mel, чтобы разделить их на [0,1]
0 = птица не обнаружена в звуке, 1 = птица обнаружена в звуке

Моя проблема: У меня есть мелкие функции, извлеченные и восстанавливающие форму: (700,80) на звук сегмент, но мне нужно третье измерение, чтобы передать их в слой Conv2D. Я попытался понять пример кода для asp идеи добавленного измерения, но я почему-то потерялся.

Пример кода со строками печати и

def compute_mfccs(tensor):
sample_rate = 22050
lower_edge_hertz, upper_edge_hertz, num_mel_bins = 80, 11000, 40
frame_length = 1024
frame_step= 315
num_mfcc = 24

stfts = tf.signal.stft(tensor, frame_length=frame_length, frame_step=(frame_step), fft_length=frame_length)
print(stfts.shape, "stft")
spectrograms = tf.abs(stfts)
print(spectrograms.shape, "specto_1")
spectrograms = tf.reshape(spectrograms, (spectrograms.shape[0],spectrograms.shape[1],-1))
print(spectrograms.shape, "specto_2")

num_spectrogram_bins = stfts.shape[-1]

linear_to_mel_weight_matrix = tf.signal.linear_to_mel_weight_matrix(
  num_mel_bins, num_spectrogram_bins, sample_rate, lower_edge_hertz,
  upper_edge_hertz)

print(linear_to_mel_weight_matrix.shape, "linear_to_mel")
mel_spectrograms = tf.tensordot(spectrograms, linear_to_mel_weight_matrix, 1)
print(mel_spectrograms.shape, "mel_spectrograms")

log_mel_spectrograms = tf.math.log(mel_spectrograms + 1e-6)
print(log_mel_spectrograms.shape, "log_mel_spectograms")
mfccs = tf.signal.mfccs_from_log_mel_spectrograms(log_mel_spectrograms)[..., :num_mfcc]
print(mfccs.shape, "mfccs")
mfccs_new=tf.reshape(mfccs, (mfccs.shape[0],mfccs.shape[1],mfccs.shape[2],-1))
print(mfccs_new.shape, "mfccs_new")
return tf.reshape(mfccs, (mfccs.shape[0],mfccs.shape[1],mfccs.shape[2],-1))

с выводом:

 (2, 215, 1, 513) stft
(2, 215, 1, 513) specto_1
(2, 215, 513) specto_2
(513, 40) linear_to_mel
(2, 215, 40) mel_spectrograms
(2, 215, 40) log_mel_spectograms
(2, 215, 24) mfccs
(2, 215, 24, 1) mfccs_new

Как мне перейти от mfccs к mfccs_new, изменив только информацию? (без учета фактических размеров массивов)

Мой код (mel spe c извлечение признаков):

  for i in tqdm(range(trainsize)):
        signal, sr = librosa.load("wav/"+str(traindata[i]['id'])+".wav") # Read wavfile to extract amplitudes
        mel_spec= librosa.feature.melspectrogram(signal, sr=22050, n_fft=1999, hop_length=hop_size,fmin=50, fmax=11000, n_mels=80, norm=1).T
        print(mel_spec.shape)
        print(mel_spec)
        mel_spec_new=tf.reshape(mel_spec, (mel_spec.shape[0],mel_spec.shape[1],1))
        print(mel_spec.shape)


        x_train_list.append(mel_spec.astype(np.float32)) # Add segmented slice to training sample list, cast to float so librosa doesn't complain

-> желаемая форма (1, 700 , 80) что содержится в дополнительном измерении?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...