Librosa (Python) 到 Meyda (Node.js) 转换

Librosa (Python) to Meyda (Node.js) conversion

我正在将 Python 程序转换为 Node.js,程序遵循以下步骤:

  1. 麦克风通过回调监听
  2. 回调执行 Librosa“log_mel_S”提取
  3. “log_mel_S”由 AI 模型推断
  4. 声音被标记

我已经设法将所有步骤及其相关步骤从 Python 翻译成 Node.js,Librosa 提取除外。 这将是所需音频形状和类型的示例:

audio_sample = numpy.zeros(shape=(1024, 100), dtype=numpy.float32)

这是我需要帮助翻译的 Librosa 文章:

S = numpy.abs(librosa.stft(y=audio_sample, n_fft=1024, hop_length=500)) ** 2
mel_S = numpy.dot(librosa.filters.mel(sr=44100, n_fft=1024, n_mels=64), S).T
log_mel_S = librosa.power_to_db(mel_S, ref=1.0, amin=1e-10, top_db=None)

我找到了 this package Meyda,看起来它可以作为一个很好的替代品,但我不确定我应该如何处理这个问题,我不清楚从 Librosa 中提取了什么,所以我不能识别 Amplitude SpectrumPower Spectrum 等术语。 请帮助我理解和翻译这个动作。

TL;DR Amplitude Spectrum 基本上是信号的 FFT,Power SpectrumAmplitude Spectrum 的平方值,有时也称为能量。 这是 Meyda 网站上的一个示例,它正在计算 Amplitude Spectrum https://github.com/catalli/audiotrainer-server/blob/df41322906c88cd6f899e8f9b9661ebb949f72e1/index.js#L17

长答案:

现在,让我们逐行查看您的代码示例,弄清楚它在做什么以及如何在 javascript 中实现它。

  1. S = numpy.abs(librosa.stft(y=audio_sample, n_fft=1024, hop_length=500)) ** 2

这是计算 audio_sample y 的 1024 个 bins fft 的平方值,基本上是 Power SpectrumAmplitude Spectrum 的平方。请注意,复数的abs是一个向量lenth:sqrt(real_part^2 + img_part^2)

  1. mel_S = numpy.dot(librosa.filters.mel(sr=44100, n_fft=1024, n_mels=64), S).T

这是一个 mfcc 计算,它基本上是预定义滤波器组和 fft 平方的乘积。

  1. log_mel_S = librosa.power_to_db(mel_S, ref=1.0, amin=1e-10, top_db=None)

最后一个会将结果转换为分贝 (dB) 单位 (10 * log10(S / ref))

i will extend this answer with js code-sample later, submitting it now because i think it will be helpful already as it is