프로세스 일시 중지 중 스테레오 마이크의 ALSA 동작

프로세스 일시 중지 중 스테레오 마이크의 ALSA 동작

표적

  • 듣기 Python 프로세스 일시중지 pcm.record_right(Google-Assistant용)
  • pcm.record_left다른 Python 프로세스에서 계속 사용됩니다(예:눈 소년 뜨거운 단어발각)

사용 사례

  • Snowboy를 사용하여 인기 단어를 감지한 다음 추가 음성 상호작용을 Google 어시스턴트에 전달하고 싶습니다. 대화가 끝난 후 Snowboy를 다시 요청할 때까지 Google 어시스턴트를 비활성화하고 싶습니다.
  • Google-Assistant Library SDK를 사용하고 있으며 내가 허용하지 않는 한 이 SDK가 듣지 않도록 하고 싶습니다! (따라서 SDK의 mic-mute 명령을 사용하는 것만으로는 충분하지 않습니다.)
  • 저는 Raspberry Pi 3B+와 외부 USB 스테레오 마이크(Blue Snowball)를 사용하고 있습니다.
  • 어시스턴트 프로세스를 일시 중지하고 일시 중지를 해제하려는 이유는 프로그램을 완전히 중지했다가 시작하면 시간이 오래 걸리기 때문입니다(Snowboy가 핫 워드를 감지한 시간과 어시스턴트가 준비되는 시간 사이).

내가 시도한 것

  • 저는 .asoundrc아래 설정을 사용했습니다. 올바른 마이크에 액세스하기 위해 보조 프로세스를 일시 중지하면 arecordrun을 사용 record_left하지만 다음 오류가 발생합니다. 테스트 목적으로 kill -STOP <pid>및 를 사용하고 있습니다 kill -CONT <pid>.
  • 또한 왼쪽과 오른쪽 채널을 분할하지 않고 마이크 공유(dsnoop 사용)를 시도했지만 동일한 오류가 발생했습니다.
  • 또한 Google의 SDK가 마이크를 비활성화하는 위치를 추적해 보았지만 샘플 Python 코드는 libassistant_embedder.so다음과 같은 공유 개체를 로드합니다.오픈 소스가 아님.

질문

  • ALSA 장치를 사용하는 Linux 프로세스를 일시 중단하고 해당 장치를 계속 사용할 수 있도록 할 수 있습니까?
  • 그렇지 않다면 JACK-Audio가 이것을 할 수 있는지 아는 사람이 있습니까?
  • 효과가 있는 다른 방법이 있나요?

실수

ALSA lib pcm_dsnoop.c:618:(snd_pcm_dsnoop_open) 슬레이브 레코드를 열 수 없습니다: main:788: 오디오 열기 오류: 장치 또는 리소스가 사용 중입니다.

~/.asoundrc의 내용

pcm.!default {
  type asym
  capture.pcm "mic"
  playback.pcm "speaker"
}
pcm.mic {
  type plug
  slave {
    pcm "hw:1,0"
  }
}
pcm.speaker {
  type plug
  slave {
    pcm "hw:0,0"
  }
}
# see: https://alsa.opensrc.org/Dsnoop, section 1.2.3
pcm.record_left {
    type dsnoop
    ipc_key 234884
    slave {
        pcm "hw:1,0"
        channels 2
        rate 48000
    }
    bindings.0  0  #pick one of the stereo mic channels
}
pcm.record_right {
    type dsnoop
    ipc_key 2241234
    slave {
        pcm "hw:1,0"
        channels 2
        rate 48000
    }    
    bindings.0  1  #pick the other of the stereo mic channels
}

답변1

ALSA가 이를 수행할 수 있는지 확실하지 않습니다.

Pulseaudio는 옵션인가요? 이는 소스/싱크에서 전송을 분리하여 Pulseaudio 모듈을 사용하여 왼쪽과 오른쪽에 대한 두 개의 소스를 생성합니다. 그런 다음 애플리케이션이 다른 소스에서 데이터를 계속 읽는 동안 애플리케이션이 한 소스에서 데이터를 읽는 것을 일시 중지할 수 있습니다.

두 개가 필요해모듈 재매핑 소스. 사용하거나 pacmd만들어 pactrl보세요. 작동할 때까지 시도해 보고( unload-module변경하려면 먼저 제거하세요) Pulseaudio 구성 파일에 넣으세요. pavucontrol보유하고 있는 소스/싱크와 이를 사용하는 애플리케이션을 이해하고 볼륨을 설정하는 데 사용됩니다 .

관련 정보