Как я могу воспроизвести двоичные данные WAV с pyaudio? - PullRequest
0 голосов
/ 10 октября 2019

Я получаю аудио двоичные данные из веб-запроса, и я хотел бы передать эти данные и немедленно воспроизвести их через динамики. Как я могу это сделать? В настоящее время я получаю сообщения об ошибках, относящихся к свойствам .wav, таким как число не указанных каналов, ширина выборки и т. Д. Я не хочу записывать его в файл .wav, а затем загружать файл и воспроизводить его. Я хотел бы перейти от двоичных аудиоданных -> к воспроизведению на динамиках, возможно, я иду в неверном направлении, чтобы решить эту проблему, но любая помощь будет принята с благодарностью. Я предполагаю, что должен быть какой-то способ передать эти данные в аудиопоток, и я просто не знаю, как это сделать.

Я пытаюсь открыть двоичные данные, записать объект .wav в переменную и затемоткрытие аудиопотока с этого объекта. Я также попытался явно установить поля в аудиопотоке для использования.

wav = wave.open(response.audio_content, 'wb')
pa = pyaudio.PyAudio()
audio_stream = pa.open(format=pa.get_format_from_width(wav.getsampwidth()),
                       channels=wav.getnchannels(),
                       rate=wav.getframerate(),
                       output=True)

data = wav.readframes(CHUNK)

while data != '':
    audio_stream.write(data)
    data = wav.readframes(CHUNK)

audio_stream.stop_stream()
audio_stream.close()
pa.terminate()

Вот пример ошибки канала:

wave.Error: # channels not specified

1 Ответ

0 голосов
/ 13 октября 2019

Попробуйте это:

import pyaudio
import wave
import numpy as np
import sounddevice as sd

CHUNK = 1024
FORMAT = pyaudio.paInt16
CHANNELS = 2
RATE = 44100
RECORD_SECONDS = 5
WAVE_OUTPUT_FILENAME = "output.wav"

p = pyaudio.PyAudio()

stream = p.open(format=FORMAT,
                channels=CHANNELS,
                rate=RATE,
                input=True,
                frames_per_buffer=CHUNK)

print("* recording")

frames = []

for i in range(0, int(RATE / CHUNK * RECORD_SECONDS)):
    # read data-chunks in strings
    data = stream.read(CHUNK)
    #frames.append(data)
    # change the format to numpy int16
    frames.append(np.fromstring(data,dtype=np.int16))
#newS = np.fromstring(frames,dtype=np.int16)
print("* done recording")
sound = np.array(frames)
sound = sound.flatten()
sd.play(sound,44100*2)

stream.stop_stream()
stream.close()
p.terminate()

wf = wave.open(WAVE_OUTPUT_FILENAME, 'wb')
wf.setnchannels(CHANNELS)
wf.setsampwidth(p.get_sample_size(FORMAT))
wf.setframerate(RATE)
wf.writeframes(b''.join(frames))
wf.close()
...