我正在编写一个简单的脚本,从源音频文件中生成随机“毛刺”。它读取源音频文件的随机块并将该块写入新的.wav文件,然后是静音间隙,接着是不同的块,然后是静音等。
我尝试阅读.wav格式以了解“沉默”是什么,但大多数都是在我脑海中。似乎沉默似乎是(十六进制?)值为0。我制作了一个纯粹的沉默文件进行分析,在记事本中,沉默表示为空格,而在崇高的文本中,它是一堆0。所以我的方法是采用静音字符(“或”或“0”),将它与源音频的帧数相乘(因此它会自动校正不同的可能.wav属性,单声道立体声等),以及然后乘以那个想要差距的沉默帧数。一切都很好,除了我正在写的东西,因为沉默不可避免地写成某个值,虽然一致,但确实有振幅,因此在波浪中显示如下:
并且在十六进制编辑器中,差距总是一些重复模式,如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()
找出一个解决方案不仅可以使这个脚本工作,而且可以帮助我找出下一个阶段:如何获得源中连续帧的平均幅度,并过滤掉任何不满足某个阈值的过程(即过滤掉太安静的块。
答案 0 :(得分:2)
值为0的字符为chr(0)
或'\x00'
。 0
是一个整数,所以乘以它会得到整数乘法的结果。 0 * anything
为0
,'\x00' * 3
为'\x00\x00\x00'
。