0
import pyaudio
import numpy as np
import time

RATE=44100
pa = pyaudio.PyAudio()
stream = pa.open(format=pyaudio.paFloat32,
                                channels=1,
                                rate=RATE,
                                output=True)
t = time.time()
output = np.ones(44100)*100
stream.write(output)
print(time.time()-t)

This is a test code. With 44100 sample rate, when playing 44100 samples, the time cost should be 1s. However, the output is not. Why does it happen? I am looking forward to someone's answer. Thank you very much.

Roger
  • 91
  • 2
  • 4

1 Answers1

2

Disclaimer: untested, just looked into the API.

stream.write() expects a string of a defined format (here: 32bit-floatingpoint). But you pass a handle to a numpy array. PyAudio (probably) defaults to convert the passed value into a string. The string representation of your output without further modification is:

array([ 100.,  100.,  100., ...,  100.,  100.,  100.])

or 42 bytes or 2.3ms playtime.

Try stream.write('\0\0\0\0'*44100). To use np.ones() or numpy-arrays in general you have to use the correct datatype (you defined the format to be paFloat32):

output = np.ones(44100, dtype=np.float32).tobytes()
Peter Schneider
  • 1,683
  • 12
  • 31