Я пытаюсь понять что-то, что я вижу в PyAudio. Я пытаюсь взять образец аудио 200 мс, подождать несколько секунд, а затем взять еще три 200 мс аудио. Рассмотрим этот код:Поведение PyAudio во время time.sleep()
import pyaudio
import time
p = pyaudio.PyAudio()
chunk = 1024
FORMAT = pyaudio.paInt16
CHANNELS = 1 #chan
RATE = 11025
stream = p.open(format = FORMAT,
channels = CHANNELS,
rate = RATE,
input = True,
output = False,
frames_per_buffer = chunk,
input_device_index = 0,
output_device_index = 0)
def record(seconds):
all = []
for i in range(0, int(RATE/chunk * seconds)):
data = stream.read(chunk)
all.append(data)
data = ''.join(all)
return data
#record 200ms of sound
print "pre-record 1 " + str(time.time())
data = record(.2)
print "post-record 1 " + str(time.time())
#sleep for one second
#time.sleep(1)
#record 200ms of sound
print "pre-record 2 " + str(time.time())
data = record(.2)
print "post-record 2 " + str(time.time())
print "pre-record 3 " + str(time.time())
data = record(.2)
print "post-record 3 " + str(time.time())
print "pre-record 4 " + str(time.time())
data = record(.2)
print "post-record 4 " + str(time.time())
Если я запускаю это «как есть» (т.е. с time.sleep()
закомментированного), я получаю это, что имеет смысл:
pre-record 1 1357526364.46
post-record 1 1357526364.67
pre-record 2 1357526364.67
post-record 2 1357526364.86
pre-record 3 1357526364.86
post-record 3 1357526365.03
pre-record 4 1357526365.03
post-record 4 1357526365.22
Если бы я тогда раскомментируйте время. сон() линия, чтобы добавить одну вторую задержки между первой и второй записью, я получаю это:
pre-record 1 1357525897.09
post-record 1 1357525897.28
pre-record 2 1357525898.28
post-record 2 1357525898.28
pre-record 3 1357525898.28
post-record 3 1357525898.28
pre-record 4 1357525898.28
post-record 4 1357525898.47
Обратите внимание, что в то время как есть один-вторая задержка в метках времени между первой и второй записью, þér e не задерживается между записями 2 и 3, и они, кажется, были взяты за нулевое время (хотя на самом деле они содержат 200 мс данных). Кажется, что запись четыре взяла 200 мс, но была запущена одновременно с записями 2 и 3.
Если я заменил time.sleep(1)
на record(1)
(и не сохранял/не использовал данные с 1-секундной записи), программа ведет себя, как я ожидаю:
pre-record 1 1357526802.57
post-record 1 1357526802.77
pre-record 2 1357526803.69
post-record 2 1357526803.88
pre-record 3 1357526803.88
post-record 3 1357526804.06
pre-record 4 1357526804.06
post-record 4 1357526804.25
так, казалось бы, что даже во время time.sleep(1)
, буфер где-то по-прежнему подается звук, и когда я вызываю функцию записи после сна, это захват аудио из этого буфера , который не является звуком, который я хочу. Мне нужен звук после сна, а не во время его. Может ли кто-нибудь помочь мне понять взаимодействие PyAudio с любым буфером, и есть ли способ лучше узнать, в какое время мой звук был фактически захвачен?
Спасибо, это очень полезно. Вы знаете, имеет ли буфер определенный размер? Если вы посмотрите на второй пример выше, похоже, что запись 4 на самом деле заняла 200 мс для завершения, что, по-видимому, указывает на то, что, возможно, буфер может содержать только данные на 400 мс на этом СКОРОСТИ? – aaknitt
Чтобы частично ответить на мой собственный вопрос, есть хорошее обсуждение размера буфера здесь: http://www.portaudio.com/docs/latency.html Похоже, есть функция PortAudio 'Pa_GetMinNumBuffers (int framesPerBuffer, double sampleRate) ', который вернет размер буфера, но я еще не нашел этого в PyAudio. Однако, вызывая функцию 'get_read_available()', я могу получить представление о том, как работает буфер. – aaknitt
Кроме того, похоже, что вызов 'stream.stop_stream()' до 'time.sleep (1)' остановит аудиоустройство от добавления в буфер, а затем вызывает 'stream.start_stream()' после перезапуска сна добавление в буфер. Сроки, похоже, работают, делая это. – aaknitt