使用SPICE和TensorFlow Hub估计螺距

2020-06-21 02:31:59

基音检测是一个有趣的挑战。从历史上看,机器要理解音高,就需要依靠复杂的手工信号处理算法来测量音符的频率,特别是要将相关频率与背景噪音和伴奏乐器分开。今天,我们可以通过机器学习来做到这一点,更具体地说,我们可以使用SPICE模型(SPICE:自监督基音估计)。SPICE是一种预先训练的模型,可以从混合录音(包括噪声和背景乐器)中识别基本音高。该模型还可以通过TensorFlow.js在Web上使用,也可以在使用TensorFlow Lite的移动设备上使用。在本教程中,我们将向您介绍如何使用SPICE从短小的音乐剪辑中提取音调。首先,我们将加载音频文件并对其进行处理。然后我们将使用机器学习来解决这个问题(您会注意到使用TensorFlow Hub是多么容易)。最后,我们将做一些后处理和一些很酷的可视化。你可以跟着这个可乐笔记本走。该模型期望原始音频样本作为输入。为了帮助您做到这一点,我们展示了四种方法,您可以使用它们将输入WAV文件导入到CoLab:您可以选择这些方法中的任何一种。直接用可乐录制你自己的歌声是最容易尝试的,也是最有趣的。音频可以以多种格式录制(例如,您可能使用Android应用程序录制,或者在台式机或浏览器上录制),将您的音频转换为模型期望的确切格式可能很有挑战性。为了帮助您做到这一点,有一个助手函数CONVERT_AUDIO_FOR_MODEL可以将您的WAV文件以16 khz的采样率转换为一个音频通道的正确格式。在本文的其余部分,我们将使用此文件:您的浏览器不支持音频元素。现在我们已经加载了音频,我们可以使用语谱图将其可视化,该图显示随时间变化的频率。在这里,我们使用对数频率刻度,以使演唱更加清晰(请注意,这一步不是运行模型所必需的,它只是为了可视化)。我们还需要最后一次转换。输入必须标准化为-1到1之间的浮点数。在上一步中,我们将音频转换为16位格式(使用助手函数Convert_Audio_for_model)。要使其标准化,我们只需将所有值除以2 16,或者在我们的代码中,MAX_ABS_INT16:从TensorFlow Hub加载模型非常简单。您只需对模型的URL使用Load方法即可。注意:这里有一个有趣的细节,来自Hub的所有模型URL都可用于下载和阅读文档,因此,如果您将浏览器指向该链接,则可以阅读有关如何使用模型的文档,并了解有关模型如何培训的更多信息。现在,我们可以通过传递归一化音频样本来使用从TensorFlow Hub加载的模型:在这一点上,我们有基音估计和不确定性(检测到的每个基音)。将不确定性转换为置信度(置信度_输出=1.0-不确定性_输出),我们可以很好地理解结果:正如我们可以看到的那样,对于某些预测(特别是在没有歌声的情况下),置信度非常低。让我们仅通过删除置信度低于0.9的结果来保持预测的高度置信度。要确认模型工作正常,请将音调从[0.0,1.0]范围转换为绝对值(以Hz为单位)。要进行此转换,我们可以使用COLAB笔记本中提供的函数:def output2 hz(PING_OUTPUT):#从https://tfhub.dev/google/spice/2获取的常量PT_OFFSET=25.58PT_SLOPE=63.07FMIN=10.0;BINS_PER_OCTAVE=12.0;CQT_BIN=PING_OUTPUT*PT_SLOPE+PT_OFFSET;RETURN FMIN*2.0**(1.0*CQT_bin/bins_per_octave)CONFUBLE_PING_VALUES_Hz=[输出2 hz(P)for p in Confired_Pitch_Outports_y]。

如果我们将这些值绘制在谱图上,我们可以看到预测与主音高的匹配程度,这可以被视为谱图中较强的线条:成功!我们设法从歌手的声音中提取了相关的音调。注意,对于该特定示例,用于提取音调的基于语谱图的启发式方法也可能起作用。一般来说,基于ML的模型比手工制作的信号处理方法执行得更好,特别是当音频中存在背景噪声和背景乐器时。有关SPICE与基于谱图的算法(SWIPE)的比较,请参见此处。为了使音调信息更有用,我们还可以找到每个音调代表的音符。为此,我们将应用一些数学方法将频率转换为音符。一个重要的观察是,与推断的音调值相反,转换的音符是量化的,因为该转换涉及舍入(笔记本中的函数hz2offset使用了一些数学,您可以在这里找到一个很好的解释)。此外,我们还需要在时间上将预测组合在一起,以获得更长的s