【问题标题】:How to adjust pitch using python wave module如何使用 python wave 模块调整音高
【发布时间】:2020-06-29 20:32:30
【问题描述】:

所以我使用 python wave 模块帧速率方法更改了 output.wav 文件的播放速度,并将先前的帧速率乘以 2,但我想保持新 output.wav 的音高相同,因为它听起来很高沥青。怎么做?这是我用于读取和写入 output.wav 的代码的 sn-p。我正在寻找简单的解决方案,尽量避免下载外部库。好的,波库。

谢谢。

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

【问题讨论】:

  • 真的没有不使用其他库的简单解决方案,除非您认为自己进行数字信号处理很简单。如果可以的话,我建议按照answer 使用橡皮筋。

标签: python audio wav wave pitch


【解决方案1】:

我写了here的音高检测功能,但至少需要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

【讨论】:

  • 如何将您的代码放在答案中以及原始链接中
猜你喜欢
  • 1970-01-01
  • 2012-04-09
  • 2016-10-04
  • 1970-01-01
  • 1970-01-01
  • 2017-04-08
  • 1970-01-01
  • 2022-01-13
  • 1970-01-01
相关资源
最近更新 更多