python发出声音linux,python - 即使Linux中没有麦克风,声音输入中也存在声音输出 - 堆栈内存溢出...

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

当我记录来自传感器的信号但不播放声音时,它可以完美工作。 但是,当我在录制过程中播放声音时,可以在传感器的信号中看到我正在播放的声音,就像连接了音板的输出和输入一样。 最奇怪的是,即使我拔下传感器的插头,记录中仍然存在输出信号。

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

我仅使用ALSA,未安装pulseaudio。 我正在使用python(和pyaudio)生成声音信号,将信号写入声音板输出,并从声音板输入中读取数据。 我也在Audacity中进行了测试,但结果是相同的。 我还测试了一个记录:

$ 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()

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值