- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我需要使用 Python 3 为一些生物声学实验捕获 192 kHz 音频。我有硬件、Sound Devices USBPre 2 声卡、具有高达 100 kHz 良好频率响应曲线的麦克风,并且我已启用我的操作系统 (ubuntu 13.04) 以 192 kHz 从这张卡中采样。
我试过用 PyAudio 录音。它似乎可以工作,并且会给我一个采样率为 192 kHz 的 wav 文件。然而,当我查看频谱时,没有超过 24 kHz 的功率,这表明 PyAudio 并不是真正在 192 kHz 捕获,而是在 48 kHz 捕获。然而,当我使用来自 JACK 的输入使用 Audacity 进行录音时,我得到了一个不错的录音,功率高达 96kHz。所以,我的印象是 PyAudio 实际上并没有对 192 kHz 的声音进行采样,尽管它应该能够。如何解决这个问题?
我启动 JACK 没有错误:
/usr/bin/jackd -R -dalsa -Chw:1,0 -n3 -o1 -p2048 -r192000
jackd 0.122.0
Copyright 2001-2009 Paul Davis, Stephane Letz, Jack O'Quinn, Torben Hohn and others.
jackd comes with ABSOLUTELY NO WARRANTY
This is free software, and you are welcome to redistribute it
under certain conditions; see the file COPYING for details
JACK compiled with System V SHM support.
loading driver ..
apparent rate = 192000
creating alsa driver ... -|hw:1,0|2048|3|192000|0|1|nomon|swmeter|-|32bit
control device hw:0
configuring for 192000Hz, period = 2048 frames (10.7 ms), buffer = 3 periods
ALSA: final selected sample format for capture: 24bit little-endian
ALSA: use 3 periods for capture
初始化 PyAudio(没有任何真正的错误(据我所知)):
p = pyaudio.PyAudio()
ALSA lib pcm.c:2217:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.rear
ALSA lib pcm.c:2217:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.center_lfe
ALSA lib pcm.c:2217:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.side
bt_audio_service_open: connect() failed: Connection refused (111)
bt_audio_service_open: connect() failed: Connection refused (111)
bt_audio_service_open: connect() failed: Connection refused (111)
bt_audio_service_open: connect() failed: Connection refused (111)
ALSA lib pcm_dmix.c:957:(snd_pcm_dmix_open) The dmix plugin supports only playback stream
打开 PyAudio 流:
stream = p.open(format=pyaudio.paInt32,
channels=1,rate=192000,
input=True,
frames_per_buffer=2048)
我有频谱图的图像,以防有人想验证我的解释,即 PyAudio 没有在 192 kHz 捕获(但 Audacity 可以):
使用 PyAudio 捕获的声音频谱图
使用 Audacity 捕获的声音频谱图
如何使用 PyAudio 以 192 000 采样/秒的速度录制声音?也欢迎提出使用 Python 3 捕获声音的其他方法的建议。
最佳答案
这并不是一个决定性的答案,而是试图帮助您自己找出问题。
当尝试在 OS X 上使用 PyAudio 重现您的问题时,我总是遇到 [Errno Input overflowed] -9981
(例如 several other people ,它 seems )。p.is_format_supported()
报告为正常的配置也导致了这些错误。所以我编写了一个脚本,它只是尝试记录所有可能的记录设置排列。
此脚本探测设备、采样率、格式和 channel 列表的所有排列,在一个防御方式,并将结果保存到根据录制设置命名的文件中。
import os
import pyaudio
import sys
# === These parameters will be permuted ===========
DEVICES = [0, 1, 2]
RATES = [44100, 48000, 192000]
FORMATS = ['Float32', 'Int32', 'Int24', 'Int16', 'Int8', 'UInt8']
CHANNELS = [1, 2]
# =================================================
CHUNK = 1024
COLUMNS = (('filename', 30),
('result', 9),
('dev', 5),
('rate', 8),
('format', 9),
('channels', 10),
('chunk', 7),
('reason', 0))
STATUS_MSG = "Recording... "
pa = pyaudio.PyAudio()
def get_format(format):
fmt = getattr(pyaudio, 'pa%s' % format)
return fmt
def record(filename=None,
duration=5,
dev=0,
rate=44100,
format='Float32',
channels=2,
chunk=1024,):
"""Record `duration` seconds of audio from the device with index `dev`.
Store the result in a file named according to recording settings.
"""
if filename is None:
filename = "dev{dev}-{rate}-{format}-{channels}ch.raw".format(**locals())
result = 'FAILURE'
reason = ''
outfile = open(filename, 'w')
print STATUS_MSG,
sys.stdout.flush()
try:
stream = pa.open(input_device_index=dev,
rate=rate,
format=get_format(format),
channels=channels,
frames_per_buffer=chunk,
input=True,
)
try:
for i in range(0, rate / (chunk) * duration):
a = stream.read(chunk)
outfile.write(a)
result = 'SUCCESS'
# Catch exceptions when trying to read from stream
except Exception, e:
reason = "'%s'" % e
# Catch exceptions when trying to even open the stream
except Exception, e:
reason = "'%s'" % e
outfile.close()
# Don't leave files behind for unsuccessful attempts
if result == 'FAILURE':
os.remove(filename)
filename = ''
info = {}
for col_name, width in COLUMNS:
info[col_name] = str(locals()[col_name]).ljust(width)
msg = "{filename}{result}{dev}{rate}{format}{channels}{chunk}{reason}"
print msg.format(**info)
def main():
# Build the header line
header = 'STATUS'.ljust(len(STATUS_MSG) + 1)
for col_name, width in COLUMNS:
header += col_name.upper().ljust(width)
print header
print "=" * len(header)
# Record samples for all permutations of our parameter lists
for dev in DEVICES:
for rate in RATES:
for format in FORMATS:
for channels in CHANNELS:
record(duration=2,
dev=dev,
rate=rate,
format=format,
channels=channels,
chunk=CHUNK)
if __name__ == '__main__':
main()
样本输出(简化):
STATUS FILENAME RESULT DEV RATE FORMAT CHANNELS CHUNK REASON
==================================================================================================
Recording... dev0-44100-Float32-1ch.raw SUCCESS 0 44100 Float32 1 1024
Recording... dev0-44100-Float32-2ch.raw SUCCESS 0 44100 Float32 2 1024
Recording... dev0-44100-Int16-1ch.raw SUCCESS 0 44100 Int16 1 1024
Recording... dev0-44100-Int16-2ch.raw SUCCESS 0 44100 Int16 2 1024
Recording... FAILURE 0 192000 Float32 1 1024 '[Errno Input overflowed] -9981'
Recording... FAILURE 0 192000 Float32 2 1024 '[Errno Input overflowed] -9981'
Recording... FAILURE 0 192000 Int16 1 1024 '[Errno Input overflowed] -9981'
Recording... FAILURE 0 192000 Int16 2 1024 '[Errno Input overflowed] -9981'
Recording... dev1-44100-Float32-1ch.raw SUCCESS 1 44100 Float32 1 1024
Recording... dev1-44100-Float32-2ch.raw SUCCESS 1 44100 Float32 2 1024
Recording... dev1-44100-Int16-1ch.raw SUCCESS 1 44100 Int16 1 1024
Recording... dev1-44100-Int16-2ch.raw SUCCESS 1 44100 Int16 2 1024
Recording... FAILURE 1 192000 Float32 1 1024 '[Errno Input overflowed] -9981'
Recording... FAILURE 1 192000 Float32 2 1024 '[Errno Input overflowed] -9981'
Recording... FAILURE 1 192000 Int16 1 1024 '[Errno Input overflowed] -9981'
Recording... FAILURE 1 192000 Int16 2 1024 '[Errno Input overflowed] -9981'
Recording... FAILURE 2 44100 Float32 1 1024 '[Errno Invalid number of channels] -9998'
Recording... FAILURE 2 44100 Float32 2 1024 '[Errno Invalid number of channels] -9998'
Recording... FAILURE 2 44100 Int16 1 1024 '[Errno Invalid number of channels] -9998'
Recording... FAILURE 2 44100 Int16 2 1024 '[Errno Invalid number of channels] -9998'
Recording... FAILURE 2 192000 Float32 1 1024 '[Errno Invalid number of channels] -9998'
Recording... FAILURE 2 192000 Float32 2 1024 '[Errno Invalid number of channels] -9998'
Recording... FAILURE 2 192000 Int16 1 1024 '[Errno Invalid number of channels] -9998'
Recording... FAILURE 2 192000 Int16 2 1024 '[Errno Invalid number of channels] -9998'
关于python - 使用 Python 3 捕获 192 kHz 音频,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19692003/
我想做fly应用喜欢this ,我知道我必须进行编码,使其产生超声波,使苍蝇远离一定距离。而且是人耳听不到的声音。 我对 iPhone 中的超声波一无所知。谁能指导我。 提前致谢。 最佳答案 下载超声
我正在学习实现 Goertzel 的算法来从录制的波形文件中检测 DTMF 音调。我从 here 中用 python 实现了一个.它支持以 8 kHz 和 16 kHz 采样的音频。我想扩展它以支持以
我正在用C编写一个小型应用程序,该应用程序从基于云的语音引擎接收mp3音频数据,并以16 khz采样率将其转换为pcm数据(wav格式)。我正在使用libmad解码mp3数据,但没有找到将其从24 k
我想用我的iPhone检测视频中的音频频率。该音调的频率应在17 kHz到20 kHz之间,我发现了一个sample,但是当我在Mac上的模拟器上尝试使用它时,它可以工作,当我将其放在iPhone上以
我尝试将 PCM 音频从 16kHz 转换为 8kHz,只是采样率,没有格式变化,流程看起来很简单,但我一直通过调用 AudioConverterFillComplexBuffermBuffers[0
我有一个 48 kHz PCM 流,并希望将其流式传输到 44.1 kHz 兼容播放器(Apple 的 AirPlay)。 有人知道这是否“有效,因为一些字节会丢失”,或者我是否必须在之前进行转换/下
我最近使用了jRecorder jQuery,但发现它以44 khz记录。我需要将创建的.wav文件转换为8或11 khz,或者找到一个要以44 khz录制的新插件。 有谁知道一个好的插件,或者知道如
我有一个wav文件,每个音频编辑器都告诉我这是一个48kHz,16位的wav文件。 但是,当我右键单击wav文件并打开Windows文件属性对话框时,看到“位速率:1152 kBit / s”。 “位
我刚刚连接了 electret microphone到 Arduino,我想在 1 kHz 的范围内进行采样和 4kHz。 我知道这仅限于机器代码和 ADC ,所以我试图保留 sketch简单。 是
我正在尝试使用 MPU-6000 加速度计和 Raspberry Pi Zero W 来记录挡风玻璃中的振动数据。我对 Python 还很陌生,所以请耐心等待。 我编写了一个 python2 脚本,用
我正在开发一个以 48 kHz 采样率运行的 VoIP 应用程序。由于它使用内部使用 48 kHz 的 Opus 作为其编解码器,并且大多数当前的 Android 硬件本身以 48 kHz 运行,因此
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 2 年前。 Improve this qu
我需要使用 Python 3 为一些生物声学实验捕获 192 kHz 音频。我有硬件、Sound Devices USBPre 2 声卡、具有高达 100 kHz 良好频率响应曲线的麦克风,并且我已启
开始之前:是的,我知道答案是 architecture dependent - 我只对大致数字感兴趣,就数量级而言。 linux内核对中断频率有上限吗? 背景:我想在 Linux 中连接相机模块。该模
我有这个脚本,用于将目录中的所有 wav 文件转换为 44100 hz 的 16 位。但是,它也会转换已经具有这些属性的文件。如何过滤文件以便只转换需要转换的文件? 我正在使用 ubuntu 开发 W
我正在使用带有 microSD 卡的 STM32F4 微 Controller 。我正在通过 DMA 捕获模拟数据。 我使用双缓冲区,一次获取 1280 (10*128 - 10 FFT) 个样本。当
我正在使用 RecorderJS 来录制来自用户的麦克风流。默认导出为 44.1 kHz、16 位的 WAV 文件。无论如何我可以将其降采样到 11kHz 或 16kHz 而不会听起来很奇怪吗? 无论
我尝试在 FFmpeg 中捕获 48 kHz 的音频,代码如下: AVInputFormat* ifmt = av_find_input_format("dshow"); CHECK_POI
我想将音频文件解码为原始 PCM 数据,以将其流式传输到本地网络中的播放设备。我使用新的 MediaExtractor和 MediaCodec API 级别 16 引入的类。该设备要求 PCM 数据为
最近新买了一个USB示波器,想测avr timer0的频率。有一个 12 MHz 晶体振荡器连接到 atmega,timer0 设置为没有预分频器的快速 PWM 模式。这是代码: #include
我是一名优秀的程序员,十分优秀!