簡體   English   中英

Python 使用 Windows 進行音高變換

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM