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

作者:CRIWARE游戏音频视频中间件
2020-12-08
1 0 0

大家好,我是 CRIWARE 的增野。

在先前的文章中:
第一话是关于“打节拍的秘密”,
第二话是关于“乐曲的热闹程度以及乐句解析”,

我们对 BEATWIZ 做了简单的介绍。

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

这次,我们会关于技术的进一步发展,
把“带有人声的曲子”的“人声”的部分和“其他的部分”进行“主唱分离”的话题,
以及使用分离的“主唱成分”来生成“主旋律的乐谱”的话题。

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

听我的歌声

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

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

  1.  在嘈杂的环境中,呼叫自己的声音能够切实的听见
  2.  在噪音中,人声的人声部分能够单独的听出来
  3.  在车内,打电话的声音非常的令人烦躁

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

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


这里不讲解得过于详细,“人的声音”有一种叫做“调和性”的东西,为了计算这个“调和性”,用了叫做 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)”成分,并且 VX 两边都是立体声信号。

然后,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 方法来推导的方法大概就是以下的步骤。

  1. 将同一个波形堆积到 2 个缓冲器(Buffer)里。
  2. 将其中一个缓冲器里的波形向后每移动一个样本数(Sample),然后计算一次和原本波形的差分。
  3. 当波形移动了一个周期之后,波形会和原本的重叠,差分的值将变得最小。
  4. 错开的波形的样本数量为一个周期的长度,因此使用样本频率(44.1kHz = 44100Hz)来计算周期的时间(长度),在这个例子里,红色的箭头的长度为 331 个样本数,331/44100 = 0.0075056 秒。
  5. 周期的倒数就是基本频率。(1/0.0075056=133.233Hz)


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

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

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

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

下回预告

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

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

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

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

请大家期待。


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

可以参考 CEDiL(CEDEC Digital Library)

本文为用户投稿,不代表 indienova 观点。

近期点赞的会员

 分享这篇文章

CRIWARE游戏音频视频中间件 

CRIWARE的Indienova专栏,介绍CRIWARE的使用及项目案例 

您可能还会对这些文章感兴趣

参与此文章的讨论

暂无关于此文章的评论。

您需要登录或者注册后才能发表评论

登录/注册