从 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 字符串的主要内容,如果未能解决你的问题,请参考以下文章

从 .opus 转换为 .wav

如何在 Python 中将 WAV 从立体声转换为单声道?

如何将声音字节转换为可以在变量中访问的 .wav 文件?

将 UInt32(音频帧)拆分为两个 SInt16(左右)?

如何让 python 加载一个大(2 小时)wav 文件并将其内容转换为时频数组?

如何在python中读取.wav字节流