Удаление шума в реальном времени с PulseAudio?

Можно ли в режиме реального времени удалять шум с помощью PulseAudio, чтобы выходной звуковой сигнал был более плавным?

10 ответов

Решение

Pulseaudio модуль module-echo-cancel

Я начал много читать о PulseAudio и "скрытых" опциях, которые у него были, чтобы найти тот, который был похож на этот вопрос. Я обнаружил модуль шумоподавления, который значительно снижает любой статический шум на микрофоне и даже ОЧЕНЬ много фонового шума, в основном давая вам преимущество только в том, чтобы записывать свой голос с превосходным качеством (для записи звука например). Для этого выполните следующие действия:

  1. sudo nano /etc/pulse/default.pa

  2. Добавьте следующую строку в любом месте файла, но я рекомендую почти в конце, где вы найдете комментарий о материале Echo Cancellation (~ строка 140):

    load-module module-echo-cancel
    
  3. Перезагрузить PulseAudio (pulseaudio -k) или просто перезагрузите компьютер. Вы должны быть в состоянии выбрать новую опцию шумоподавления в разделе устройства ввода:

Вы можете найти больше информации об этом на странице модуля Echo Cancel.

Установить вход по умолчанию

Если вы хотите установить по умолчанию устройство эхоподавления, просто превратите приведенную выше строку в:

load-module module-echo-cancel source_name=logitechsource

а затем внизу файла добавить

set-default-source logitechsource

В этом случае я назвал источник logitechsource, но вы можете назвать его как хотите и просто перезапустить pulseaudio.

Переименовать устройство

Наконец, если вы не хотите, чтобы в настройках звука было слишком длинное имя (когда вы хотите выбрать устройство ввода / вывода). Мое предложение переименовывает устройство ввода следующим образом:

load-module module-echo-cancel source_name=logitechsource source_properties=device.description=LogitechHD

И снова перезапуск пульсаудио. Конечный результат выглядит так:

Это старый вопрос, но у меня была та же проблема, и после некоторого поиска в Google (где я в основном находил людей, которые согласились, что это невозможно), и, читая некоторые справочные страницы, я теперь разработал решение, основанное на идее user2330377.

Сначала вам нужно создать шумовой профиль для SoX. Просто используйте любую программу для записи звука, чтобы записать несколько секунд шума, а затем cd в каталог, в котором вы сохранили его и делаете sox noise.wav -n noiseprof noise.prof,

Затем вам нужно создать петлевое устройство ALSA:

sudo modprobe snd_aloop

Это необходимо, потому что pulseaudio, в отличие от Джека, не может напрямую соединять аудио программное обеспечение вместе; следовательно, мы будем использовать петлевое устройство в качестве прокси.

Теперь вам нужно начать paman и найдите имена вашего микрофона (или другого записывающего устройства) и только что созданного петлевого устройства. После того, как они найдены, вы можете выполнить следующую команду, чтобы начать запись звука с вашего микрофона, передать его через SoX и затем воспроизвести на петлевом устройстве:

pacat -r -d alsa_input.pci-0000_00_14.2.analog-stereo --latency=1msec|sox -b 16 -e signed -c 2 -r 44100 -t raw - -b 16 -e signed -c 2 -r 44100 -t raw - noisered noise.prof 0.2|pacat -p -d alsa_output.2.analog-stereo --latency=1msec

(Там, где вам необходимо подставить правильные имена устройств для параметров -d - устройство ввода для первого вызова pacat и выход устройства loopback для второго.)

Вот и все, почти готово! В качестве последнего шага начните запись звука с приложением по вашему выбору, затем запустите pavucontrolПерейдите на вкладку "Запись" и установите аудиоустройство, используемое для записи (отображается серой кнопкой справа), на "Монитор Loopback Audio Device". Теперь у вас должна быть чистая и бесшумная запись!

Такое простое решение для Ubuntu LTS или дистрибутивов на основе Debian - это онлайн-скрипт, который активирует функцию шумоподавления, которая уже находится в импульсном аудио (аудио по умолчанию в debian).

wget -qO - https://gist.githubusercontent.com/grigio/cb93c3e8710a6f045a3dd9456ec01799/raw/94f07c7d75bcf5dd9b08a9c3034844223ec6fbe1/fix-microphone-background-noise.sh | sudo bash && pulseaudio -k

вы также можете запустить эти команды в разделе (это одно и то же)

sudo cp /etc/pulse/default.pa /etc/pulse/default.pa.bak
sudo cat <<EOT >> /etc/pulse/default.pa
load-module module-echo-cancel source_name=noechosource sink_name=noechosink
set-default-source noechosource
set-default-sink noechosink
EOT

я использую NoiseTorchв Arch Linux прост в использовании и установке => NoiseTorch Github Link

На странице документации модуля нет информации о подавлении шума. Внутри модуля echo-cancel есть только алгоритм AEC (Acoustic Echo Cancellation), который имеет несколько реализаций, например webrtc | Speex.

Поэтому вы должны купить гарнитуру | микрофоны со встроенной функцией шумоподавления.

Когда я тестировал запись голоса в Ubuntu, я обнаружил некоторые особые качества:

  • Skype, Telegram использует необработанный ввод с устройства по умолчанию (в моем случае разъемы front-in-mic|backward-mic). Если вам нужно отменить шум в этих приложениях, вам следует покупать гарнитуры | микрофоны только с интегрированной функцией шумоподавления

  • Если вам нужно использовать голосовые вызовы в браузере, то вы должны иметь в виду, что браузеры имеют свои собственные реализации алгоритмов обработки голоса, например, WebRTC.

  • Кроме того, веб-приложения (такие сайты, как Talky, Hangouts, emerge.in и т. Д.) Могут иметь собственные реализации алгоритмов обработки голоса, несмотря на то, что они могут быть основаны на анализе Hangouts Webrtc

