[英]How to adjust pitch using python wave module
所以我使用 python 波形模块帧率方法更改了 output.wav 文件的播放速度并将以前的帧率乘以 2,但我想保持新 output.wav 的音高相同,因为它听起来很高。 怎么做? 这是我用于读取和写入 output.wav 的代码片段。 我正在寻找简单的解决方案,试图避免下载外部库。 好的波库。
谢谢。
import wave
wf = wave.open('output.wav', 'rb')
RATE = wf.getframerate()
signal = wf.readframes(-1)
channels = wf.getnchannels()
width = wf.getsampwidth()
wf.close()
spf = wave.open('output.wav', 'wb')
spf.setnchannels(channels)
spf.setsampwidth(width)
spf.setframerate(RATE*2)
spf.writeframes(signal)
spf.close()
我在这里编写了音高检测功能,但至少需要numpy
,我认为您应该对其进行一些更改。 它不太依赖那个库。 只是为了更快的结果。
这里有代码,你可以看到这个函数不会移动窗口的大小,而是移动一些重叠的窗口。 你应该调整这些特定的代码。 有一些numpy
模块的用法,我可以很容易地更改它,但我把它留给你。
信号处理中有很多规则,我已经实现了一些。 例如,如果一帧的能量不够,它就没有音高,它通过发送 -1 而不是音高来显示。
import numpy as np
def pitch_detection(self, frame_matrix, frame_number, lag_vector, frequency):
np.seterr(divide='ignore', invalid='ignore')
pitch_freq_vector = []
for frame in range(frame_number):
ccf = []
frame_expand_1 = frame_matrix[frame-1, :]
frame_expand_2 = frame_matrix[frame-2, :]
temp_corr_1 = frame_matrix[frame, :]
temp_corr_2 = np.append(frame_expand_1[256:], temp_corr_1, axis=0)
temp_corr_2 = np.append(frame_expand_2[192:256], temp_corr_2, axis=0)
len_tc2 = len(temp_corr_2)
for lag in lag_vector: #pitch is the highest correlation in lag vector
ccf.append(np.sum(temp_corr_1*temp_corr_2[len_tc2-lag-512:len_tc2-lag]))
max_index, max_value = max(enumerate(ccf), key=operator.itemgetter(1))
if max(ccf) > 0.3*np.sum(np.power(temp_corr_1, 2)): #if more than 30 detect pitch
pitch_freq_vector.append(max_index)
else:
pitch_freq_vector.append(-1)
return pitch_freq_vector
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.