在纯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声音的主要内容,如果未能解决你的问题,请参考以下文章

确定 wav 文件的位深度

怎么将8位的WAV声音文件转换为16位?

在纯 WinAPI 中从内存缓冲区播放声音

在 Python 中用 24 位数据从立体声 wav 文件 wav 中读取单个通道的数据

我们可以在 iPhone 应用程序中以特定间隔在后台播放声音吗?

matlab 深度学习做声音分类