Python 使用 Windows 进行音调转换



我正在尝试在Python中创建一种自动调谐/音高校正算法。我能够检测每个矩形窗口大小的音高,并尝试将每个窗口(大小为 512(的音高移动 2 个半音,以测试这种方法是否真的有效。但是,这样做会在返回的音频中创建大量反馈。我认为这是由于存在矩形窗口,而不是汉宁窗口。我的问题是,如何在删除反馈的同时对箱子实施音高校正?

法典:

import librosa
import librosa.display
import numpy as np
import matplotlib.pyplot as plt
import IPython.display as ipd
import random
samples, sr = librosa.load('my_raw_vocals.wav',sr=None)
def manipulate(data, sampling_rate, pitch_factor):
return librosa.effects.pitch_shift(data, sampling_rate, pitch_factor)
def block(array, size):
c = []
array = list(array)
for i in range(0,len(array) // size):
frames = array[i*size:i*size+size]
np_frames = np.asarray(frames)
c.append(np_frames)
perc_remainder = (len(array) / size) - (len(array) // size)
if perc_remainder != 0:
n_remainder = perc_remainder * size
remainders = np.asarray(array[-1 * int(n_remainder):])
c.append(remainders)
return c
block512 = block(samples,512)
summation = []
rate = 2
for i in block512:
altered_frame = manipulate(i,sr,r)
summation.append(altered_frame)
frame_pitched512 = np.ndarray.flatten(np.asarray(summation))
frame_pitched512 = [val for sublist in summation for val in sublist]
frame_pitched512 = np.asarray(frame_pitched512)
ipd.Audio(frame_pitched512, rate=sr)

实际的音频和代码在这里:

https://colab.research.google.com/drive/1cpRhPpvXY_9XZidjOLKk_wW15EnkqLEX?usp=sharing

关于整个代码,我应该注意到一些事情:

1-汉明窗是声音处理中更好的选择,矩形窗无疑是最差的。

2-应该有一个规范化array/max(abs(array))以获得可接受的答案

3-您应该对语音应用预加重(仅用于语音(

4-另一个重要的事情是使用强大的音高检测,可以通过多种方式实现,如下所示:

奇怪的是,每帧的音高变化超过 30%,因此这些太大或太大的音高实际上是实际音高的 2 倍或 0.5 倍。因此,您应该应用音高跟踪以确保真实的结果。

最新更新