从 python 读取 wav 文件并将帧转换为 RAW s16le 字符串
Posted
技术标签:
【中文标题】从 python 读取 wav 文件并将帧转换为 RAW s16le 字符串【英文标题】:Read wav file from python and convert frames into RAW s16le string 【发布时间】:2017-09-20 16:08:02 【问题描述】:我正在使用 librosa、wave 或 soundfile 库在 Python 中读取文件,我需要将块(任何大小)推送到 HTTP 流。根据规范,流字符串输入需要我将帧转换为 RAW s16le 格式。
我尝试了多种选择,包括:
soundarray,rate = librosa.load(pathToWavFile, dtype="<i2")
str = b''.join(soundarray)
但这只会创建一个空的音频流。我做错了什么?
【问题讨论】:
您是否对其他python
音频库开放或者您需要与librosa
合作?
@Anil_M,现在任何库都可以工作。非常感谢您的帮助。
@Andrey Shtylenko,检查我的回复,看看是否有用。
【参考方案1】:
您可以尝试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。
【讨论】:
【参考方案2】:如果你想一次性从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....."
【讨论】:
以上是关于从 python 读取 wav 文件并将帧转换为 RAW s16le 字符串的主要内容,如果未能解决你的问题,请参考以下文章
将 UInt32(音频帧)拆分为两个 SInt16(左右)?