每隔几毫秒获取 mp3 文件的音调
Get pitch of mp3 files at every few ms
所以我尝试使用 javascript 或 python(或任何其他可以做到的)每隔几毫秒获取 mp3 文件的音调和音量。任何帮助将不胜感激,谢谢。
音高与信号幅度变化的快慢有关,因此需要在一段时间内计算,而不是在瞬间计算。
我建议将您的 mp3 解码为波形(有 Python 库会为您将其放入一个 numpy 数组中)然后一次取一个部分并执行以下操作:
- 运行 块上的 FFT(搜索 numpy FFT)以查找频率内容。通常,特定音高的声音将具有基频,并且还会有谐波成分,即基频整数倍的频率。此外,您可能有不止一种贡献声音,因此会有多个基频,每个基频都有自己的谐波。 FFT 将计算出假设他阻塞然后永远重复的频率。不幸的是,你的信号的开始和结束幅度在你的块的开始和结束处不匹配,所以这个假设就像幅度突然跳跃一样。这将导致您的 FFT 结果出现伪影,因此如果您的应用程序存在问题,您需要在 运行 FFT 之前查看 windowing。这会在开始和结束时削弱你的块,所以它们在零处排列。
- 确定哪个 FFT 峰值与您要录制的音高相关。例如,这可能是最高峰。这个峰值的频率就是这个块的音调。
- 获取块的均方根 (RMS)(来自原始数组,而不是 FFT)并将其用作体积度量。
然后你可以移动到下一个块并重复,所以如果你的块大小是 440 个样本(10 毫秒,44kHz 采样率),你的第一个块从 0 到 439,然后下一个从 440 到 879 等等。
如果你愿意,你也可以做一个滑块,例如每次将 440 个样本块推进 44 个样本,因此第一个块是 0 到 439,下一个是 44 到 483。
所以我尝试使用 javascript 或 python(或任何其他可以做到的)每隔几毫秒获取 mp3 文件的音调和音量。任何帮助将不胜感激,谢谢。
音高与信号幅度变化的快慢有关,因此需要在一段时间内计算,而不是在瞬间计算。
我建议将您的 mp3 解码为波形(有 Python 库会为您将其放入一个 numpy 数组中)然后一次取一个部分并执行以下操作:
- 运行 块上的 FFT(搜索 numpy FFT)以查找频率内容。通常,特定音高的声音将具有基频,并且还会有谐波成分,即基频整数倍的频率。此外,您可能有不止一种贡献声音,因此会有多个基频,每个基频都有自己的谐波。 FFT 将计算出假设他阻塞然后永远重复的频率。不幸的是,你的信号的开始和结束幅度在你的块的开始和结束处不匹配,所以这个假设就像幅度突然跳跃一样。这将导致您的 FFT 结果出现伪影,因此如果您的应用程序存在问题,您需要在 运行 FFT 之前查看 windowing。这会在开始和结束时削弱你的块,所以它们在零处排列。
- 确定哪个 FFT 峰值与您要录制的音高相关。例如,这可能是最高峰。这个峰值的频率就是这个块的音调。
- 获取块的均方根 (RMS)(来自原始数组,而不是 FFT)并将其用作体积度量。
然后你可以移动到下一个块并重复,所以如果你的块大小是 440 个样本(10 毫秒,44kHz 采样率),你的第一个块从 0 到 439,然后下一个从 440 到 879 等等。
如果你愿意,你也可以做一个滑块,例如每次将 440 个样本块推进 44 个样本,因此第一个块是 0 到 439,下一个是 44 到 483。