【发布时间】:2014-01-09 22:42:09
【问题描述】:
我正在编写一个简单的脚本,该脚本会从源音频文件中生成随机“故障”。它读取源音频文件的一个随机块并将该块写入一个新的 .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()
找出解决方案不仅可以使该脚本正常工作,而且可以帮助我弄清楚下一阶段:如何获得源中连续帧的平均幅度并过滤掉任何不符合特定阈值的帧(即过滤掉太安静的块)。
【问题讨论】: