进程暂停期间立体声麦克风上的 ALSA 行为

进程暂停期间立体声麦克风上的 ALSA 行为

目标

  • 暂停正在监听的Python进程pcm.record_right(对于Google-Assistant)
  • 继续pcm.record_left在不同的 python 进程中使用(例如雪男孩热词检测)

使用案例

  • 我想使用 Snowboy 检测热词,然后将进一步的语音交互传递给 Google Assistant。对话结束后,我想禁用 Google Assistant,直到我再次向 Snowboy 请求。
  • 我正在使用 Google-Assistant Library SDK,并希望确保它不会监听,除非我允许! (因此使用 SDK 的 mic-mute 命令是不够的。)
  • 我使用的是 Raspberry Pi 3B+ 和外部 USB 立体声麦克风(Blue Snowball)。
  • 我想要暂停和取消暂停助手进程的原因是,如果我完全停止并启动程序,则需要很长时间(从 Snowboy 检测到热词到助手准备就绪之间)。

我尝试过的

  • 我使用了.asoundrc下面的设置。当我暂停助手进程(访问右侧麦克风)时,我arecord使用运行record_left,但出现以下错误。出于测试目的,我使用kill -STOP <pid>kill -CONT <pid>
  • 我还尝试共享麦克风(使用 dsnoop)而不分离左右通道,但遇到了相同的错误。
  • 我还尝试跟踪 Google 的 SDK 禁用麦克风的位置,但他们的示例 Python 代码加载了一个名为libassistant_embedder.sowhich 的共享对象不是开源的

问题

  • 是否可以暂停正在使用 ALSA 设备的 Linux 进程并仍然保持该设备可用?
  • 如果没有,有谁知道 JACK-Audio 是否能够做到这一点?
  • 还有其他可能有效的方法吗?

错误

ALSA lib pcm_dsnoop.c:618:(snd_pcm_dsnoop_open) 无法打开从属 arecord: 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 模块为左右创建两个源。然后,您可以暂停应用程序从一个源读取数据,同时应用程序继续从另一个源读取数据。

你需要两个模块重映射源。使用pacmdpactrl制作它们。尝试直到它起作用(unload-module如果您想更改任何内容,请先删除它们),然后将其放入 Pulseaudio 配置文件中。用于pavucontrol了解您拥有哪些源/接收器以及哪些应用程序正在使用它们,并设置卷。

相关内容