如何使用Python wave模块调整音高

3

我使用Python Wave模块的帧速率方法将output.wav文件的播放速度改变,并且通过将先前的帧速率乘以2,但是我想保持新的output.wav的音高不变,因为它听起来很高。如何做到?这是我读取和写入output.wav的代码片段。我正在寻找简单的解决方案,尽量避免下载外部库。Wave库可以。

谢谢。

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()


除非你认为自己的数字信号处理很简单,否则没有简单的解决方案可以不使用其他库。如果可以的话,我建议按照这个答案使用Rubber Band。 - GordonAitchJay
1个回答

1
我有一个音高检测函数在这里,但至少需要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


您可以在答案中放置您的代码以及原始链接。 - Alan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接