Linux'ta bir mikrofon ses akışını paylaşma

Aug 23 2020

Her ne kadar önemli olursa olsun, benim senaryom, herhangi bir kötü niyetli dinleme değil, bir erişilebilirlik uygulaması geliştirmektir, oysa bu senaryoda, çeşitli araştırma ve geliştirme ima edilen senaryolar vardır ve bunların tümü, mikrofon ses akışını birden çok okuyabilmekten büyük ölçüde yararlanmalıdır. kayıt araçları ve / veya kendi kodumun farklı sürümleri gibi ilgisiz işlemleri aynı anda çalıştırıyorum .

Sorun bildirimi

Aşağıdaki gibi yüksek seviyeli bir python API kullanarak bir mikrofon giriş akışı okuyorum:

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)

Mikrofon ses akışını aynı anda Google Meet / Zoom gibi başka bir programa okumanın mümkün olup olmadığını (Linux'ta) öğrenmek istiyorum. Yani ses akışını etkili bir şekilde paylaşın.

Bahsedilen python sarmalayıcıda olduğu gibi, bir video görüşmesi devam ederken yukarıdaki kod başlatıldığında, akışı açamayacak kadar büyük bir sürpriz değildir:

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

Kuşkusuz, ALSA terminolojisi ve genel olarak linux üzerindeki ses yığını konusunda çok bilgili değilim.

Sorum şu, bu doğrudan ALSA kitaplık API'sı kullanılarak veya başka bir şekilde diğer ses yığınları veya ses sistemi yapılandırması yoluyla gerçekleştirilebilir mi? Ya da ses akışı gecikmesinde gözle görülür bir bozulmaya uğramadan bir ses arabelleğini birden çok tüketiciye sunabilen bir proxy programı / sürücüsü aracılığıyla her şey işe yaramazsa?

Yanıtlar

5 MatthewSalvatoreViglione Aug 26 2020 at 02:14

Bunu doğrudan ALSA ile yapabilirsiniz. Dsnoop hile yapmalı. ALSA'da bulunan ve giriş akışlarının paylaşılmasına izin veren bir eklentidir.

Yukarıda bağladığım sayfadan:

dsnoopdmixeklentinin eşdeğeridir , ancak ses kaydı içindir. dsnoopEklenti aynı anda aynı cihazdan kayıt için çeşitli uygulamalar sağlar.

ALSA belgelerinden :

Birden çok giriş (yakalama) istemcisi kullanmak istiyorsanız, dsnoop eklentisini kullanmanız gerekir:

Nasıl kullanılacağına dair ayrıntılar için etrafı araştırabilirsiniz. GitHub'daki bu sorun aynı zamanda başlamanıza da yardımcı olacaktır, dsnooparayüzün nasıl yapılandırılacağını ayrıntılarıyla okuyarak okuyabilirsiniz pyaudio.

Güncelleme

ALSA'yı yapılandırmak için, /etc/asound.confbunun gibi bir şeyle düzenleyin ( ALSA dokümanlarından itibaren 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
         }
 }

Yapılandırmanızın aşağıdaki gibi çalışıp çalışmadığını test edebilirsiniz:

arecord -d 30 -f cd -t wav -D pcm.mixin test.wav 
2 ArjaanAuinger Aug 23 2020 at 19:27

Yani, bu sanırım bir python sorusundan çok sesli bir sorudur. :) API'ye bağlı olarak, Akışlar cihaza özel olabilir veya olmayabilir. Örneğin, profesyonel ses için ASIO genellikle cihaza özeldir, bu nedenle yalnızca bir uygulamanın (DAW gibi) ona erişimi vardır. Örneğin Windows'ta bunu burada görüldüğü gibi açıp kapatabilirsiniz:

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

Pyaudio ve benzerleri gibi çoğu Python paketi, sadece ağır işi yapan portaudio için bağlama sağlar, bu nedenle portaudio belgelerine de bir göz atın. Portaudio, ASIO, ALSA, WASAPI, Core Audio ve benzeri tüm farklı API'leri "birleştirir".

ALSA'nın aynı anda birden fazla Akış oluşturması için dmix'e ihtiyacınız olabilir, şu Stackoverflow sorusuna bir göz atın: https://unix.stackexchange.com/questions/355662/alsa-doesnt-work-when-multiple-applications-are-opened