Прочтите wav файл из Python и конвертируйте кадры в строку RAW s16le

Я читаю файл на Python, используя библиотеки librosa, wave или звуковых файлов, и мне нужно отправить фрагмент (любого размера) в поток HTTP. По спецификации ввод строки потока требует, чтобы я преобразовал кадры в формат RAW s16le.

Я пробовал несколько вариантов, в том числе:

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

Но это просто создает пустой аудиопоток. Что я делаю неправильно?


person Andrey Shtylenko    schedule 20.09.2017    source источник
comment
Вы открыты для других python аудиобиблиотек или вам нужно работать с librosa?   -  person Anil_M    schedule 21.09.2017
comment
@Anil_M, пока может работать любая библиотека. Был бы признателен за вашу помощь.   -  person Andrey Shtylenko    schedule 21.09.2017
comment
@ Андрей Штыленко, проверьте мой ответ и посмотрите, пригодится ли он.   -  person Anil_M    schedule 21.09.2017


Ответы (2)


Вы можете попробовать 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.

person Anil_M    schedule 21.09.2017

Если вы хотите получить необработанные данные из файла 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....."
person Asim    schedule 23.05.2020