在Python3中读取和播放音频

时间:2016-12-22 23:28:58

标签: python-3.x audio scipy wav

我的计算机上有一些音频文件。我想在Python3中对它们进行一些分析,其中一部分将包括播放音频文件的片段。

我对AMR文件感兴趣。示例文件是here,但任何文件都可以。

到目前为止,这是我的工作流程:

#!/usr/bin/env python3
import audioread
import numpy as np
fin = audioread.audio_open('test.amr') 
dat  = [x for x in fin]          #Generate list of bytestrings
dat  = b''.join(dat)             #Join bytestrings into a single urbytestring
ndat = np.fromstring(dat, '<i2') #Convert from audioread format to numbers

#Generate a wave file in memory
import scipy.io.wavfile
import io
memory_file = io.BytesIO() #Buffer to write to
scipy.io.wavfile.write(memory_file, fin.samplerate, ndat) 

#Play the wave file
import simpleaudio
wave_obj = simpleaudio.WaveObject(memory_file.getvalue())
play_obj = wave_obj.play()
play_obj.wait_done()

问题是,当我去播放时,我发出一些非常高音,快速的声音。我怀疑转换在某个地方出了问题,但我不确定在哪里。

尝试使用wave会产生类似的结果:

#Generate a wave file in memory using wave
import wave
import io
memory_file = io.BytesIO() #Buffer to write to
wave_file = wave.open(memory_file, 'w')
wave_file.setparams((fin.channels, 2, fin.samplerate, 0, 'NONE', 'not compressed'))
wave_file.writeframes(ndat.astype('<i2').tostring())
wave_file.close()

有和没有astype

我怀疑audioread使用的音频后端可能没有工作,所以我从AMR转换为WAV然后读入文件。那并没有解决问题。

将波形文件写入磁盘并使用标准音频播放器进行播放确实解决了问题,因此问题似乎是simpleaudio

1 个答案:

答案 0 :(得分:1)

原来我错误地使用了simpleaudio。以下作品:

#!/usr/bin/env python3
import audioread
import numpy as np
fin  = audioread.audio_open('test_justin.amr') 
dat  = [x for x in fin]          #Generate list of bytestrings
dat  = b''.join(dat)             #Join bytestrings into a single urbytestring
ndat = np.fromstring(dat, '<i2') #Convert from audioread format to numbers

#Generate a wave file in memory
import scipy.io.wavfile
import io
memory_file = io.BytesIO() #Buffer to write to
scipy.io.wavfile.write(memory_file, fin.samplerate, ndat) 

#Play the wave file
import simpleaudio
wave_obj = simpleaudio.WaveObject.from_wave_file(memory_file)
play_obj = wave_obj.play()
play_obj.wait_done()