Audio 在Linux上共享麦克风音频流

Audio 在Linux上共享麦克风音频流,audio,alsa,pulseaudio,jack,libalsa,Audio,Alsa,Pulseaudio,Jack,Libalsa,重要的是,我的场景是开发一个可访问性应用程序,而不是任何形式的恶意窃听,而在这个场景中也有各种研发隐含的场景,通过同时运行多个不相关的进程(如录音工具和/或我自己的代码的不同版本),可以读取麦克风音频流,这一切都将从中受益匪浅 问题陈述 我正在使用高级python API读取麦克风输入流,如下所示: import sounddevice audio_stream = sounddevice.InputStream( device=self.microphone_device, chan

重要的是,我的场景是开发一个可访问性应用程序,而不是任何形式的恶意窃听,而在这个场景中也有各种研发隐含的场景,通过同时运行多个不相关的进程(如录音工具和/或我自己的代码的不同版本),可以读取麦克风音频流,这一切都将从中受益匪浅

问题陈述 我正在使用高级python API读取麦克风输入流,如下所示:

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上的声音堆栈


我的问题是,这可以直接使用ALSA库API实现,还是通过其他声音堆栈或声音系统配置实现?或者,如果所有其他方法都不起作用,则通过代理程序/驱动程序,该程序/驱动程序能够向多个使用者公开音频缓冲区,而不会导致音频流延迟的明显降低?

因此,我想这更像是一个音频问题,而不是python问题。:) 根据API的不同,流可以是设备专有的,也可以不是设备专有的。例如,用于专业音频的ASIO通常是设备专有的,因此只有一个应用程序(如DAW)可以访问它。例如,在Windows上,您可以打开和关闭此选项,如下所示:

大多数Python包,如pyaudio等,只是为portaudio提供了绑定,这项工作非常繁重,所以也可以看看portaudio文档。Portaudio“结合”了所有不同的API,如ASIO、ALSA、WASAPI、Core Audio等

要使ALSA同时创建多个流,您可能需要dmix,请查看此Stackoverflow问题:

您可以直接使用ALSA执行此操作。我们应该做到这一点。它是ALSA附带的一个插件,允许共享输入流

从我上面链接的页面:

dsnoop
相当于
dmix
插件,但用于录音。
dsnoop
插件允许多个应用程序同时从同一台设备进行录制

来自ALSA:

如果要使用多个输入(捕获)客户端,则需要使用dsnoop插件:

你可以在那里查看有关如何使用它的详细信息。GitHub上的问题也将帮助您入门,它详细介绍了如何配置
dsnoop
接口,以便您可以使用
pyaudio
从中读取

更新 要配置ALSA,请使用如下内容编辑
/etc/asound.conf
(从dsnoop上的

您可以进行测试,看看您的配置是否可以使用以下内容:

arecord -d 30 -f cd -t wav -D pcm.mixin test.wav 

仅供参考,这款产品正是这样做的。不幸的是,它只适用于Windows和MacOS:-(谢谢:-)我不知道会出现什么方向,因为这对我来说可能不是不可能的,我只是需要一些帮助,用正确的概念和术语为我指明正确的方向。这是否为您指明了正确的方向:Alsa环回设备谢谢。这与我的问题有关,但没有指向任何解决方案。我已经看过PulseAudio很多了,但这里没有涉及到从麦克风多路复用输入音频。非常感谢。虽然我在接下来的几天内无法尝试,但这似乎是让dsnoop工作的最佳途径,即使我的系统在
arecord-L
的输出上没有显示its中概述的
cards.pcm.dsnoop
。我想知道是否只能通过命令行根据linux版本上的特定配置文件位置设置设备,因为这是一种硬件配置,v.s.您可以通过一些与dsnoop相关的编程API从代码中完成一些事情。我从中得到的初步印象是,这个ALSA扩展并没有保持很高的速度,对赏金答案的进一步扩充可能有助于抵消我上面的保留意见。您必须应用此配置在声卡出现之前。我不知道你说的“这个ALSA扩展没有保持很高的速度”是什么意思。据我所知,这是正确的做法。
arecord -d 30 -f cd -t wav -D pcm.mixin test.wav