【CRIWARE】BEATWIZ功能解说故事 第三话:听我的歌声

发表于2020-12-18
评论0 4.5k浏览

之前有提到,将输入的乐曲根据“符合作曲家意图的MBT单位”进行重新解析,从而获得了在这之前没办法通过直观感受来获取的定量的信息。

 

这次,我们会关于技术的进一步发展,

把“带有人声的曲子”的“人声”的部分和“其他的部分”进行“主唱分离”的话题,

以及使用分离的“主唱成分”来生成“主旋律的乐谱”的话题。

qNX3qy38qsbrvWfTejyH.png

?从带有人声的乐曲,几乎实时的将主旋律的乐谱调取出来的DEMO。
首先将主唱分离之后进行音程解析之后生成乐谱。

 

 

 

 

 

 

 

 

听我的歌声

现在新冠流行,虽然可能减少了,在大城市里一定会有人声,车声,电车声等各种大量的杂音。

大家在城市的嘈杂声中,是不是会有下面的经历?

 

1. 在嘈杂的环境中,呼叫自己的声音能够切实的听见

2. 在噪音中,人声的人声部分能够单独的听出来

3. 在车内,打电话的声音非常的令人烦躁

 

像这样,“人的声音”非常的特别,不能简单的作为一种声音来考虑。

因此我假定存在一种和“人的声音”一样,对于人的耳朵来说更容易和“周围”的声音区别开来的这么一种声音,通过将这个概念量化,是不是就可以进行“主唱分离(抽出)”。

 

这里不讲解得过于详细,“人的声音”有一种叫做“调和性”的东西,为了计算这个“调和性”,用了叫做CVS-HA(Complex Vector Space Harmonic Analysis)(复杂向量空间震动解析)的方法。这个是着眼于在高速傅里叶变换的输出结果的,从前不太重视的“位相成分(phase)”的手法。

 

通过这个方法,可以比较好的从带有人声的立体声音乐里,提取“人声(V)”和“除人声以外的声音(X)”。

ZBEbadHkotarWj0f2b85.png

在BEATWIZ里,这个把“人声(V)”和“除人声以外的声音(X)”分离的系统,也就是“主唱分离滤波器”,我们叫做“VX Splitter”,上图就是执行画面。

YutQzHNlJn6F4eWYmtjB.png

VX Splitter可以实时的分离带有人声的乐曲的”人声(V)“和”“除人声以外的声音(X)”。

上图是一首叫做“Pass”的带有人声的立体声歌曲的源波形,“V”就是分离出来的人声,“X”则是除此之外的其他声音。

 

一般的带有人声的立体声歌曲,人声部分定位在中央的情况比较多,要消去人声部分需要从左声道到右声道进行除算,也就是所谓的“L-R法”。

用这个方法可以“消去人声”,但是不能“保留人声”。

 

并且“剩下的成分”会变成单声道信号。

 

但是使用VX Splitter的话,可以单独获取“人声(V)”成分,并且V和X两边都是立体声信号。

QvH2bWX1yIXpdPnINnqM.png

然后,VX Splitter可以实时的对“人声(V)”占全体声音的比率进行计算。

上图是VX Splitter在某一个瞬间的执行状态,在这个瞬间“人声(V)”占全体声音的比率为77.46%。

 

分析音高的方法(AMDF法)

在前面一章我们说明了关于可以使用VX Splitter来分离“人声”。

要计算分离出来的“人声”的音高,则需要使用和“高速傅里叶变换(FFT)”完全不一样原理的“AMDF方法(Average Magnitude Difference Function)”

 

在这之前,我们先来考虑一下人声的声域到底是个什么范围。

一般人在说话的时候,男声在120~200Hz,女声则在200~300Hz的范围。

而在唱歌的时候,一般人的音域在2个八度音阶,可以参考下表。

f4cSjmwd1qhRu1CxKrko.png

(括号里指的是音阶名称(国际式))

所以一般人的情况下,只需要测定80Hz~1000Hz,专业的歌手的话,也可以发出80Hz以下或者1000Hz以上的声音。

熟练掌握假声的话,还可以用更高的频率唱歌。

所以最终,人声的测定范围我们使用了65Hz(C2)~4kHz(B7)。

在这里,简单说明一下测定音高所使用的AMDF方法。

51QNs5dA96mQ7VGxZtaX.png

 

这是我发出“yi”声的时候的波形,用红色的圈圈住的比较有特征的波形大概每7.5ms出现一次。

这个7.5ms换算成频率1秒/0.0075秒=133.33Hz。

这个就是“基本频率”。

133.33Hz'和C3(131.41Hz)比较接近,因此可以判定这个声音的音高为C3(do)。

12IRuWvmy7ai006nqUWE.png

这个“基本频率”通过AMDF方法来推导的方法大概就是以下的步骤。

 

1. 将同一个波形堆积到2个缓冲器(Buffer)里。

2. 将其中一个缓冲器里的波形向后每移动一个样本数(Sample),然后计算一次和原本波形的差分。

3. 当波形移动了一个周期之后,波形会和原本的重叠,差分的值将变得最小。

4. 错开的波形的样本数量为一个周期的长度,因此使用样本频率(44.1kHz = 44100Hz)来计算周期的时间(长度),在这个例子里,红色的箭头的长度为331个样本数,331/44100 = 0.0075056秒。

5. 周期的倒数就是基本频率。(1/0.0075056=133.233Hz)

 

当然仅仅这样计算,很多时候都不能准确的计算音高,像下图这样,在计算的前后还会导入比较强的滤波器。(滤波器的详细就不再赘述)

RccnApxf2Rz1vFE3wHvj.png

 

像这样,通过分离“带有人声的乐曲”的“人声”,然后最终得出了乐曲的主旋律。

将这个和乐谱绘图工具向结合之后,就做到了“仅仅输入一首带有人声的乐曲”,就能如下图所示实时的输出主旋律的乐谱了。

aGvPTQFIiaZi8HAbOlCz.png

这个通过带有人声的歌曲来输出主旋律部分的乐谱的工具,就是BEATWIZ里实装的“乐谱绘制引擎”,我们称之为”eMUTE(Emotional MUsic Transcription Engine)“

 

下回预告

现在我们的BEATWIZ终于可以输出“歌曲的主旋律的乐谱”了。

不过经过不断的研究,发现还是有很多乐曲没办法很好的进行解析。

所以在最后的第4话里,我会对关于

在CEDEC2020演讲过的“使用了Constant-Q变换的和音解析”,以及利用了Constant-Q变换的更高精度的“乐句解析”以及“主旋律乐谱的输出”,进行解说。

请大家期待。

 

关于eMUTE(乐谱绘制引擎)的滤波器,以及基于AMDF方法的音高识别技术的详细,

可以参考CEDiL(CEDEC Digital Library)

 

  • 允许他人重新传播作品,但他人重新传播时必须在所使用作品的正文开头的显著位置,注明用户的姓名、来源及其采用的知识共享协议,并与该作品在磨坊上的原发地址建立链接
  • 可对作品重新编排、修改、节选或者以作品为基础进行创作和发布
  • 不可将作品进行商业性使用
  • 需在以作品基础上创作的演绎作品上适用相同类型的知识共享许可条款

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引