从python中读取wav文件并将帧转换为RAW s16le字符串

时间:2017-09-20 16:08:02

标签: python audio librosa

我正在使用librosa,wave或soundfile库中的Python读取文件,我需要将块(任何大小)推送到HTTP流。根据规范,流字符串输入要求我将帧转换为RAW s16le格式。

我尝试了多种选择,包括:

soundarray,rate = librosa.load(pathToWavFile, dtype="<i2")
str = b''.join(soundarray)

但这只会创建一个空的音频流。我做错了什么?

2 个答案:

答案 0 :(得分:0)

您可以尝试pydub将音频转换为音频片段,将音频片段拆分为可播放的块(即您可以播放每个块),然后根据需要将它们转换为原始。

这是一个快速代码。

from pydub import AudioSegment
from pydub.utils import make_chunks

myaudio = AudioSegment.from_file("myaudio.wav" , "wav") 
chunk_length_ms = 1000 # pydub calculates in millisec
chunks = make_chunks(myaudio, chunk_length_ms) #Make chunks of one sec

#Convert chunks to raw audio data which you can then feed to HTTP stream
for i, chunk in enumerate(chunks):
    raw_audio_data = chunk.raw_data

默认情况下,原始音频为16位

>>> 
bytes_per_sample= 2  # 2 byte (16 bit) samples

由于raw_audio_data是原始的,如果上述格式不起作用,您可以根据需要转换为任何其他格式。查看pydub utils api了解详情。

答案 1 :(得分:0)

如果您想一次从wav文件中获取原始数据,那么pydub也可以这样使用:

from pydub import AudioSegment

sound = AudioSegment.from_wav('your_audio.wav')  # can do same for mp3 and other formats

raw = sound._data  # returns byte string 

print(raw)  # prints "b'k\xffe\xffw\xff\x83\xffu\xff\x85\xff\x81\xff\x85\xff\xa5....."