[英]Python pitch shifting with Windows
我正在嘗試在 Python 中創建一種自動調諧/音高校正算法。 我能夠檢測每個矩形 window 大小的音高,並嘗試將每個 window(大小為 512)的音高移動 2 個半音,以測試這種方法是否真的有效。 但是,這樣做會在返回的音頻中產生大量反饋。 我認為這是由於存在矩形 window,而不是漢寧 window。 我的問題是,如何在消除反饋的同時對箱進行音高校正?
代碼:
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- Hamming window 在聲音處理方面是更好的選擇,而矩形 windows 無疑是最差的。
2- 應該有一個歸一化array/max(abs(array))
以便獲得可接受的答案
3-您應該對語音應用預加重(僅用於語音)
4- 另一個重要的事情是使用魯棒的音高檢測,它可以通過多種方式實現,如下所示:
奇怪的是,每幀間距變化超過 30%,因此這些太大或太大的間距實際上是實際間距的 2 倍或 0.5 倍。 所以你應該應用音高跟蹤來確保真實的結果。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.