Я ищу способ передать аудиоданные из файла в микрофон, чтобы, когда сторонние приложения (такие как arecord или функция "голосового поиска" Chromium) использовали микрофон для ввода звука, они вместо этого получить аудиоданные из файла.
Вот мой сценарий: написанное мной приложение записывает аудиоданные с микрофона (используя ALSA) и сохраняет их в файл (audioFile0.raw). В какой-то неизвестный момент времени в будущем какое-то неизвестное стороннее приложение (например, то, что я не разрабатывал, поэтому у меня нет контроля над разработкой, например, функция "голосового поиска" в веб-браузере Chromium) будет использовать микрофон для получить аудиоданные. Я хотел бы, чтобы аудиоданные, которые собирает стороннее приложение, поступали из 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 в моем домашнем каталоге, который я показал ранее, где я изменил устройство по умолчанию на виртуальное устройство. Мне нужно было изменить файл /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 для ввода звука, вместо этого получали аудиоданные из моего файла, а не с микрофона?
arecord
не указывает имя устройства и использует устройство по умолчанию. (И программа всегда может явно использовать другое имя устройства.) - person CL.   schedule 19.04.2017