Python的窗口变桨

2024-04-23 14:26:33 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图用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


Tags: inimportforsizeframesratenparray
1条回答
网友
1楼 · 发布于 2024-04-23 14:26:33

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

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

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

3-你应该对演讲应用预强调(仅用于演讲)

4-另一件重要的事情是使用稳健的基音检测,可以通过以下多种方式实现:

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

相关问题 更多 >