即使在 linux 中没有麦克风,声音输入中也存在声音输出

Posted

技术标签:

【中文标题】即使在 linux 中没有麦克风,声音输入中也存在声音输出【英文标题】:Sound output is present in sound input even with no mic in linux 【发布时间】:2016-05-02 06:33:03 【问题描述】:

我正在尝试同时播放声音并记录压电传感器的电压输出。为此,我将我的音板模拟输出连接到扬声器,并将我的音板模拟输入连接到压电传感器。

当我记录来自传感器的信号但没有播放声音时,它工作得很好。但是,当我在录制过程中播放声音时,我可以在传感器的信号中看到我正在播放的声音,就像音板的输出和输入连接一样。最奇怪的是,即使我拔掉传感器,输出信号仍然存在于录音中。

换句话说,问题是:我开始录制,当我开始播放声音时,它出现在传感器的信号中(即使扬声器关闭)。

我只使用 ALSA,没有安装 pulseaudio。我正在使用python(和pyaudio)生成声音信号,将信号写入音板输出并从音板输入读取数据。我也在 Audacity 中测试过,但结果是一样的。我还用 arecord 进行了测试:

$ arecord --channel=1 --rate=128000 --format=S32_LE Test.wav

然后:

$ mplayer Audio/Alarms/Annoying_Alien_Buzzer-Kevan-1659966176.mp3 

然后停止录制。当我播放Test.wav时,播放文件中的所有声音信号都在那里。

我知道这听起来很明显,但我想说的是,设置中的任何地方都没有连接 MIC。

这里有一些信息:

===================== 盒子:

$ uname -a
Linux MalfattiTux 4.1.12-gentoo #3 SMP Thu Jan 21 17:24:27 BRST 2016 x86_64 Intel(R) Core(TM) i7-4710HQ CPU @ 2.50GHz GenuineIntel GNU/Linux

音频板:

$ lspci | grep -i audio
00:03.0 Audio device: Intel Corporation Xeon E3-1200 v3/4th Gen Core Processor HD Audio Controller (rev 06)
00:1b.0 Audio device: Intel Corporation 8 Series/C220 Series Chipset High Definition Audio Controller (rev 05)## Heading ##

输出设备:

$ aplay -l
**** List of PLAYBACK Hardware Devices ****
card 0: HDMI [HDA Intel HDMI], device 3: HDMI 0 [HDMI 0]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
card 0: HDMI [HDA Intel HDMI], device 7: HDMI 1 [HDMI 1]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
card 0: HDMI [HDA Intel HDMI], device 8: HDMI 2 [HDMI 2]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
card 1: PCH [HDA Intel PCH], device 0: ALC3239 Analog [ALC3239 Analog]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
card 1: PCH [HDA Intel PCH], device 1: ALC3239 Digital [ALC3239 Digital]
  Subdevices: 1/1
  Subdevice #0: subdevice #0

输入设备:

$ arecord -l
**** List of CAPTURE Hardware Devices ****
card 1: PCH [HDA Intel PCH], device 0: ALC3239 Analog [ALC3239 Analog]
  Subdevices: 1/1
  Subdevice #0: subdevice #0

播放和录制的 Python 代码(最小的工作示例):

import array
import pyaudio
import random

Rate = 128000
SoundPulseDur = 5 # in seconds

print('Generating sound pulse...')
SoundNoise = [random.random() for _ in range(round(Rate*SoundPulseDur))]
SoundPulse = [SoundNoise[ElI]*2-1 for ElI,ElV in enumerate(SoundNoise)]
SoundPulse[-1] = 0


print('Interleaving channels...')
SoundList = [0]*(2*len(SoundPulse))
for _ in range(len(SoundPulse)):
    SoundList[_ *2] = SoundPulse[_]
    SoundList[_ *2+1] = 0

Sound = array.array('f')
Sound.fromlist(SoundList)
Sound = bytes(Sound)


print('Generating sound objects...')
# Output
p = pyaudio.PyAudio()
Stimulation = p.open(format=pyaudio.paFloat32,
                channels=2,
                rate=Rate,
                output=True)

# Input
q = pyaudio.PyAudio()
InOn = False
RecStop = True
def InCallBack(in_data, frame_count, time_info, status):
    if InOn:
        global SoundRec
        SoundRec.append(in_data)

    if RecStop:
        InFlag = pyaudio.paComplete
    else:
        InFlag = pyaudio.paContinue
    return(None, InFlag)

Reading = q.open(format=pyaudio.paFloat32,
                     channels=1,
                     rate=Rate,
                     input=True,
                     output=False,
                     stream_callback=InCallBack)

SoundRec = []
Reading.start_stream()
RecStop = False; InOn = True
Stimulation.write(Sound)
InOn = False; RecStop = True
Reading.stop_stream()

【问题讨论】:

【参考方案1】:

这听起来像是您的声卡发出的电噪音。我想你用的是板载卡?如果是这样,除非您想购买更好的/外部声卡,否则您无法避免录制噪音。

关于一个实际的解决方案; 就我个人而言,我会记录我的音频输出,并使用该音频数据来消除压电传感器数据中的噪音。

如果您可以将声音输出读取到压电记录脚本,例如PyAudio

,理论上这也应该可以进行现场直播

【讨论】:

这不是噪音,这是我播放的实际声音!这对我来说很不寻常。如果我在完全不播放声音的情况下录制,我会看到一些噪音,但是当我在录制过程中播放声音时,我可以听到我在上面播放的声音。但是使用声音输出取消信号是一个很好的解决方法,谢谢! :) 没问题。顺便说一句:当说噪音时,我指的不是静态噪音。我的意思是信号输入的意外中断。您的音频放大器可能会因为没有正确地相互隔离而将噪音(音乐)泄漏到您的麦克风输入中,无论是电气还是电磁干扰 (EMI)。 啊啊,现在我明白了。非常感谢您的澄清! 没问题。 PS:如果您认为这是回答您的问题,您可能需要将其标记为这样。

以上是关于即使在 linux 中没有麦克风,声音输入中也存在声音输出的主要内容,如果未能解决你的问题,请参考以下文章

Ubuntu Linux下怎样同时对麦克风及系统声音进行录音

使用单个麦克风进行声音定位 [关闭]

使用 Python 在 Windows 上检测系统声音

如何从 python 中的麦克风获取声音输入,并即时处理它?

win10电脑麦克风没声音

即使窗口存在,FindWindow 在 MASM32 程序中也返回零