在纯python中以间隔分割24位深度wav声音
Posted
技术标签:
【中文标题】在纯python中以间隔分割24位深度wav声音【英文标题】:splititng 24 bit depth wav sound in interval in pure python 【发布时间】:2016-11-17 12:47:02 【问题描述】:目前我正在对仅使用 Python 的波形文件进行一些小型研究。 我现在无法解决的一个问题是拆分 wav 数据。正确格式化 24 位声音深度的文件。
所以基本思路是:给定t1
-start和t2
-end,我需要得到slice
,这点很清楚了。
def split_in_interval(self, start, end):
start *= ONE_SEC_MS
end *= ONE_SEC_MS
header = self.wav_header.header_description
infile = open(self.file_name, 'rb')
rate = header['sample_rate']
frames_per_m_sec = rate // 1000
length = (end - start) * frames_per_m_sec
start_ms = start * frames_per_m_sec
name_str = self._naming_fragment(start, end)
out_file = open(name_str, 'wb')
# as the size changes - need to recalculate only last part of header,
# it takes 4 last bytes of header
out_file.write(infile.read(WAV_HEADER - 4))
size = length * header['block_align']
# header['num_channels'] * width
packed_size = struct.pack('<L', size)
out_file.write(packed_size)
anchor = infile.tell()
infile.seek(anchor + start_ms)
out_file.write(infile.read(size))
out_file.close()
infile.close()
我认为我的代码非常简单,它适用于 16 位和 8 位深度的声音,但在我尝试 24 位之后 - 它失败了。
我采用速率并将其转换为毫秒,我的 Start 和 End 参数也转换为 ms。 之后,根据这个计算,假设它们是正确的,我在源音频中找到 start_point,然后从这一点写到结尾。 我可能会做错什么? 如何解决这个问题,只使用没有任何外部库的 Python。
谢谢,提前。
【问题讨论】:
不确定这是否与您的问题直接相关,但frames_per_m_sec = rate // 1000
对我来说似乎有问题,因为整数除法可能会丢失您的数值精度。如果采样率是 44.1 kHz,这并不少见,您会得到frames_per_m_sec = 44
,并且您将时间转换为帧偏移量的比例会降低几个百分点。
您能否更具体地描述您的代码如何在 24 位文件上“失败”?您的问题是如何体现的?
我认为你关于精度的注释可能对绝对无噪声的声音有用,但我在 16 位合成中一切正常。然而,24位尝试产生的结果文件充满噪音,没有原声
【参考方案1】:
如果您可以使用外部库,我建议您使用 soundfile 模块,它可以处理开箱即用的 24 位文件。
如果你真的想使用纯 Python,你至少应该使用内置的wave 模块,它至少会为你处理好标头。您仍然需要自行将原始字节转换为有意义的内容。
很难判断您的情况出了什么问题,因为您只显示了部分代码。您应该显示适用于 16 位和 8 位且不适用于 24 位的代码。我没有看到您的代码中提到任何位深度。
如果你看看我的tutorial about the wave
module,它可能会有所帮助。
【讨论】:
以上是关于在纯python中以间隔分割24位深度wav声音的主要内容,如果未能解决你的问题,请参考以下文章
在 Python 中用 24 位数据从立体声 wav 文件 wav 中读取单个通道的数据