разница в скорости между реализациями тензорного потока спектрограммы mfcc
Я пытаюсь предварительно обработать аудиоклипы для задачи определения ключевых слов, в которой используются модели машинного обучения.
Первым шагом является вычисление спектрограммы, начиная с формы волны, и для этого я обнаружил, что в структуре тензорного потока есть два способа.
Первый заключается в использовании
Это означает, что функции:
stft = tf.signal.stft(signals, frame_length, frame_step)
spectrogram = tf.abs(stft)
# matrix computed beforehand
tf.tensordot(spectrogram, linear_to_mel_weight_matrix, 1)
log_mel_spectrogram = tf.math.log(mel_spectrogram + 1.e-6)
mfccs = tf.signal.mfccs_from_log_mel_spectrograms(log_mel_spectrogram)
Второй заключается в использовании
# spectrogram computation
spectrogram = tf.raw_ops.AudioSpectrogram(
input=sample,
window_size=window_size_samples,
stride=window_stride_samples
)
# mfcc computation
mfcc_features = tf.raw_ops.Mfcc(
spectrogram=spectrogram,
sample_rate=sample_rate,
dct_coefficient_count=dct_coefficient_count
)
Проблема в том, что второй намного быстрее (~10x). Как видно из этой таблицы.
В обоих случаях использовались одни и те же параметры (размер окна, размер прыжка, количество коэффициентов...). Я провел несколько тестов, и результат остается таким же до 3-го десятичного знака.
Мой вопрос: есть ли у кого-то опыт работы с этими функциями или кто-то может объяснить такое поведение?