我已经编写了一个用于连接两个wave文件的代码。当我加入更大的片段时工作正常但是因为我需要加入非常小的片段,所以清晰度不高。
据我所知,窗口连接等信号处理技术可以用来改善文件的连接。
y [n] = w [n] s [n] 将样本数n处的信号值乘以窗口函数的值 汉明窗w [n] = .54 - .46 * cos(2 * Pi * n)/ L 0
我不明白如何获取样本n的信号值以及如何实现这个?
the code i am using for joining is
import wave
m=['C:/begpython/S0001_0002.wav', 'C:/begpython/S0001_0001.wav']
i=1
a=m[i]
infiles = [a, "C:/begpython/S0001_0002.wav", a]
outfile = "C:/begpython/S0001_00367.wav"
data= []
data1=[]
for infile in infiles:
w = wave.open(infile, 'rb')
data1=[w.getnframes]
data.append( [w.getparams(), w.readframes(w.getnframes())] )
#data1 = [ord(character) for character in data1]
#print data1
#data1 = ''.join(chr(character) for character in data1)
w.close()
output = wave.open(outfile, 'wb')
output.setparams(data[0][0])
output.writeframes(data[0][1])
output.writeframes(data[1][1])
output.writeframes(data[2][1])
output.close()
在加入过程中,我正在使用字节格式来处理frame.now必须使用整数或浮点格式对它们执行操作我猜,如果我的想法是真的,我该怎么做?
答案 0 :(得分:0)
这可能不是最好的解决方案,但我相信它会起作用。也许你找到现有的libs或者一些步骤,我不知道Python。我建议的步骤是:
旧帖子: 你必须计算样本值,在java中,2字节/帧声音文件的函数如下所示:
public static int createIntFrom16( byte _8Bit1, byte _8Bit2 ) {
return ( 8Bit1<<8 ) | ( 8Bit2 &0x00FF );
}
通常你必须关心文件是否使用little endian,我不知道Python lib是否会考虑到这一点。
创建完所有样本值后,您必须将文件划分为窗口,例如大小为512个样本。然后,您可以窗口化值,并创建字节值。对于16位,它看起来像这样:
public static byte[] createBytesFromInt(int i) {
byte[] bytes = new byte[2];
bytes[0]=(byte)(i>>8);
bytes[1]=(byte)i;
return bytes;
}
答案 1 :(得分:0)
为了让您高度理解,WAV音频格式由一个44字节的标题组成,您可以在其中定义必要的元数据,如采样率,通道数等,然后是实际音频数据所在的有效负载。音频只是随时间变化的幅度变化曲线。 WAV格式允许该幅度从最大值+1.0变化到最小值-1.0,表示为浮点。在进行音频记录时,通常每秒测量44100次(采样率)。因此,WAV文件只存储这一系列样本值。 WAV格式不存储浮点,而是存储+1到-1的范围,作为0到2 ^ 16之间的整数。这些16位样本每个样本需要两个字节的文件存储空间。在如上所述的示例代码中,i>&gt; 8将音频值移位8位。如果您考虑这些想法,并编写自己的WAV格式代码来读取或写入文件,您将能够很好地回答您的问题。