Python で無限に長い純粋なサイン トーンを作成しようとしています (したがって、後でリアルタイムのオン/オフ イベントを追加できます)。私の推測では、次のチャンクが最後のチャンクが終了したときと同じウェーブのサイクルで開始されていないか、次のチャンクの計算に遅延があり、それがどれなのかわかりません。
これらのいずれかが発生していますか、それとも他のエラーを犯しましたか? さらに、受信データをリアルタイムで変更する機能を犠牲にすることなく、より良いアプローチはありますか?
import time
import numpy
import pyaudio
import math
CHUNK = 4096
RATE = 44100
def sine(current_time, frequency=440):
length = CHUNK
factor = float(frequency) * (math.pi * 2) / RATE
this_chunk = numpy.arange(length) + current_time
return numpy.sin(this_chunk * factor)
def get_chunk():
data = sine(time.time())
return data * 0.1
def callback(in_data, frame_count, time_info, status):
chunk = get_chunk() * 0.25
data = chunk.astype(numpy.float32).tostring()
return (data, pyaudio.paContinue)
p = pyaudio.PyAudio()
stream = p.open(format = pyaudio.paFloat32,
channels = 2,
rate = RATE,
output = True,
stream_callback = callback)
stream.start_stream()
while stream.is_active():
time.sleep(0.1)
stream.stop_stream()
stream.close()