在Python中将wav文件与空格结合起来

Posted

技术标签:

【中文标题】在Python中将wav文件与空格结合起来【英文标题】:Combining wav files with space between in Python 【发布时间】:2021-07-27 19:16:18 【问题描述】:

我希望将 Python 中的波形文件与它们之间的静默结合起来。这里使用wave 的代码运行良好:

How to join two wav files using python?

但我需要在文件之间放置一些空间,以便不同的文件对以相同的方式间隔。我有这段代码来计算 wav 之间需要的空间来使总 10 秒:

import wave

file_1 = wave.open('file_1.wav')
file_2 = wave.open('file_2.wav')

total_length = 0
for item in [file_1,file_2]:
    item_length = item.getnframes()/item.getframerate()
    total_length = total_length + item_length
space_between = 10-total_length

所以现在我需要知道是否有办法使用我在上面链接的代码中创建的space_between 变量,以便在合并两个文件时将它们分开。我已经看到了一些用于生成不同类型波形的脚本,并且我已经弄清楚了如何使它们基本上静音,但是我无法指定长度,或者至少无法弄清楚如何指定。有什么想法吗?

编辑:通过将上面的代码与此处给出的代码相结合,我能够找到一种方法来制作指定长度的静默文件: python - how can I generate a WAV file with beeps?

谢谢各位!

【问题讨论】:

“之间的空格”是指要在它们之间插入静音吗?假设这些是 PCM 文件,静音为 0。只需添加 N 帧的 0。 所以你需要将 space_between 乘以帧速率。当然,如果 wav 文件的帧速率不同或组合时长超过 10 秒,就会出现问题。 是的,我做了这么多是有道理的——但是我到底是在哪里产生这种沉默呢?对于如何组合 wav 文件,我有几个选项,但到目前为止我正在使用这个:***.com/a/2900266/14132599 那么我在什么时候说“添加 N 帧 0”? 【参考方案1】:

您首先需要了解 RIFF 标头。您将希望以二进制数据的形式打开您的 wav。

标头的前 4 个字节是“幻数”。在这种情况下,52 49 46 46 或 RIFF。这是大端(BE)格式。

接下来的 4 个字节是文件大小减去标题。这是 little-endian (LE) 格式,因此从位置 8 向后读取字节。这显然会根据 wav 文件的大小而有所不同。

接下来的 4 个字节是 BE,并且永远是 57 41 56 45,或者是 WAVE,因为它是一个 wav 文件。

接下来的 4 个字节是 BE,并且始终是 66 6D 74 20 或 fmt 。那是一个fmt,后面有一个空格。从这里开始,事情会根据波浪变得更加多变,并且具有正确的匹配值对于这有点容易是至关重要的。

块大小为 4 字节 LE,这可能是 10 00 00 00 或 28 00 00 00。块用于让音频处理器确定如何读取实际音频数据。

接下来的2个字节是LE,决定格式,10 00表示PCM,也就是脉冲编码调制,这个一般是通过录音软件设置的,不要改。

接下来的 2 个字节是 LE,用于确定音频文件是单声道 (01 00) 还是立体声 (02 00)。

接下来的 4 个字节是 BE 并确定采样率。这是高度可变的,但必须匹配才能正确阅读。例如,44 A​​C 00 00 将是 44,100,如 44,100 赫兹。

接下来的 4 个字节是 BE,决定了传输速率。这可以通过通道 x 采样率 x 位 / 8 来计算。

接下来的 2 个字节是 LE,用于对齐,这可以通过取通道 x 位 /8 来计算。

接下来的 2 个字节是 LE,确定每个样本的位数。 08 00 表示 1 个样本占用 1 个字节。

接下来的 4 个字节是 BE 和结束头,这总是 64 61 74 61 或数据。

后面的都是音频数据。在这里,您将拆分文件,合并它们,插入空白数据量 x 采样率,然后读取整个长度并创建一个新标题。

例如,从我拥有的随机 wav 文件中获取以下标头:

52 49 46 46 14 60 28 00 57 41 56 45 66 6D 74 20
10 00 00 00 01 00 01 00 22 56 00 00 44 AC 00 00
02 00 10 00 64 61 74 61

我们看到 RIFF,文件大小为 28 60 14(翻转字节序)或 2,646,036,其中文件为 2,646,044,因此您会看到 8 字节的差异,最后在顶行我们看到 WAVEfmt 。接下来是 10 00 00 00,这告诉我们它是 16 位的。 01 00 告诉我们它是 PCM。 01 00 告诉我们它是单声道。 56 22 00 00(翻转字节序)告诉我们这个文件是每秒 22,050 个采样率。 AC 44 00 00 告诉我们它是每秒 44,100 赫兹的传输速率。最后一行相当简单,结尾是数据。

因此,我们可以通过将字节长度 2646036 除以比特率 44100 来确定音频的长度。这给了我们 60.0008 或 1 分钟,即这个音频文件。

【讨论】:

以上是关于在Python中将wav文件与空格结合起来的主要内容,如果未能解决你的问题,请参考以下文章

在 WP8 中将 ogg 文件解码为 wav

如何在 Python 中将 WAV 从立体声转换为单声道?

在 Python 多处理中将 Pool.map 与共享内存数组结合起来

如何在java中将Wav文件拆分为通道?

在 Javascript 中将 32 位 WAV 转换为 16 位 WAV

在python中将空格分隔文件转换为逗号分隔值文件