带音色控制的JS音调转换

时间:2018-11-25 13:22:41

标签: javascript web-audio pitch-shifting

我需要一个很好的音调转换解决方案来更改我的项目的声音。周围有很多变调js库-尝试了所有,但它们没有提供理想的结果。最主要的是无法控制结果的声音音色,我得到了米老鼠或地狱僵尸听起来的东西,但没有真正的声音。而在这里,如果用vega的声音进行测试,结果将非常出色:http://www.sonicapi.com/docs/live-task-demo?task=process-elastiqueTune#demo_form 不幸的是,我对音频处理的总评价为零,并且至少想知道它是如何完成的,这里使用了哪种类型的移位算法,以及我们如何实现对音色/共振峰的控制。任何提示高度赞赏。谢谢;)

1 个答案:

答案 0 :(得分:1)

这个问题涉及一个非常广泛的主题。这里有一些指针。

通常,可以通过抵消形成声音材料的频率来改变音高。一个简单的版本是在时域中重新采样,本质上是以不同的速度回放记录。这自然也会导致速度变化,这通常是不希望的。

为了保留速度,您需要将素材“分解”为其组成部分,换句话说,将时域从频域更改为频域。这就是Fourier Transform的目的。完成后,您就可以估算出每个样本的频率集(如果在复杂的空间中正确完成,还可以包含相应的相位)。

语音的感知音色取决于称为overtones的频率集的相对振幅。说话者的声道和听者都会形成泛音,并与基本频率一起听到。您可以在时域,频谱中使用不同的滤波器来控制音色 (频率)域或cepstral域。这种信号处理是一个充满书籍的图书馆部分的主题。

您可以使用傅立叶逆变换从频谱(频率)域移回到时间(时间)域。

总而言之,要改变音调的朴素方法,您需要将样本从时域转换到频谱域,沿时间轴重新采样,然后进行傅立叶逆变换以返回到时域。

除了傅里叶变换之外,您还可以使用wavelets。我希望这可以帮助您入门。