如何防止同一台电脑上麦克风到扬声器的回声?
我想把我的电脑当作一个音响放大器。简单来说,就是从麦克风捕捉声音,然后把放大的声音通过同一台电脑的扬声器播放出来。我正在使用这段代码:
#!/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代码并提高扬声器音量时,播放的声音就变得很吵,还出现了无限的声音循环。我知道这是因为麦克风会不断捕捉到扬声器发出的声音。但有没有什么Python或者软件方面的方法可以防止这种情况发生呢?谢谢。
1 个回答
0
如果你想避免反馈尖叫的声音,可以引入一个时间延迟,可能使用一个先进先出的缓冲区。这样处理后,播放的音频就不会有实时的反馈循环了。