Расследование показывает, что не существует известного способа фильтрации шума в реальном времени с какой-либо подсистемой Linux. Некоторые веб-сайты указывают на аппаратное обеспечение, которое вы можете купить, которое должно работать лучше, чем программный фильтр.

В качестве альтернативы, если это для записи, вы можете пропустить звук через Audacity и использовать там шумовой фильтр.

Есть плагин шумоподавления для module-ladspa-sink:

Здесь вы можете найти руководство по установке в Fedora и 2 примера записей, чтобы получить представление об эффектах плагина:

На Убунту:

  1. Загрузите linux_rnnoise_bin_x64.tar.gz
  2. Из архива скопируйте bin/ladspa/librnnoise_ladspa.soнапример, в или где-либо еще.
  3. Узнайте имя вашего ввода, используя pactl list sources short. Например мой микрофон называется
  4. Запустите приведенные ниже команды, чтобы активировать шумоподавление (перед запуском замените /usr/local/lib/librnnoise_ladspa.soа также alsa_input.usb-046d_0994_4A365E20-02.mono-fallbackк вашим значениям, определенным на шагах 2. и 3.):
          pacmd load-module module-null-sink sink_name=mic_denoised_out
    pacmd load-module module-ladspa-sink sink_name=mic_raw_in \
        sink_master=mic_denoised_out label=noise_suppressor_mono \
        plugin=/usr/local/lib/librnnoise_ladspa.so \
        control=50
    pacmd load-module module-loopback \
        source=alsa_input.usb-046d_0994_4A365E20-02.mono-fallback \
        sink=mic_raw_in channels=1 source_dont_move=true sink_dont_move=true
    pacmd load-module module-remap-source source_name=denoised \
        master=mic_denoised_out.monitor channels=1
  1. В приложении для записи голоса вы настроите аудиовход с Null outputили же Remapped monitor of null outputи тест (я использовал Skype Echo)

  2. Чтобы сделать изменения постоянными, добавьте команды из шага 4 в /etc/pulse/default.pa, опуская pacmdв начале каждой строки.

у моего ноутбука amd такая же проблема, код ниже отменяет мой шум:

      sudo nano /etc/pulse/default.pa

## add below code on bottom
### Enable Echo/Noise-Cancelation
load-module module-echo-cancel aec_method=webrtc aec_args="analog_gain_control=0 digital_gain_control=1" source_name=echoCancel_source sink_name=echoCancel_sink
set-default-source echoCancel_source
set-default-sink echoCancel_sink
### 2nd tips
.ifexists module-echo-cancel.so
load-module module-echo-cancel aec_method=webrtc source_name=echocancel sink_name=echocancel1
set-default-source echocancel
set-default-sink echocancel1
.endif

Надеюсь, кому-нибудь помогут

Вот как минимум, реализовать webrtc-aec в

http://wiki.gentoo.org/wiki/PulseAudio

webrtc-aec Да Использует библиотеку аудиообработки webrtc.org для значительного улучшения VoIP-вызовов в приложениях, которые поддерживают ее, выполняя акустическое эхоподавление, аналоговое управление усилением, подавление шума и другую обработку.

Вот статья на эту тему от 2013 года (устранение шума с помощью pulseaudio, а не webrtc-aec) http://lac.linuxaudio.org/2013/papers/37.pdf

"Мы представили первые результаты многоканального решения по снижению шума / эха, построенного на основе PulseAudio и мотивированного проектными решениями. Работа привела к ряду улучшений в структуре эхоподавления и обработки сигналов PulseAudio, которые были участвовал в цикле разработки версии 3.0 / 4.0 и должен способствовать будущим встроенным аудио-решениям для Linux. Дальнейшая работа включает в себя оптимизацию кода для микширования аудиопотока, более эффективные методы повторной дискретизации и внедрение эффективного AEC в конвейере многоканальной обработки ".

Если вы используете дистрибутив, который используетpipewireвместоpulseaudio(например, PopOS 22.04+) вы можете создать источник/микрофон с эхоподавлением, выполнив следующие действия:

  1. cp /usr/share/pipewire/pipewire.conf ~/.config/pipewire/pipewire.conf(создайте каталог, если он еще не существует).

  2. Добавьте этот фрагмент из документов в активный модуль, чтобы у вас было следующее в вашемpipewire.conf:

             context.modules = [
    
      # ... Lots of other modules loaded here
    
      {   name = libpipewire-module-echo-cancel
          args = {
              # library.name  = aec/libspa-aec-webrtc
              # node.latency = 1024/48000
              source.props = {
                 node.name = "Echo Cancellation Source"
              }
              sink.props = {
                 node.name = "Echo Cancellation Sink"
              }
          }
      }
    ]
    
  3. Перезапустить пайпвайр:systemctl --user restart pipewire.service

Вы можете прослушать результаты, записав свой голос, используя что-то вродеsimplescreenrecorderили выполнив эту командуgst-launch-1.0 pulsesrc ! pulsesink(убедитесь, что у вас есть наушники, иначе микрофон улавливает звук из динамика, вызывая неприятный шум обратной связи).

Я лично считаю, что шумоподавление с помощью модулей эхоподавления делает мой голос более естественным по сравнению с использованием программы, способной к более агрессивному шумоподавлению, такой как NoiseTorch. Тем не менее, эхоподавление в основном подходит для устранения шума вашего вентилятора и тому подобного, тогда как NoiseTorch может автоматически отключать звук вашего микрофона, когда вы не говорите, в дополнение к удалению некоторого шума во время разговора.

Другие вопросы по тегам