如何防止在同一台电脑上从麦克风到扬声器的回声

Posted

技术标签:

【中文标题】如何防止在同一台电脑上从麦克风到扬声器的回声【英文标题】:How to prevent loopback echo from mic to speaker in same pc 【发布时间】:2014-07-20 23:27:13 【问题描述】:

我想将我的电脑用作声音放大器。基本上从麦克风捕获音频并从同一台电脑的扬声器播放放大的声音。我正在使用此代码:

#!/usr/bin/env python
import gi
gi.require_version('Gst', '1.0')
from gi.repository import GObject, Gst, Gtk
GObject.threads_init()
Gst.init(None)

pipeline = Gst.Pipeline()

auto = Gst.ElementFactory.make("autoaudiosrc", "autoaudiosrc")
capsfilter = Gst.ElementFactory.make("capsfilter", "capsfilter")
capsfilter.caps = Gst.caps_from_string('audio/x-raw')
level = Gst.ElementFactory.make("level", "audiolevel")
level.props.interval = 50000000
audiosink = Gst.ElementFactory.make("autoaudiosink", "audiosink")

pipeline.add(auto)
pipeline.add(capsfilter)
pipeline.add(level)
pipeline.add(audiosink)

auto.link(capsfilter)
capsfilter.link(level)
level.link(audiosink)


class ProgressBarWindow(Gtk.Window):
    def __init__(self):
        Gtk.Window.__init__(self, title="ProgressBar Demo")
        self.set_border_width(10)

        vbox = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=6)
        self.add(vbox)

        self.progressbar = Gtk.ProgressBar()
        vbox.pack_start(self.progressbar, True, True, 0)
        bus = pipeline.get_bus()
        bus.add_signal_watch_full(1)
        bus.connect("message", self.on_messages)
        pipeline.set_state(Gst.State.PLAYING)


    def on_messages(self, bus, message):
        t = message.type
        if t == Gst.MessageType.ELEMENT:
           structure = message.get_structure()
           if structure.get_name() == "level":
              rms = structure.get_value("rms")[0]
           if rms < -50:
              rms = -50
           rep = rms + 50

           self.progressbar.set_fraction(rep/50 + 0.1)
           self.progressbar.set_text(str(int(rms)) + " dB")
           self.progressbar.set_show_text(1)


win = ProgressBarWindow()
win.connect("delete-event", Gtk.main_quit)
win.show_all()
Gtk.main()

但是当我运行 python 代码并增加扬声器音量时,播放变得嘈杂并出现无限声音循环。我知道这是物理的,因为麦克风还会一次又一次地捕捉扬声器的声音。但是有没有一种基于pythonic或软件的方法来防止这种情况?谢谢。

【问题讨论】:

您所做的正是引起反馈的事情。你想达到什么目标;你想放大什么? 实际上放大声音不是我的主要目标。基本上只播放麦克风捕获的音频。 【参考方案1】:

如果您引入时间延迟(可能是 FIFO 缓冲区),则可以避免反馈尖叫。这样渲染的音频就没有实时的前向反馈循环了。

【讨论】:

以上是关于如何防止在同一台电脑上从麦克风到扬声器的回声的主要内容,如果未能解决你的问题,请参考以下文章

WebRTC回声消除

win10realtek高清晰音频管理器怎么设置

如何检查麦克风和扬声器是不是来自同一声卡?

简述音频3A算法概念

语音通信系统中的回声产生和影响

频率分析 - Novocaine 和麦克风播放:如何禁用扬声器输出?