大家好,我是 CRIWARE 的增野。
在先前的文章中:
第一话是关于“打节拍的秘密”,
第二话是关于“乐曲的热闹程度以及乐句解析”,
我们对 BEATWIZ 做了简单的介绍。
之前有提到,将输入的乐曲根据“符合作曲家意图的 MBT 单位”进行重新解析,从而获得了在这之前没办法通过直观感受来获取的定量的信息。
这次,我们会关于技术的进一步发展,
把“带有人声的曲子”的“人声”的部分和“其他的部分”进行“主唱分离”的话题,
以及使用分离的“主唱成分”来生成“主旋律的乐谱”的话题。
听我的歌声
现在新冠流行,虽然可能减少了,在大城市里一定会有人声,车声,电车声等各种大量的杂音。
大家在城市的嘈杂声中,是不是会有下面的经历?
- 在嘈杂的环境中,呼叫自己的声音能够切实的听见
- 在噪音中,人声的人声部分能够单独的听出来
- 在车内,打电话的声音非常的令人烦躁
像这样,“人的声音”非常的特别,不能简单的作为一种声音来考虑。
因此我假定存在一种和“人的声音”一样,对于人的耳朵来说更容易和“周围”的声音区别开来的这么一种声音,通过将这个概念量化,是不是就可以进行“主唱分离(抽出)”。
这里不讲解得过于详细,“人的声音”有一种叫做“调和性”的东西,为了计算这个“调和性”,用了叫做 CVS-HA(Complex Vector Space Harmonic Analysis - 复杂向量空间震动解析)的方法。这个是着眼于在高速傅里叶变换的输出结果的,从前不太重视的“位相成分(phase)”的手法。
通过这个方法,可以比较好的从带有人声的立体声音乐里,提取“人声(V
)”和“除人声以外的声音(X
)”。
在 BEATWIZ 里,这个把“人声(V
)”和“除人声以外的声音(X
)”分离的系统,也就是“主唱分离滤波器”,我们叫做“VX Splitter”,上图就是执行画面。
VX Splitter 可以实时的分离带有人声的乐曲的”人声(V
)“和”“除人声以外的声音(X
)”。
上图是一首叫做“Pass”的带有人声的立体声歌曲的源波形,“V
”就是分离出来的人声,“X
”则是除此之外的其他声音。
一般的带有人声的立体声歌曲,人声部分定位在中央的情况比较多,要消去人声部分需要从左声道到右声道进行除算,也就是所谓的“L-R 法
”。
用这个方法可以“消去人声”,但是不能“保留人声”。
并且“剩下的成分”会变成单声道信号。
但是使用 VX Splitter 的话,可以单独获取“人声(V
)”成分,并且 V
和 X
两边都是立体声信号。
然后,VX Splitter 可以实时的对“人声(V
)”占全体声音的比率进行计算。
上图是 VX Splitter 在某一个瞬间的执行状态,在这个瞬间“人声(V
)”占全体声音的比率为 77.46%
。
分析音高的方法(AMDF 法)
在前面一章我们说明了关于可以使用 VX Splitter 来分离“人声”。
要计算分离出来的“人声”的音高,则需要使用和“高速傅里叶变换(FFT)”完全不一样原理的“AMDF 方法(Average Magnitude Difference Function)”
在这之前,我们先来考虑一下人声的声域到底是个什么范围。
一般人在说话的时候,男声在 120~200Hz
,女声则在 200~300Hz
的范围。
而在唱歌的时候,一般人的音域在 2
个八度音阶,可以参考下表。
所以一般人的情况下,只需要测定 80Hz~1000Hz
,专业的歌手的话,也可以发出 80Hz
以下或者 1000Hz
以上的声音。
熟练掌握假声的话,还可以用更高的频率唱歌。
所以最终,人声的测定范围我们使用了 65Hz(C2)~4kHz(B7)
。
在这里,简单说明一下测定音高所使用的 AMDF 方法。
这是我发出“yi”声的时候的波形,用红色的圈圈住的比较有特征的波形大概每 7.5ms
出现一次。
这个 7.5ms
换算成频率 1 秒/0.0075 秒=133.33Hz
。
这个就是“基本频率”。
133.33Hz
和 C3(131.41Hz
)比较接近,因此可以判定这个声音的音高为 C3(do)。
这个“基本频率”通过 AMDF 方法来推导的方法大概就是以下的步骤。
- 将同一个波形堆积到 2 个缓冲器(Buffer)里。
- 将其中一个缓冲器里的波形向后每移动一个样本数(Sample),然后计算一次和原本波形的差分。
- 当波形移动了一个周期之后,波形会和原本的重叠,差分的值将变得最小。
- 错开的波形的样本数量为一个周期的长度,因此使用样本频率(44.1kHz = 44100Hz)来计算周期的时间(长度),在这个例子里,红色的箭头的长度为 331 个样本数,331/44100 = 0.0075056 秒。
- 周期的倒数就是基本频率。(1/0.0075056=133.233Hz)
当然仅仅这样计算,很多时候都不能准确的计算音高,像下图这样,在计算的前后还会导入比较强的滤波器。(滤波器的详细就不再赘述)
像这样,通过分离“带有人声的乐曲”的“人声”,然后最终得出了乐曲的主旋律。
将这个和乐谱绘图工具向结合之后,就做到了“仅仅输入一首带有人声的乐曲”,就能如下图所示实时的输出主旋律的乐谱了。
这个通过带有人声的歌曲来输出主旋律部分的乐谱的工具,就是 BEATWIZ 里实装的“乐谱绘制引擎”,我们称之为”eMUTE(Emotional MUsic Transcription Engine)“
下回预告
现在我们的 BEATWIZ 终于可以输出“歌曲的主旋律的乐谱”了。
不过经过不断的研究,发现还是有很多乐曲没办法很好的进行解析。
所以在最后的第 4 话里,我会对关于
在 CEDEC2020 演讲过的“使用了 Constant-Q 变换的和音解析”,以及利用了 Constant-Q 变换的更高精度的“乐句解析”以及“主旋律乐谱的输出”,进行解说。
请大家期待。
关于 eMUTE(乐谱绘制引擎)的滤波器,以及基于 AMDF 方法的音高识别技术的详细,
暂无关于此文章的评论。