Librosa (Python) 到 Meyda (Node.js) 的转换
Posted
技术标签:
【中文标题】Librosa (Python) 到 Meyda (Node.js) 的转换【英文标题】:Librosa (Python) to Meyda (Node.js) conversion 【发布时间】:2021-08-15 18:07:50 【问题描述】:我正在将 Python 程序转换为 Node.js,程序遵循以下步骤:
-
麦克风通过回调监听
回调执行 Librosa“log_mel_S”提取
“log_mel_S”由 AI 模型推断
声音被标记
除了 Librosa 提取之外,我已设法将所有步骤及其相关步骤从 Python 转换为 Node.js。 这是所需音频形状和类型的示例:
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 Spectrum
、Power Spectrum
等
请帮我理解和翻译这个动作。
【问题讨论】:
【参考方案1】:TL;DR
Amplitude Spectrum
基本上是信号的 FFT,Power Spectrum
是 Amplitude Spectrum
的平方值,有时也称为能量。
这是来自 Meyda 网站的示例之一,它正在计算 Amplitude Spectrum
https://github.com/catalli/audiotrainer-server/blob/df41322906c88cd6f899e8f9b9661ebb949f72e1/index.js#L17
长答案:
现在,让我们逐行查看您的代码示例并弄清楚它在做什么以及如何在 javascript 中实现它。
S = numpy.abs(librosa.stft(y=audio_sample, n_fft=1024, hop_length=500)) ** 2
这是计算 audio_sample y 的 1024 个 bin fft 的平方值,基本上是 Power Spectrum
或 Amplitude Spectrum
的平方。请注意,复数的abs
是一个向量长度:sqrt(real_part^2 + img_part^2)
mel_S = numpy.dot(librosa.filters.mel(sr=44100, n_fft=1024, n_mels=64), S).T
这是一个 mfcc 计算,基本上是预定义滤波器组和 fft 平方的乘积。
log_mel_S = librosa.power_to_db(mel_S, ref=1.0, amin=1e-10, top_db=None)
最后一个会将结果转换为分贝 (dB) 单位 (10 * log10(S / ref)
)
我稍后会用 js 代码示例扩展这个答案,现在提交它,因为我认为它已经很有帮助了
【讨论】:
以上是关于Librosa (Python) 到 Meyda (Node.js) 的转换的主要内容,如果未能解决你的问题,请参考以下文章
在用 python 编写的天蓝色函数应用程序中使用 librosa