Python改变wav文件的音调

新手上路,请多包涵

我需要任何 python 库来更改我的 wav 文件的音调,而无需任何原始音频数据处理。我花了几个小时找到它,但只找到了一些奇怪的原始数据处理代码片段和视频,显示实时音高变化,但没有源代码。

原文由 Daniel 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1k
1 个回答

由于 wav 文件基本上 原始音频数据,如果 _没有_“原始音频处理”,您将无法更改音调。

这是你可以做的。您将需要 wave (标准库)和 numpy 模块。

 import wave
import numpy as np

打开文件。

 wr = wave.open('input.wav', 'r')
# Set the parameters for the output file.
par = list(wr.getparams())
par[3] = 0  # The number of samples will be set by writeframes.
par = tuple(par)
ww = wave.open('pitch1.wav', 'w')
ww.setparams(par)

声音应该在几分之一秒内处理。这减少了混响。尝试将 fr 设置为 1;你会听到恼人的回声。

 fr = 20
sz = wr.getframerate()//fr  # Read and process 1/fr second at a time.
# A larger number for fr means less reverb.
c = int(wr.getnframes()/sz)  # count of the whole file
shift = 100//fr  # shifting 100 Hz
for num in range(c):

读取数据,将其拆分为左右声道(假设是立体声 WAV 文件)。

     da = np.fromstring(wr.readframes(sz), dtype=np.int16)
    left, right = da[0::2], da[1::2]  # left and right channel

使用 numpy 中内置的快速傅里叶变换提取频率。

     lf, rf = np.fft.rfft(left), np.fft.rfft(right)

滚动阵列以增加间距。

     lf, rf = np.roll(lf, shift), np.roll(rf, shift)

最高频率滚动到最低频率。那不是我们想要的,所以将它们归零。

     lf[0:shift], rf[0:shift] = 0, 0

现在使用傅里叶逆变换将信号转换回振幅。

     nl, nr = np.fft.irfft(lf), np.fft.irfft(rf)

合并两个通道。

     ns = np.column_stack((nl, nr)).ravel().astype(np.int16)

写入输出数据。

     ww.writeframes(ns.tostring())

处理完所有帧后关闭文件。

 wr.close()
ww.close()

原文由 Roland Smith 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题