![进程暂停期间立体声麦克风上的 ALSA 行为](https://linux22.com/image/146320/%E8%BF%9B%E7%A8%8B%E6%9A%82%E5%81%9C%E6%9C%9F%E9%97%B4%E7%AB%8B%E4%BD%93%E5%A3%B0%E9%BA%A6%E5%85%8B%E9%A3%8E%E4%B8%8A%E7%9A%84%20ALSA%20%E8%A1%8C%E4%B8%BA.png)
目标
- 暂停正在监听的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.so
which 的共享对象不是开源的。
问题
- 是否可以暂停正在使用 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 模块为左右创建两个源。然后,您可以暂停应用程序从一个源读取数据,同时应用程序继续从另一个源读取数据。
你需要两个模块重映射源。使用pacmd
或pactrl
制作它们。尝试直到它起作用(unload-module
如果您想更改任何内容,请先删除它们),然后将其放入 Pulseaudio 配置文件中。用于pavucontrol
了解您拥有哪些源/接收器以及哪些应用程序正在使用它们,并设置卷。