首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >即使在linux中没有麦克风,声音输出也存在于声音输入中。

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

Stack Overflow用户
提问于 2016-01-25 20:01:14
回答 1查看 936关注 0票数 2

我试图同时播放一个声音和记录电压输出从压电传感器。为此,我把我的声音板模拟输出连接到扬声器,我的声音板模拟输入连接到一个压电传感器。

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

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

我只使用ALSA,没有安装脉冲音频。我使用python (和py音频)生成声音信号,将信号写入声音板输出,并从声音板输入中读取数据。我也测试了奥迪,但结果是一样的。我还用一个记录进行了测试:

代码语言:javascript
复制
$ arecord --channel=1 --rate=128000 --format=S32_LE Test.wav

然后:

代码语言:javascript
复制
$ mplayer Audio/Alarms/Annoying_Alien_Buzzer-Kevan-1659966176.mp3 

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

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

以下是一些信息:

====================

方框:

代码语言:javascript
复制
$ 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

音频板:

代码语言:javascript
复制
$ 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 ##

输出设备:

代码语言:javascript
复制
$ 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

输入设备:

代码语言:javascript
复制
$ 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代码(最小的工作示例):

代码语言:javascript
复制
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()
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-01-25 20:56:21

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

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

从理论上讲,这也是可能的,如果您可以读取您的声音输出到压电录音脚本,例如PyAudio

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35001250

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档