首页 > 解决方案 > 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

标签: pythonarraysnumpyaudiolibrosa

解决方案


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

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

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

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

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

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


推荐阅读