我想编写自己的声码器合成器,如“Songify”,但我找不到简单的声码器算法。也许您可以解释或告诉在哪里可以找到有关声码器工作原理的信息。
编程声码器
我担心这里的所有答案都与问题无关。音乐制作界所谓的声码器与信号处理中使用的相位声码器几乎没有关系。更糟糕的是,原帖引用的Songify应用并不是声码器的示例。让我们解决这个问题!
1. 相位声码器
其他答案引用的相位声码器是一种信号处理技术,可用于通过计算信号的时频表示(短期傅立叶变换)来执行信号的时间/音调修改(时间拉伸、音调移位) ,或STFT),然后插入/删除信号帧,然后保持相位信息的一致性。它与语音的关系只是历史性的,目前用于低端音频硬件/软件中的音高转换和时间拉伸。RubberBand是基于相位声码器的开源 C++ 时间/音高更改库的示例。
2. 声码器
当音乐制作领域的人提到声码器时,他们指的是一种设备,它提取一个信号的频谱包络(通常是语音,称为调制器),并过滤另一个信号(通常是丰富的合成器纹理,称为载波)带有一个滤波器,其响应是提取的频谱包络。有关生成声音的示例,请听 Kraftwerk Trans Europe Express中的 0:23或 Alan Parsons 的 Project The Raven从最初几秒开始。产生的效果是一种类似人声的音色,应用于由载波信号播放的旋律或和弦,给人一种通过合成器说出声音的感觉。
声码器最初是一个模拟设备,它是用两个组的十几个或多个高 Q 带通滤波器实现的。调制器信号通过第一个滤波器组发送,所有子带信号的幅度都被跟踪信封追随者数组。并行地,载波信号通过另一个滤波器组发送。每个子带都被放大(使用 VCA),增益由包络跟随器给出。如果您阅读模拟,您可以在这里查看声码器通道的示意图,来自 Jurgen Haible 的现场声码器- 顶部是调制器信号滤波器,底部是载波滤波器和 VCA。声码器的软件实现与此接近,仅仅是因为音乐制作人希望声码器听起来像经典的模拟设备!但是,如果您不希望对“老式”设备保真,并且想要比 40 双二阶便宜的设备,那么获得相同结果的另一种方法是估计一个全极点滤波器(8 到 20 阶,具体取决于您想要的接近程度)从调制器信号(AR-modeling)得到原始声音;然后将此过滤器应用于运营商。这里的典型问题是您需要每 20 毫秒左右更新一次滤波器系数;所以你需要一个全极点滤波器的表示,它可以很好地处理突然的系数更新。
3. 自动调谐和音高重新映射
Songify 所做的如下:提取录制声音的韵律(音高轮廓),并对其进行修改,以使生成的音高轮廓与目标旋律相匹配。这有点类似于自动调谐所做的,不同之处在于自动调谐将音高“四舍五入”到最接近音乐上准确的半音,而 Songify 只是将其推向一个目标值。
这里工作的算法与传统的音高移位时间拉伸算法非常不同,因为语音信号是单声道的,并且非常适合源滤波器模型。时域音高同步重叠相加 (TD-PSOLA) 等方法在计算和质量方面都比通用时间拉伸算法(通常使用相位声码器完成)更有效地透明地改变语音的音高)。例如,这些用于语音合成以改变合成句子的韵律 - 确实与 Songify 不同!自动调谐也基于这种时域方法(检测输入波形的完整周期并对其重新采样)。
Dan Ellis 在此页面上有一些非常好的 Matlab 示例:http ://www.ee.columbia.edu/~dpwe/resources/matlab/pvoc/
FFT bin 具有中心频率。任何处于该精确 bin 频率的正弦曲线都将具有相同的相位,参考 2 个参考点偏移恰好相隔 1 FFT 帧,或者具有可以针对相隔任意距离(可能重叠)的 2 个参考点或 2 FFT 帧计算的增量相位. 相位声码器的基本思想是将每个 FFT bin 频率稍微调整到附近的频率,以便如果 FFT bin 中心频率不匹配,则该频率的正弦曲线将匹配在 2 个偏移 FFT 帧的参考点处检测到的相位。
然后,这些调整后的频率可用于波形的粒度再合成,即使在频域或时域中缩放了原始频谱序列,也能在重新合成的帧中表现出更多的连续性。这些偏移频率也可以用于频率估计,或作为音调估计方法的一部分。通过音高估计和声音再合成,人们可能能够以一个音高获取声音,并将再合成推向听起来几乎相同的东西,除了另一个音高。
以下文章描述了基于短时傅里叶变换 (STFT) 的相位声码器,以及用于处理音频信号的时间和音高修改的音高同步重叠相加 (PSOLA) 技术:
Moulines, E. & Laroche, J.
“语音音高和时间尺度修改的非参数技术”,
语音通信,1995 年。
(一些 PDF 版本可从谷歌学者的链接中获得)