以下のコードはバッファアンダーランの原因となります。 synth_instance.playは、サイズ(frames_num * 2)の浮動小数点数(-1,1)でインターリーブされたステレオフレームのリストを返します。Python/PyAudio - バッファアンダーラン
stream.writeは、私が何らかの理由でそれを供給するすべてのフレームを書き込まないように私には思えます。
私は、コールバックモードでpyaudioを使用してみましたが、私は時間に十分なフレームとそれを提供する方法がわかりません。私のメインループは、オーディオチャンクのキューからオーディオを供給することに追いつくことができませんでした。オーディオコールバックは、すべてのオーディオチャンクを常に私が供給できるよりも速く動かしました。
#!/usr/bin/python3
import pyaudio
import time
import struct
from synth import synth
from time import sleep
from time import clock
p = pyaudio.PyAudio()
sample_rate = 44100
frames_num = 2205
synth_instance = synth();
stream = p.open(rate=sample_rate,
channels=2,
format=pyaudio.paFloat32,
frames_per_buffer=frames_num,
output=True)
while (True):
audio = synth_instance.play_note(-12, sample_rate, frames_num)
data = struct.pack('f'*len(audio), *audio)
stream.write(data, frames_num)
[ここ]を見に取る、我々はすべてのpythonが遅いことを知っているが、我々のpythonを使用してリアルタイムにたくさんのことを行うことができます(https://www.youtube.com/watch?v=YT-zAX3S850 ) 'while'ループpythonが遅い' for'を試してください – ederwander
本当の低レイテンシのアプリケーションを書くつもりなら、おそらくPythonを使ってはいけません。あるいは、Cで重要なコードを書いて拡張機能を使う必要があります。とにかく、どのようなレイテンシや、どのような操作/どのようにオーディオストリームで演奏しているのかは言及していないので、あなたがやろうとしていることがPythonで実現可能かどうかはほかの人が言うことはできません。 – toes