Создайте аудио фильтр в реальном времени для петли Alsa/Pulse
Я хотел бы воспроизвести эффект наушников с активным шумоподавлением, используя обычные наушники и компьютер с Linux, чтобы приглушить любой амбиентный шум в реальном времени (а не просто очистить звуковой вход от фонового шума).
Планируется зациклить вход микрофона через Alsa/Pulseaudio, применить узкополосный фильтр с подавлением шума с прямой связью (как фильтр LADSPA?), А затем вывести результат на наушники.
Проблема в том, что я не знаю, с чего начать для части фильтра: как мне подключить ее к Alsa/Pulseaudio? Есть ли какой-то C API, который можно использовать для создания пользовательского фильтра?
1 ответ
1) Я рекомендую делать это в Pulseaudio; перенаправление вывода ALSA через ваш фильтр будет более сложным.
2) Уже есть такие модули, как module-ladspa-sink
для Pulseaudio, подробности, например, здесь. Модуль пересылает обработанный звук LADSPA на master
, но так как вам нужны и микрофонный вход, и звук компьютера, вам, возможно, придется использовать некоторые другие модули (например, комбинированный приемник, нулевой приемник в качестве виртуального выходного приемника) и / или команды loopaudio loopback для пересылки их обоих на разные наборы каналов на модуль LADSPA.
Возможно, вы также можете загрузить два модуля LADSPA, использовать один в качестве виртуального выхода, петлевой микрофонный вход в другой и обрабатывать оба из одного плагина LADSPA - я не пробовал, но если он работает, он может быть проще.
3) Для Pulseaudio уже есть модули шумоподавления и эхоподавления, которые используются, например, в смартфонах на базе Linux; может быть, один из них достаточно хорош для ваших нужд. Google.
4) Если ничего не помогает, или если одних только фильтров LADSPA недостаточно, посмотрите на источник этого модуля (или других модулей Pulseaudio) и измените его соответствующим образом.
Из debianuser на IRC, и у меня это работает. Замените на то, что ваша карта названа в / proc / asound / cards. Вы можете отредактировать это имя в /etc/modprobe.d/alsa-base.conf или аналогичном в строке 'options snd-mycard id="mycardname" enable=1'.
defaults.pcm.dmix.!rate 48000
defaults.pcm.dmix.!format S16_LE
pcm.multi {
type multi
slaves.a.pcm "dmix:RealCardName"
slaves.a.channels 2
slaves.b.pcm "dmix:Loopback"
slaves.b.channels 2
bindings.0 { slave a; channel 0; }
bindings.1 { slave a; channel 1; }
bindings.2 { slave b; channel 0; }
bindings.3 { slave b; channel 1; }
}
pcm.both {
type route
slave.pcm "multi"
ttable.0.0 1
ttable.1.1 1
ttable.0.2 1
ttable.1.3 1
}
pcm.!default {
type asym
playback.pcm "plug:both"
capture.pcm "plug:dsnoop:RealCardName"
}
pcm.nowplaying "plug:\"dsnoop:Loopback,1\""`