Python: потоковое аудио в реальном времени с PyAudio (или что-то еще)?
В настоящее время я использую NumPy для генерации WAV-файла из массива NumPy. Интересно, можно ли воспроизвести массив NumPy в реальном времени, прежде чем он будет записан на жесткий диск. Все примеры, которые я нашел с помощью PyAudio, полагаются на запись массива NumPy в WAV-файл, но я хотел бы иметь функцию предварительного просмотра, которая просто выплевывает массив NumPy на аудиовыход.
должен быть кросс-платформенным, тоже. Я использую Python 3 (дистрибутив Anaconda).
3 ответов
это работает! Спасибо за помощь!
def generate_sample(self, ob, preview):
print("* Generating sample...")
tone_out = array(ob, dtype=int16)
if preview:
print("* Previewing audio file...")
bytestream = tone_out.tobytes()
pya = pyaudio.PyAudio()
stream = pya.open(format=pya.get_format_from_width(width=2), channels=1, rate=OUTPUT_SAMPLE_RATE, output=True)
stream.write(bytestream)
stream.stop_stream()
stream.close()
pya.terminate()
print("* Preview completed!")
else:
write('sound.wav', SAMPLE_RATE, tone_out)
print("* Wrote audio file!")
кажется таким простым сейчас, но когда вы не знаете Python очень хорошо, это кажется адом.
Это очень просто с python-sounddevice:
import sounddevice as sd
sd.play(myarray, 44100)
Как вы можете видеть в разделе примеры, pyaudio просто считывает данные из WAV-файла и записывает их в поток.
Не обязательно сначала писать WAV-файл,вам просто нужен поток данных в правильном формате.
Я добавляю пример ниже, если ссылка когда-либо будет мертва (обратите внимание, что я не писал этот код):
"""PyAudio Example: Play a WAVE file."""
import pyaudio
import wave
import sys
CHUNK = 1024
if len(sys.argv) < 2:
print("Plays a wave file.\n\nUsage: %s filename.wav" % sys.argv[0])
sys.exit(-1)
wf = wave.open(sys.argv[1], 'rb')
p = pyaudio.PyAudio()
stream = p.open(format=p.get_format_from_width(wf.getsampwidth()),
channels=wf.getnchannels(),
rate=wf.getframerate(),
output=True)
data = wf.readframes(CHUNK)
while data != '':
stream.write(data)
data = wf.readframes(CHUNK)
stream.stop_stream()
stream.close()
p.terminate()