python - 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 倍。所以你应该应用音高跟踪来确保真实的结果。
推荐阅读
- python - 如何并行化程序以在 python 中读取和写入大文件?
- graphql - 如何给类型起别名(例如字符串、整数...)
- angular - 使用时间戳字段的 Angular Firestore 问题
- python - 如何使用 Python 将 PDF 转换为干净的 HTML
- angular - Angular 组件没有被渲染
- java - 如何使用递归java创建二维数组非重复数字
- google-sheets - 导入特定于站点的数据
- swift - 使用 UIView.Animate 的简单动画
- angular - Angular中数据模型的结构引用。不一样的逻辑
- python - Pandas .sum() 拒绝正确汇总列