Совместное использование аудиопотока с микрофона в Linux

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

Постановка задачи

Я читаю входной поток с микрофона, используя API Python высокого уровня, например:

import sounddevice

audio_stream = sounddevice.InputStream(
  device=self.microphone_device,
  channels=max(self.channels),
  samplerate=self.audio_props['sample_rate'],
  blocksize=int(self.audio_props['frame_elements_size']),
  callback=self.audio_callback)

Я хотел бы узнать, возможно ли (в Linux) читать аудиопоток микрофона одновременно с другой программой, такой как Google Meet / Zoom, читающей его. Т.е. эффективно делиться аудиопотоком.

Как и в случае с упомянутой оболочкой python, неудивительно, что, когда приведенный выше код запускается во время видеозвонка, он просто не может открыть поток:

Expression 'paInvalidSampleRate' failed in 
'src/hostapi/alsa/pa_linux_alsa.c', line: 2043 
Expression 'PaAlsaStreamComponent_InitialConfigure( &self->playback, outParams, self->primeBuffers, hwParamsPlayback, &realSr )' 
failed in 'src/hostapi/alsa/pa_linux_alsa.c', line: 2716 
Expression 'PaAlsaStream_Configure( stream, inputParameters, outputParameters, sampleRate, framesPerBuffer, &inputLatency, &outputLatency, &hostBufferSizeMode )' 
failed in 'src/hostapi/alsa/pa_linux_alsa.c', line: 2837

По общему признанию, я еще не очень хорошо разбираюсь в терминологии ALSA и в целом в звуковом стеке Linux.

У меня вопрос: можно ли это сделать напрямую с помощью API библиотеки ALSA или иным образом с помощью других звуковых стеков или конфигурации звуковой системы? Или, если все остальное не предназначено для работы, через прокси-программу / драйвер, который может предоставить аудиобуфер нескольким потребителям без заметного ухудшения задержки аудиопотока?


person matanster    schedule 22.08.2020    source источник
comment
К вашему сведению, Dante Via - это продукт, который делает именно это. К сожалению, он доступен только для Windows и MacOS.   -  person kaylum    schedule 23.08.2020
comment
:-( Спасибо :-) Мне интересно, какие направления появятся, поскольку это может не казаться мне априори невозможным, мне просто нужна помощь, указывающая мне в правильном направлении с правильными концепциями и терминологией.   -  person matanster    schedule 23.08.2020
comment
Указывает ли это вас в правильном направлении? Re: устройство обратной связи Alsa askubuntu.com/questions/895216/   -  person Rolf of Saxony    schedule 25.08.2020


Ответы (2)


Вы можете сделать это напрямую с помощью ALSA. Dsnoop должен помочь. Это плагин, включенный в ALSA, который позволяет обмениваться входными потоками.

Со страницы, на которую я ссылался выше:

dsnoop эквивалент плагина dmix, но для записи звука. Плагин dsnoop позволяет нескольким приложениям одновременно записывать с одного устройства.

Из документации ALSA:

Если вы хотите использовать несколько клиентов ввода (захвата), вам необходимо использовать плагин dsnoop:

Вы можете найти там подробную информацию о том, как его использовать. Эта проблема на GitHub также поможет вам начать работу, в ней подробно описано, как настроить интерфейс dsnoop, чтобы вы могли читать его с помощью pyaudio.

Обновлять

Чтобы настроить ALSA, отредактируйте /etc/asound.conf примерно так (из документации ALSA на dsnoop):

pcm.mixin {
         type dsnoop
         ipc_key 5978293 # must be unique for all dmix plugins!!!!
         ipc_key_add_uid yes
         slave {
                 pcm "hw:1,0"
                 channels 2
                 period_size 1024
                 buffer_size 4096
                 rate 44100
                 periods 0
                 period_time 0
         }
         bindings {
                 1 1
                 1 0
         }
 }

Вы можете проверить, работает ли ваша конфигурация примерно так:

arecord -d 30 -f cd -t wav -D pcm.mixin test.wav 
person Matthew Salvatore Viglione    schedule 25.08.2020
comment
Большое Вам спасибо. Хотя я не могу попробовать это в ближайшие несколько дней, похоже, что это лучший способ заставить dsnoop работать, даже если моя система не показывает cards.pcm.dsnoop на выходе arecord -L, как указано в его основная (?) документация. - person matanster; 29.08.2020
comment
Интересно, можно ли настроить устройство только через командную строку в соответствии с конкретным расположением файла конфигурации в вашей версии Linux, поскольку это своего рода конфигурация оборудования, v.s. кое-что, что вы можете выполнить из кода через некоторый программный API, связанный с dsnoop. - person matanster; 29.08.2020
comment
Из этого я мог получить первоначальное впечатление, что это расширение ALSA не поддерживает очень высокую скорость, и некоторые дальнейшие дополнения к ответу о вознаграждении могут потенциально помочь компенсировать в свете моих оговорок выше. - person matanster; 31.08.2020
comment
Вам нужно будет применить эту конфигурацию до того, как появится звуковая карта. - person Matthew Salvatore Viglione; 02.09.2020
comment
Я не уверен, что вы имеете в виду, говоря, что это расширение ALSA не поддерживает очень высокую скорость. Насколько мне известно, это правильный способ сделать это. - person Matthew Salvatore Viglione; 02.09.2020

Итак, я думаю, это больше вопрос аудио, чем вопрос Python. :) В зависимости от API Streams могут быть эксклюзивными для устройства или нет. Например, ASIO для профессионального звука часто является эксклюзивным для устройства, поэтому доступ к нему имеет только одно приложение (например, DAW). Например, в Windows вы можете включать и выключать это, как показано здесь:

https://help.ableton.com/hc/en-us/articles/209770485-Dispting-exclusive-mode-for-ASIO-interfaces

Большинство пакетов Python, таких как pyaudio и т. Д., Просто предоставляют привязки для portaudio, который выполняет тяжелую работу, поэтому также ознакомьтесь с документацией portaudio. Portaudio сочетает в себе все различные API, такие как ASIO, ALSA, WASAPI, Core Audio и т. Д.

Чтобы ALSA могла создавать более одного потока одновременно, вам может понадобиться dmix, взгляните на этот вопрос Stackoverflow: https://unix.stackexchange.com/questions/355662/alsa-doesnt-work-приоткрытиинесколькихприложений

person Arjaan Auinger    schedule 23.08.2020
comment
Спасибо. Это относится к моему вопросу, но не указывает на какое-либо решение. Я уже немного изучил PulseAudio, но здесь ничего не связано с мультиплексированием входного звука с микрофона. - person matanster; 23.08.2020