我如何使用Python调整wav文件

时间:2016-12-05 17:26:52

标签: python numpy scipy wav

所以我目前正试图在没有加速的情况下推销wav-File。 我正在使用Scipy和Numpy来获取Wave文件的原始数据,并尝试在原始数据中添加+2左右,我在创建新文件后收到的是一个完全混乱的Wave-File。

以下是我现在所得到的:

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)

也许我目前的尝试在任何情况下都是假的,如果是这样,你们可以告诉我该怎么做以实现我的目标

1 个答案:

答案 0 :(得分:3)

亲爱的,你遇到了大麻烦(我已经去过那里)。

首先,我认为所有的wav文件都使用了不会超过某个阈值的浮点数,比如值介于-1和1之间。所以,当你添加&#34时,只需+ 2&#34 ;在你的文件中,你实际上是在使一切都饱和。

然后,你有一些关于音乐理论的错误。你可能知道声音是波浪。更准确地说,当你录制440Hz音符(音乐家用来调音乐器的A4音符)时,你得到的是正弦波(like this one)每秒振荡440次。更重要的是,它可以以0为中心,但声音不会有任何不同(这意味着在波浪中增加或删除一个常数是没有意义的;你唯一能做的就是让它饱和信号)。

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

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

我可以继续玩下去,但我想你明白了这一点:任何接触声音频率的东西(比如音调)都充满了沉重的数学。信号处理是一个非常有趣的领域,但很难深入研究它。如果你有足够的数学技能,你可以在网上查看一些课程Stanford's。如果您只是想使用音乐和代码,请使用现有工具,而不是原始数据(我想到Processing或existing python libraries)。

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

祝你好运!