我正在寻找一种将文件中的音频数据馈送到麦克风的方法,因此,当第三方应用程序(例如 arecord

或Chromium的“按语音搜索”功能)使用麦克风进行音频输入时,它们会从文件中接收音频数据代替。

这是我的情况

:我编写的一个应用程序记录了来自麦克风的音频数据(使用ALSA)并将其保存到文件(audioFile0.raw)中。在将来的某个未知时间点,某些未知的第三方应用程序(例如,我没有开发的东西,因此我无法对其进行开发控制,例如Chromium

Web浏览器的“语音搜索”功能)将使用麦克风来获取音频数据。我希望第三方应用程序收集的音频数据来自audioFile.raw,而不是实际的麦克风本身。

我在想是否可以将默认的音频输入设备更改为音频文件,或者将其命名为管道,然后执行类似的操作cat audioFile0.raw >

mypipe(因为我不知道何时其他应用程序会尝试从麦克风读取声音)。也许有更简单的方法可以做到这一点?

我希望我提供了足够的细节和清晰度。如果有不清楚的地方,请告诉我。

编辑: 所以我想出了如何通过在主目录中创建以下.asoundrc文件来制作虚拟麦克风的方法:
pcm.!virtmic {
type file
slave.pcm "hw:0,0"
file /dev/null
infile "/home/charles/audioFiles/audioFile0.raw"
}
pcm.!default {
type hw
card 0
}
ctl.!default {
type hw
card 0
}
然后调用arecord test.raw -c 1 -f S16_LE -r 16000 -t raw -D
virtmic命令行,我能够记录音频数据是在audioFile0.raw来test.raw。
我现在的目标是用虚拟麦克风替换默认设备,以便任何访问麦克风的应用程序都将读取音频数据,audioFile0.raw而不是实际的麦克风本身。因此,我编辑了.asoundrc文件,如下所示:
pcm.!virtmic {
type file
slave.pcm "hw:0,0"
file /dev/null
infile "/home/charles/audioFiles/audioFile0.raw"
}
pcm.!default {
type asym
playback.pcm {
type hw
card 0
}
capture.pcm {
type plug
slave.pcm "virtmic"
}
}
ctl.!default {
type hw
card 0
}

然后我arecord test.raw -c 1 -f S16_LE -r 16000 -t

raw从命令行调用。然后我播放了,test.raw但是它似乎是从麦克风本身录制的,而不是audioFile0.raw。

我究竟做错了什么?如何准确更改默认的捕获设备,使其从中读取数据audioFile0.raw而不是从麦克风输入数据?

编辑2:

好的,所以我走对了。我在主目录中使用了与前面显示的相同的.asoundrc文件,在该文件中我将默认设备更改为virtmic。我需要更改文件,/usr/share/alsa/alsa.conf.d/pulse.conf因此它看起来像这样:

# PulseAudio alsa plugin configuration file to set the pulseaudio plugin as
# default output for applications using alsa when pulseaudio is running.
hook_func.pulse_load_if_running {
lib "libasound_module_conf_pulse.so"
func "conf_pulse_hook_load_if_running"
}
@hooks [
{
func pulse_load_if_running
files [
# "/usr/share/alsa/pulse-alsa.conf"
"/home/charles/.asoundrc"
]
errors false
}
]

我唯一要做的就是注释掉该行,"/usr/share/alsa/pulse-

alsa.conf"并用它代替,"/home/charles/.asoundrc"所以pulseaudio插件不是使用ALSA的应用程序的默认设置,而是使用我的虚拟麦克风作为默认设置。这可能不是最佳解决方案,但它可以工作。

当我这样做的时候,这行得通arecord test.raw -t raw -c 1 -f S16_LE -r

16000。它从而audiofile0.raw不是麦克风那里获取数据!我使用该命令lsof

/dev/snd/*来查看在arecord命令运行时访问音频设备的确切位置。输出如下:

COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME

pulseaudi 2044 charles 22u CHR 116,6 0t0 8977 /dev/snd/controlC0

pulseaudi 2044 charles 29u CHR 116,6 0t0 8977 /dev/snd/controlC0

arecord 4051 charles mem CHR 116,5 8976 /dev/snd/pcmC0D0c

arecord 4051 charles 4u CHR 116,5 0t0 8976 /dev/snd/pcmC0D0c

然后,我尝试使用Chromium浏览器的“语音搜索”功能,发现无法从中进行记录audioFile0.raw。然后lsof

/dev/snd/*,我习惯查看访问音频设备的确切方式。
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
pulseaudi 2044 charles mem CHR 116,5 8976 /dev/snd/pcmC0D0c
pulseaudi 2044 charles 22u CHR 116,6 0t0 8977 /dev/snd/controlC0
pulseaudi 2044 charles 29u CHR 116,6 0t0 8977 /dev/snd/controlC0
pulseaudi 2044 charles 30r CHR 116,33 0t0 7992 /dev/snd/timer
pulseaudi 2044 charles 31u CHR 116,5 0t0 8976 /dev/snd/pcmC0D0c

我看到它们都具有相同的PID,即2044。它们都使用pulseaudio守护程序,而不是通过ALSA。

我的问题:

默认情况下,如何让Pulseaudio使用虚拟麦克风,以便所有通过PulseAudio进行音频输入的应用程序将从文件而不是麦克风获取音频数据?