我正在寻找改变声音文件的速度,但不知道如何完成它。我假设在减慢速度的情况下必须进行某种类型的插值,但我不确定如何实现加速 - 也许是几个样本的平均值?是否改变节奏或音高目前并不重要,我想学习如何完成两者,但想至少完成一个或另一个开始。
如果有人对这些类型的操作背后的数学有任何参考,他们将不胜感激!
谢谢,本
我正在寻找改变声音文件的速度,但不知道如何完成它。我假设在减慢速度的情况下必须进行某种类型的插值,但我不确定如何实现加速 - 也许是几个样本的平均值?是否改变节奏或音高目前并不重要,我想学习如何完成两者,但想至少完成一个或另一个开始。
如果有人对这些类型的操作背后的数学有任何参考,他们将不胜感激!
谢谢,本
有两个选项可以加快声音文件的播放:
在这两种方法中,播放速度的提高都会使声音的音高发生相应的变化。
提高采样率
增加采样率将提高声音的播放速度。例如,从 22 KHz 采样率到 44 KHz 将使播放声音比原来快两倍。在这种方法中,原始采样数据没有改变——只需要改变音频播放设置。
减少单位时间的样本数
在这种方法中,播放采样率保持不变,但样本数量减少了——一些样本被丢弃了。
使声音的播放速度为原始速度的两倍的天真方法是删除每隔一个样本,并以原始播放采样率进行播放。
但是,使用这种方法会丢失一些信息,并且我预计会在音频中引入一些伪影,因此这不是最理想的方法。
虽然我自己没有尝试过,但平均样本以创建新样本的想法是一个很好的开始方法。这似乎意味着不仅可以丢弃音频信息,还可以通过平均过程在一定程度上“保留”它。
作为该过程的粗略想法,这里有一段伪代码可以使播放速度加倍:
original_samples = [0, 0.1, 0.2, 0.3, 0.4, 0.5]
def faster(samples):
new_samples = []
for i = 0 to samples.length:
if i is even:
new_samples.add(0.5 * (samples[i] + samples[i+1]))
return new_samples
faster_samples = faster(original_samples)
我还发布了对“程序化音频入门”问题的回答,其中我详细介绍了一些可以执行的基本音频操作,所以也许这也很有趣。
维基百科上有一个关于采样率转换的很好的解释。基本上,您将信号转换为两个采样率的最小公倍数,过滤掉任何不适合目标采样率(或不是来自源)的频率,并以目标采样率挑选新样本。有一些数学技巧可以使计算占用的资源大大减少(多相分解),但这应该可以帮助您入门。