什么类型的文件是audioop的“声音片段”参数?

时间:2015-01-12 04:11:42

标签: python audio beat-detection

Python audioop documentation表示大多数可用功能都需要“声音片段”。

  

audioop模块包含对声音片段的一些有用操作。它对声音片段进行操作,声音片段由8,16或32位宽的有符号整数样本组成,存储在Python字符串中。

声音碎片到底是什么?如何将现有的.wav文件合并为一个?

感谢。

5 个答案:

答案 0 :(得分:6)

您可以使用wave module

执行此操作

open()方法打开文件,readframes(n)返回(最多)n帧音频,作为字节串,就像audioop想要的那样。

例如,假设您需要使用audioop中的avg()方法。这就是你如何做到的:

import wave
import audioop


wav = wave.open("piano2.wav")
print(audioop.avg(wav.readframes(wav.getnframes()), wav.getsampwidth()))

输出:

-2

此外,您可能对wave模块中的rewind()方法感兴趣。它将读取位置放回到wav文件的开头。

如果您需要阅读两次wav文件,可以写下:

wav = wave.open("piano2.wav")
print(audioop.avg(wav.readframes(wav.getnframes()), wav.getsampwidth()))

# if you don't call rewind, next readframes() call 
# will return nothing and audioop will fail

wav.rewind() 
print(audioop.max(wav.readframes(wav.getnframes()), wav.getsampwidth()))

或者您可以缓存字符串:

wav = wave.open("piano2.wav")
string_wav = wav.readframes(wav.getnframes())
print(audioop.avg(string_wav, wav.getsampwidth()))
# wav.rewind()
print(audioop.max(string_wav, wav.getsampwidth()))

答案 1 :(得分:3)

您可能需要查看wave模块。您可能希望以读取模式打开文件并使用readframes获取audiooop.所需的示例

答案 2 :(得分:1)

要回答片段究竟是什么,它是bytes object,它只是一串字节。我相信对于8位音频文件,每帧8位音频会有一个字节,16位音频每帧会有两个字节,32位音频会有4个字节。

答案 3 :(得分:1)

import audioop
import wave
read = wave.open("C:/Users/Pratik/sampy/cat.wav")
string_wav = read.readframes(read.getnframes())
a = audioop.lin2alaw(string_wav,read.getsampwidth())
print(a)
----------------------------------------------------------
how to convert wav file  to alaw

答案 4 :(得分:1)

声音片段表示在类似字节的对象中编码的有符号整数声音样本的序列。 audioop支持每个样本1、2、3或4个字节的表示形式。

可以使用struct.pack转换单个样本(让我们以0、1、2,-1、42为例):

from struct import pack

for sample in [0, 1, 2, -1, 42]:
   print(f'sample value {sample}, 1 byte/sample:', pack('b', sample))
   print(f'             {sample}, 2 byte/sample:', pack('h', sample))
   print(f'             {sample}, 4 byte/sample:', pack('i', sample))

此打印:

sample value 0, 1 byte/sample: b'\x00'
             0, 2 byte/sample: b'\x00\x00'
             0, 4 byte/sample: b'\x00\x00\x00\x00'
sample value 1, 1 byte/sample: b'\x01'
             1, 2 byte/sample: b'\x01\x00'
             1, 4 byte/sample: b'\x01\x00\x00\x00'
sample value 2, 1 byte/sample: b'\x02'
             2, 2 byte/sample: b'\x02\x00'
             2, 4 byte/sample: b'\x02\x00\x00\x00'
sample value -1, 1 byte/sample: b'\xff'
             -1, 2 byte/sample: b'\xff\xff'
             -1, 4 byte/sample: b'\xff\xff\xff\xff'
sample value 42, 1 byte/sample: b'*'
             42, 2 byte/sample: b'*\x00'
             42, 4 byte/sample: b'*\x00\x00\x00'

让我们假设我们要使用每个采样2字节将Python(带符号)整数表示中的某些声音采样转换为声音片段(允许输入采样值介于-32768到32767之间;即-2**15到{ {1}})在音频CD中使用:

2**15-1

此打印:

import audioop
import array

samples = [0, 1000, 32767, 1, -1, -32768, -1000]  # 7 samples of "music"
fragment = array.array('h', samples).tobytes()
print(f'Fragment {fragment} of length {len(fragment)}')

# convert back with audioop function
print([audioop.getsample(fragment, 2, i) for i in range(len(fragment) // 2)])

作为最后一个示例,将一个3秒的立体声正弦波写入Fragment b'\x00\x00\xe8\x03\xff\x7f\x01\x00\xff\xff\x00\x80\x18\xfc' of length 14 [0, 1000, 32767, 1, -1, -32768, -1000] 文件并再次读取:

.wav