在Python中读取*.wav文件

2024-06-16 14:45:18 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要分析.wav文件中的声音。为此,我需要将这个文件转换成一组数字(例如数组)。我想我需要用波浪包。但是,我不知道它到底是怎么工作的。例如,我执行了以下操作:

import wave
w = wave.open('/usr/share/sounds/ekiga/voicemail.wav', 'r')
for i in range(w.getnframes()):
    frame = w.readframes(i)
    print frame

作为这个代码的结果,我希望看到声压是时间的函数。相比之下,我看到了很多奇怪、神秘的符号(它们不是十六进制数字)。有人能帮我吗?


Tags: 文件import声音shareforusr数字数组
3条回答

今天晚上我做了一些调查,发现:

import wave, struct

waveFile = wave.open('sine.wav', 'r')

length = waveFile.getnframes()
for i in range(0,length):
    waveData = waveFile.readframes(1)
    data = struct.unpack("<h", waveData)
    print(int(data[0]))

希望这段代码能帮助别人。 细节: 使用struct module,您可以使用wave帧(在-32768;0x8000和32767;0x7FFF之间的2个互补二进制文件中)来读取单声道16位wave文件。 我发现this webpage在表述这一点时非常有用。

此片段读取1帧。要读取多个帧(如13),请使用

waveData = waveFile.readframes(13)
data = struct.unpack("<13h", waveData)

the sourcesscipy.io.wavfile.read(somefile)返回两个项目的元组:第一个是每秒采样率,第二个是从文件中读取所有数据的numpy数组。看起来很好用!

例如:

from scipy.io import wavfile
fs, data = wavfile.read('./output/audio.wav')

要读取wav的不同python模块:

至少有以下库可读取wave音频文件:

最简单的例子:

这是Pysoundfile的一个简单示例:

import soundfile as sf
data, samplerate = sf.read('existing_file.wav') 

输出格式:

警告,数据的格式并不总是相同的,这取决于库。 例如:

from scikits import audiolab
from scipy.io import wavfile
from sys import argv
for filetest in argv[1:]:
    [x, fs, nbBits] = audiolab.wavread(filePath)
    print '\nReading with scikits.audiolab.wavread: ', x
    [fs, x] = wavfile.read(filetest)
    print '\nReading with scipy.io.wavfile.read: ', x

使用scikits.audiolab.wavread读取:[0。0个。0。。。,-0.00097656-0.00079346 -0.00097656] 使用scipy.io.wavfile.read读取:[0 0 0…,-32-26-32]

PySoundFile和Audiolab返回的浮点值介于-1和1之间(与matab一样,这是音频信号的约定)。Scipy和wave返回整数,可以根据编码位的位数以浮点形式转换。

例如:

from scipy.io.wavfile import read as wavread
[samplerate, x] = wavread(audiofilename) # x is a numpy array of integer, representing the samples 
# scale to -1.0 -- 1.0
if x.dtype == 'int16':
    nb_bits = 16 # -> 16-bit wav files
elif x.dtype == 'int32':
    nb_bits = 32 # -> 32-bit wav files
max_nb_bit = float(2 ** (nb_bits - 1))
samples = x / (max_nb_bit + 1.0) # samples is a numpy array of float representing the samples 

相关问题 更多 >