python - 如何正确使用 pitch_shift (librosa)?
问题描述
我尝试使用 librosa 中的 librosa 和 pitch_shift。我录制了一些声音并使用了以下代码:
sampling_rate= 44100
y, sr = librosa.load(directory, sr=sampling_rate) # y is a numpy array of the wav file, sr = sample rate
y_shifted = librosa.effects.pitch_shift(y, sr, n_steps=4, bins_per_octave=24) # shifted by 4 half steps
librosa.output.write_wav(directory, y_shifted, sr=sampling_rate, norm=False)
它工作正常 - 几乎。
我在我的新声音中听到一些噪音(在 pitch_shifting 之后)
有什么我需要使用的吗?
无班次:
https://vocaroo.com/i/s1qEEDvzcUHN
随着班次(n_steps = 4):
解决方案
音高移位通常涉及STFT,移位通常是沿频率轴的幅度谱,然后通过Griffin-Lim算法进行信号重建(关于 Griffin-Lim 工作原理的Quora 解释)。
问题是,当我们改变幅度谱时,我们就是这么做的——而忽略了相位!Griffin-Lim 在重构时域信号时试图找到一个合理的解决方案来找到正确的相位,但往往只是:一个合理的解决方案,而不是一个完美的解决方案。这就是为什么你会听到这种金属音。那是您的信号相位不太正确(也称为“相位”)。
我相信您的函数调用librosa
完全没问题。它可能不是地球上最伟大的实现。试试PyRubberband 。它基于Rubberband(一个 C++ 库)并享有良好的声誉。
推荐阅读
- matrix-synapse - 将 Intranet 中的 Matrix Synapse 服务器与 Internet 中的服务器桥接/克隆
- google-chrome - 如何在 VueJS 中使用 chrome 断点调试工具?
- java - 为什么我的 ArrayList 项目在消失时不会自行移除?
- asp.net - asp.net 用户成功登录后未通过身份验证并重定向到主页
- python - Flask 无法从目录中检索随机图片
- selenium - 例外:NoSuchElement 没有这样的元素
- angular - Angular Recursive HTTP Request 导致无限循环
- sql-server - 一列的输出只有两个十进制数字?
- python - Neo4j 密码查询以删除特定节点的子节点和孙节点
- postgresql - docker kong 错误获取与 postgres 的连接