звуковой буфер должен быть упакован в двоичный файл, для python3 использование b''.join(struct.pack
также упростило синтез кривой sin, переместив константу приращения угла тета за пределы l oop
import pyaudio
import numpy as np
import math
import struct
FS = 44100 # frames per second, samples per second or sample rate
def play_sound(type, frequency, volume, duration):
generate_sound(type, frequency, volume, duration)
def generate_sound(type, frequency, volume, duration):
outbuf = np.random.normal(loc=0, scale=1, size=int(float(duration / 1000.0)*FS))
if type == "sine":
dur = int(FS * float(duration / 1000.0))
theta = 0.0
incr_theta = frequency * 2 * math.pi / FS # frequency increment normalized for sample rate
for i in range(dur):
outbuf[i] = volume * math.sin(theta)
theta += incr_theta
p = pyaudio.PyAudio()
stream = p.open(format=pyaudio.paFloat32, channels=1, rate=FS, output=True)
data = b''.join(struct.pack('f', samp) for samp in outbuf) # must pack the binary data
stream.write(data)
stream.stop_stream()
stream.close()
p.terminate()
play_sound("sine", 220, 0.8, 1000) # duration in milliseconds