我将如何使用 Python 推销 wav 文件

How would I pitch a wav-file using Python

所以我目前正在尝试在不加速的情况下投放 wav 文件。 我正在使用 Scipy 和 Numpy 来获取 Wave 文件的原始数据,并尝试通过向原始数据添加 +2 左右来调整它,我在创建新文件后收到的是一个完全混乱的 Wave -文件。

这是我现在得到的:

from scipy.io.wavfile import read as wavr
from scipy.io.wavfile import write as wavw
import numpy as np




rate, data = wavr('hit.wav')    

idk = data[:]

R = []
L = []

for thing in idk:
    old1 = thing[0]  + 2.0
    old2 = thing[1]  + 2.0
    R.append(old1)
    L.append(old2)
    print(len(L))
    print(len(R))

Right= np.array(R)
Left= np.array(L) 
help = np.column_stack((Right,Left))    

print(rate)


wavw("copied.wav",44100,help)

也许我目前的尝试在任何情况下都是错误的,如果可以的话,你们能告诉我该怎么做才能实现我的目标吗

亲爱的,你麻烦大了(我去过)

首先,我认为所有的 wav 文件都使用不超过特定阈值的浮点数,比如值介于 -1 和 1 之间。因此,当您将 "just +2" 添加到您的文件时,你实际上让一切都饱和了。

那么,你对乐理的理解有误。你可能知道声音是一种波。更准确地说,当您录制 440Hz 音符(音乐家用来调整乐器的 A4 音符)时,您得到的是每秒振荡 440 次的正弦波 (like this one)。更重要的是,它可以以 0 为中心,也可以不以 0 为中心,但声音不会有任何不同(这意味着向波形添加或删除常数是没有意义的;您唯一可能做的就是使信号饱和)。

因此,要改变声音的音调,您必须修改它的 频率:它每秒振动的次数。在音乐中,这称为 vocoder。它背后的理论已经非常核心了;它来自一个名为 信号处理 的科学领域。更准确地说,(相位)声码器使用:

  • 傅里叶变换(this tutorial seems quite cool, otherwise Wikipedia,但它是面向数学的)。 给定一个声音样本,傅里叶变换给出它包含的频率(一点点 A4,很多 C3,等等)。 (更准确地说,您需要针对此特定问题进行短时傅立叶变换);
  • overlap-add algorithm,用于对文件的块进行傅立叶变换,修改每个块的音高,然后将所有块粘贴回一起。这是我完全失败的地方(我一直在尝试编写声码器两次)。

我可以继续讲下去,但我猜你明白了:任何触及声音频率(如音高)的东西都充满了沉重的数学。信号处理是一个非常有趣的领域,但很难深入研究。如果你的数学能力足够好,你可以看看网上的一些课程,这里 Stanford's. If you just want to play around with music and code, use existing tools, not raw data (I think of Processing, or existing python libraries).

如果您想更轻松地练习处理 wav 文件,请尝试修改音量或速度(但请注意它会修改音高)。对于音量,您必须 乘以 (而不是添加)文件的每个样本的常数。对于速度,您可以从两个样本中删除一个样本以使音频快两倍,或者增加波阵列的大小,并找到一个很好的解决方案,在每个现有样本之间放置一个相关样本(零?前一个样本?试试出东西!)。

祝你好运!