Python:如何在生成的.wav文件中插入静音间隙?

时间:2014-01-09 22:42:10

标签: python audio

我正在编写一个简单的脚本,从源音频文件中生成随机“毛刺”。它读取源音频文件的随机块并将该块写入新的.wav文件,然后是静音间隙,接着是不同的块,然后是静音等。

我尝试阅读.wav格式以了解“沉默”是什么,但大多数都是在我脑海中。似乎沉默似乎是(十六进制?)值为0。我制作了一个纯粹的沉默文件进行分析,在记事本中,沉默表示为空格,而在崇高的文本中,它是一堆0。所以我的方法是采用静音字符(“或”或“0”),将它与源音频的帧数相乘(因此它会自动校正不同的可能.wav属性,单声道立体声等),以及然后乘以那个想要差距的沉默帧数。一切都很好,除了我正在写的东西,因为沉默不可避免地写成某个值,虽然一致,但确实有振幅,因此在波浪中显示如下:

Waveform

并且在十六进制编辑器中,差距总是一些重复模式,如30303030303030等。我显然做错了什么或误解了.wav数据的性质,但我无法弄明白。以下是代码的基本精简版本:

import sys
import wave

script, filename = sys.argv

sourceFile = wave.open(filename, 'r')
sampleParams = sourceFile.getparams()

def randChunk(source):
    blahblah
    # Returns random chunk of audio from sourceFile


numGlitch = int(raw_input('How many glitches do you want?: '))
silenceSpace = int(raw_input('How many frames of silence between glitches?: '))

singleglitchFile = filename[:-4] + '_glitch.wav'
outfile = wave.open(singleglitchFile, 'w')
# set the outfile params to whatever sourceFile params were
outfile.setparams(sampleParams)

# WHERE EVERYTHING GOES WRONG 
silence = 0 # or " " or hex(0) or whatever the hell silence is supposed to be
frameLength = len(sourceFile.readframes(1))
emptyspace = (silence * frameLength) * silenceSpace

for n in range(numGlitch):
    outfile.writeframes(randChunk(sourceFile))
    outfile.writeframes(emptyspace)

outfile.close()

找出一个解决方案不仅可以使这个脚本工作,而且可以帮助我找出下一个阶段:如何获得源中连续帧的平均幅度,并过滤掉任何不满足某个阈值的过程(即过滤掉太安静的块。

1 个答案:

答案 0 :(得分:2)

值为0的字符为chr(0)'\x00'0是一个整数,所以乘以它会得到整数乘法的结果。 0 * anything0'\x00' * 3'\x00\x00\x00'