web-dev-qa-db-ja.com

Python:PyAudio(または何か他のもの)を使用したリアルタイムオーディオストリーミング?

現在、NumPyを使用してNumPy配列からWAVファイルを生成しています。実際にハードドライブに書き込まれる前に、NumPy配列をリアルタイムで再生することは可能でしょうか。 PyAudioを使用して見つけたすべての例は、最初にNumPy配列をWAVファイルに書き込むことに依存していますが、オーディオ出力にNumPy配列を出力するだけのプレビュー機能が必要です。

クロスプラットフォームであることも必要です。 Python 3(Anaconda distribution))を使用しています。

13
Mario Krušelj

これはうまくいきました!手伝ってくれてありがとう!

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がよくわからないときは、地獄のようです。

13
Mario Krušelj

これは python-sounddevice で本当に簡単です:

import sounddevice as sd
sd.play(myarray, 44100)
8
Matthias

examples を見るとわかるように、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()
3
Roland Smith