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 SpectrumPower Spectrum等 请帮我理解和翻译这个动作。

【问题讨论】:

【参考方案1】:

TL;DR Amplitude Spectrum 基本上是信号的 FFT,Power SpectrumAmplitude 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 SpectrumAmplitude 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库语音信号处理

Python librosa.display 无法导入

在用 python 编写的天蓝色函数应用程序中使用 librosa

在 python 中使用 scipy 和 librosa 读取 wav 文件

librosa音频处理教程

cx_freeze 不允许我用 librosa Python3 制作 gui