在Python中组合带有空格的wav文件



我希望将Python中的波文件与它们之间的沉默结合起来。这里使用wave的代码工作得非常好:

如何使用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变量,以便在组合我的两个文件时将它们分开。我看过一些生成不同类型波形的脚本,我也知道如何使它们基本静音,但我不能指定长度,或者至少不知道如何指定。什么好主意吗?

编辑:我能够找到一种方法,通过将上面的代码与这里给出的代码相结合,使指定长度的静默文件:我如何生成一个WAV文件与哔哔声?

谢谢大家!

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

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

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

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

接下来的4个字节是BE,并且总是66 6D 74 20,或fmt。这是一个后面加空格的fmt。从这里开始,基于波的事情变得更加可变,拥有正确的匹配值对于这一点来说是很容易的。

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

接下来的2个字节是LE并确定格式,1000表示PCM,或脉冲编码调制,这通常是通过记录软件设置的,不应该改变。

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

接下来的4个字节是BE,并确定采样率。这是高度可变的,但必须匹配正确的读取。例如,44 AC 00 00将是44,100,即44,100 hz。

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

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

接下来的2个字节是LE,并确定每个样本的位数。08 000表示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。接下来是1000 000 000 000,这告诉我们它是16位的。01 00告诉我们是PCM。01告诉我们这是单声道。56 22 00 00(翻转后端)告诉我们这个文件的采样率是每秒22050。AC 44 00 00告诉我们它的传输速率是44,100赫兹,单位是比特每秒。最后一行相当简单,以data结尾。

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

最新更新