【问题标题】:Python: how to insert gaps of silence to generated .wav file?Python:如何在生成的 .wav 文件中插入静音间隙?
【发布时间】: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()

找出解决方案不仅可以使该脚本正常工作,而且可以帮助我弄清楚下一阶段:如何获得源中连续帧的平均幅度并过滤掉任何不符合特定阈值的帧(即过滤掉太安静的块)。

【问题讨论】:

    标签: python audio


    【解决方案1】:

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

    【讨论】:

    • 正是这个。做ord("0") 自己看看——“0”作为一个字符串是序数 48,这就是导致你的波振幅恒定的原因。
    • 感谢您的快速回答!所以我尝试将静音更改为 '\x00' 并且输出仍然是那些该死的矩形!我在这里错过了什么?
    猜你喜欢
    • 2011-12-12
    • 1970-01-01
    • 2014-12-16
    • 2020-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-27
    • 1970-01-01
    相关资源
    最近更新 更多