可能已经有这个问题的答案,或类似的问题,但找不到我要找的东西;我正在寻找的概念在概念上很简单;
我有一个吉他音符(E2 或空 E 弦)的 wav 文件,并希望根据半音的增加来提高其音高。例如:向上 5 个半音将是空 A 弦或 A2。使用 python,我假设必须有一个库可以做到这一点,但到目前为止我无法弄清楚如何在不缩短文件的情况下提高
E2.wav
文件的音调;音符移动/音调越高,相应的声音就越短。
我使用的是一个软件包,但我看到人们在谈论
librosa
。我没有脚本作为代码示例发布,因为我想将其重写为更简单的函数。目标是能够有一个函数,无论音符移动到什么音高,都可以输出 .wav
秒长度的 x
。
对于看起来像
[0,5,10,15,20,24]
的音符序列,我们每 .wav
秒就会得到 5 个 x
,长度对应于 E2, A2, D2, G2, B2, E3
(基于这个答案)
Librosa 显然存在一些边界问题,但还算有效
import librosa.effects
import matplotlib.pyplot as plt
import numpy as np
test_signal = np.sin(2 * np.pi * 10 * np.linspace(0, 1, 16000, endpoint=False))
test_signal_pitch_shifted = librosa.effects.pitch_shift(test_signal, sr=16000, n_steps=4)
fig, axes = plt.subplots(2)
axes[0].plot(test_signal)
axes[0].plot(test_signal_pitch_shifted)
axes[1].plot(np.abs(np.fft.fft(test_signal)))
axes[1].plot(np.abs(np.fft.fft(test_signal_pitch_shifted)))
plt.show()
(由于某些原因我无法添加图片,一些服务器错误,稍后会尝试)