Время обратного вызова звукового устройства Python. InputBufferAdcTime возвращает 0

Моя конечная цель - одновременно выводить файл wav и записывать на микрофон и отображать их друг на друге на графике. Это не требует малой задержки, но требует, чтобы два графика были наложены таким образом, чтобы они правильно отображали то, что происходит в реальном времени. Если я подключу микрофонную линию к линии громкоговорителей, графики должны относительно хорошо выровняться друг над другом.

вывод поверх входного графика

Поскольку кажется, что есть некоторая задержка, мое решение - использовать переменную времени, заданную обратным вызовом. Это должно позволить мне соответствующим образом сместить график при его построении для корректировки задержки. Я получаю соответствующие значения для времени ЦАП и текущего времени, но время АЦП дает мне 0.

def callback(indata, outdata, frames, time, status):
print "ADC time: ", time.inputBufferAdcTime
print "DAC time: ", time.outputBufferDacTime
print "curr time: ", time.currentTime
print "time diff: ", time.outputBufferDacTime - time.currentTime
print "###############"
if status:
    print(status)
if len(data[callback.index:]) < frames:
    outdata[:len(data[callback.index:])] = data[callback.index:]
    outdata[len(data[callback.index:]):] = np.zeros(
        ((len(outdata) - len(data[callback.index:])), len(args.channels)))
    raise sd.CallbackStop
else:
    outdata[:] = data[callback.index:callback.index + frames]
q_out.put(outdata[::args.downsample, mapping])
q_in.put(indata[::args.downsample, mapping])

callback.index += frames

person Don    schedule 11.09.2018    source источник


Ответы (1)


Если inputBufferAdcTime дает 0, это проблема PortAudio. Скорее всего, это зависит от API хоста, который вы используете, и, вероятно, от вашего оборудования и драйверов. Вам следует спросить в списке рассылки PortAudio (http://portaudio.com/contacts.html), если вы хотите узнать об этом больше.

Или вы можете попробовать другой API хоста, он может работать лучше.

Вы также можете попробовать запросить задержку объекта потока, но может иметь ту же проблему.

Наконец, если вы не можете таким образом получить правильную задержку, вы можете просто измерить ее самостоятельно. Просто подключите кабель от выхода звуковой карты к входу, воспроизведите тестовый сигнал и запишите результат (как вы это делали в примере кода). Вы сможете найти значение задержки, сравнив два сигнала.

person Matthias    schedule 12.09.2018
comment
Мое текущее решение - сделать то, что вы предлагали последним. У меня есть тестовый аудиофайл с одним импульсом, который я использую для калибровки. К сожалению, похоже, что латентность может измениться. Несмотря на то, что это небольшое изменение, оно достаточно велико, чтобы повлиять на то, что я пытаюсь сделать. Значения задержки во время калибровки варьируются от 0,125 до 0,14 секунды. Атрибут задержки объекта потока возвращает два значения каждый раз, когда я смотрю на него в обратном вызове: 0,02575 для ввода и 0,0257596 для вывода. Я собираюсь взглянуть на ваше первое предложение и посмотреть, к чему это приведет. TY - person Don; 12.09.2018
comment
Я нашел пока достойное решение. Я увеличил размер блока, используемого для ввода / вывода, с 1366 до 8000. Это резко увеличивает задержку до 0,422 секунды, но стабильность задержки намного выше. Это позволяет использовать метод калибровки. - person Don; 12.09.2018
comment
Вы также можете попробовать использовать размеры блоков, равные степени двойки (например, 1024). Это может дать вам более стабильную работу. - person Matthias; 13.09.2018