我在Ubuntu 10.10 x64中的Enthought Python Distribution(Python 2.6.6)下使用PyAudio.
>>> import pyaudio
>>> pa = pyaudio.PyAudio()
>>> pa.get_default_input_device_info()
Traceback (most recent call last):
File "<pyshell#24>", line 1, in <module>
pa.get_default_input_device_info()
File "/usr/lib/python_epd/lib/python2.6/site-packages/pyaudio.py", line 936, in get_default_input_device_info
device_index = pa.get_default_input_device()
IOError: No Default Input Device Available
Run Code Online (Sandbox Code Playgroud)
如果我尝试打开输入流,这是我得到的相同错误.存在相应的错误"IOError:No Default Output Device Available"
我想制作一个程序,用PortAudio录制音频数据(我完成了这部分),然后显示录制音频的频率信息(现在,我想显示每组样本的平均频率)因为他们进来了).
从我做过的一些研究中,我知道我需要进行FFT.所以我用谷歌搜索了一个库,用C语言,找到了FFTW.
但是,现在我有点失落了.我应该怎么处理我记录的样本以从中提取一些频率信息?我应该使用什么样的FFT(我假设我需要一个真实的数据1D?)?
一旦我进行了FFT,如何从它给出的数据中获取频率信息?
编辑:我现在也发现了自相关算法.好点吗?更简单?
非常感谢,对不起,如果这样,我绝对没有经验.我希望它至少有点意义.
我有一个使用PortAudio的程序.目前我正在启动它Pa_OpenDefaultStream(&stream, 0, 2, paFloat32, 44100, 256, audioCB, udata),但是当我编译并运行我的程序时,如果当前正在运行另一个程序(例如音乐播放器),它将不会播放声音.错误字符串是PortAudio error: Device unavailable
我认为我需要运行Pa_OpenStream,但我不确定我应该通过它来使它与其他程序一起运行.
作为参考,我尝试打印出可用设备上的信息,但我不知道如何处理这些信息.
Device 0
name /dev/dsp
hostAPI 0
maxInputChannels 16
maxOutPutChannels 0
defaultLowInputLatency 0.011610
defaultLowOutputLatency -0.117208
defaultHighInputLatency 0.046440
defaultHighOutputLatency 0.000000
defaultSampleRate 44100.000000
Device 1
name /dev/dsp1
hostAPI 0
maxInputChannels 16
maxOutPutChannels 0
defaultLowInputLatency 0.011610
defaultLowOutputLatency -0.117208
defaultHighInputLatency 0.046440
defaultHighOutputLatency 0.000000
defaultSampleRate 44100.000000
Default Device -1
Run Code Online (Sandbox Code Playgroud)
在写这个问题时,我也注意到maxOutputchannels的变化取决于是否有另一个程序试图播放声音.至少我认为这才是最重要的.我在关闭的另一个浏览器选项卡中有一个暂停的youtube视频,当我重新编写我的程序时,它打印出来:
Device 0
name /dev/dsp
hostAPI 0
maxInputChannels 16
maxOutPutChannels 16
defaultLowInputLatency 0.011610
defaultLowOutputLatency 0.011610
defaultHighInputLatency 0.046440
defaultHighOutputLatency 0.046440 …Run Code Online (Sandbox Code Playgroud) 我最近一直在玩ruby,我决定开始一个简单的项目来编写一个ruby脚本来记录.wav文件的输入声音.我发现ruby不能提供对硬件设备的非常好的访问(它可能不应该),但PortAudio确实如此,我在这里发现了一个伟大的PA包装器(它不是宝石,我想因为它使用了ruby的ffi附加到PortAudio,PA库可以在各种地方).我一直在弄乱PortAudio的文档和示例来弄清楚PA是如何工作的.多年来我没有写过或读过C.
我在创建过程中应该将哪些参数传递给流,以及创建期间的缓冲区时遇到了困难.例如,究竟是一个frame,以及它是如何与其他参数,如channel和sample rate.我对音频编程也很陌生,所以如果有人能指点我一些关于设备级音频的一般教程等,我会很感激.
ruby-portaudio提供了一个创建流和缓冲区的示例,将sin波写入缓冲区,然后将缓冲区发送到要播放的流.我在示例中遇到一些问题,特别是循环块.
PortAudio.init
block_size = 1024
sr = 44100
step = 1.0/sr
time = 0.0
stream = PortAudio::Stream.open(
:sample_rate => sr,
:frames => block_size,
:output => {
:device => PortAudio::Device.default_output,
:channels => 1,
:sample_format => :float32
})
buffer = PortAudio::SampleBuffer.new(
:format => :float32,
:channels => 1,
:frames => block_size)
playing = true
Signal.trap('INT') { playing = false }
puts "Ctrl-C to exit"
stream.start …Run Code Online (Sandbox Code Playgroud) 我正在尝试编写一个程序来记录来自我的计算机麦克风的信息并将其保存到文件中.PyAudio看起来像是做这个的更好的软件包之一,他们甚至有一个Windows 7的二进制文件(Python 2.7).我下载了可执行文件并运行它来设置PyAudio,但是当我尝试将PyAudio导入python脚本时,我得到一个错误:
Please build and install the PortAudio Python bindings first.
Traceback (most recent call last):
File "<pyshell#0>", line 1, in <module>
import pyaudio
File "C:\Python27\lib\site-packages\pyaudio.py", line 103, in <module>
sys.exit(-1)
SystemExit: -1
Run Code Online (Sandbox Code Playgroud)
如果我查看pyaudio.py,它失败的代码是:
# attempt to import PortAudio
try:
import _portaudio as pa
except ImportError:
print "Please build and install the PortAudio Python " +\
"bindings first."
sys.exit(-1)
Run Code Online (Sandbox Code Playgroud)
另外,如果它是相关的,如果我去Python27\Lib\site-packages(pyaudio.py所在的地方)有一个名为的文件portaudio_x64.dll.
如果您想通过从源代码构建来安装PyAudio,那么他们网站上的文档似乎只有说明.此外,它说PortAudio v19包含在二进制文件中,所以我认为它在运行安装程序可执行文件后才会起作用.
我不知道出了什么问题,我真的很快就需要这个.什么出问题的任何想法?或者,如果有人推荐类似的软件包,这些软件包更适用于Windows 7(64位)和Python 2.7(Enthought发行版),以及跨平台,我很乐意听到它们.
我正在尝试在我的Mac(OS 10.7.2)上运行以下代码(来自PyAudio文档的示例):
import pyaudio
import sys
chunk = 1024
FORMAT = pyaudio.paInt16
CHANNELS = 1
RATE = 44100
RECORD_SECONDS = 5
p = pyaudio.PyAudio()
stream = p.open(format = FORMAT,
channels = CHANNELS,
rate = RATE,
input = True,
output = True,
frames_per_buffer = chunk)
print "* recording"
for i in range(0, 44100 / chunk * RECORD_SECONDS):
data = stream.read(chunk)
stream.write(data, chunk)
print "* done"
stream.stop_stream()
stream.close()
p.terminate()
Run Code Online (Sandbox Code Playgroud)
我给出的错误是:
Traceback (most recent call last):
File "PyAudioExample.py", line 24, in <module>
data …Run Code Online (Sandbox Code Playgroud) 我试图让flite语音合成库在我的Mac上运行,但我的声音架构在flite库中不受支持.为了解决这个问题,我使用PortAudio来播放合成音频; 所以我不得不在audio.c文件中做一些黑客攻击来使用该库.我在GNU AutoTools中捣乱了一段时间后设法让所有内容编译得很好,但后来我运行程序并获得此输出:
$ ./flite -t "test"
frameIndex: 0
maxFrameIndex: 0
numChannels: 1
numSamples: 7225
sampleRate: 8000
=== Now playing back. ===
Waiting for playback to finish.
frameIndex in callback: -2008986336
maxFrameIndex in callback: 32655
numChannels in callback: 152579008
numSamples in callback: 0
sampleRate in callback: 0
Segmentation fault: 11
$ ./flite -t "test"
frameIndex: 0
maxFrameIndex: 0
numChannels: 1
numSamples: 7225
sampleRate: 8000
=== Now playing back. ===
Waiting for playback to finish. …Run Code Online (Sandbox Code Playgroud) 在这里,我试图为连续录制的音频系统编写一些代码.然后,当某个幅度阈值被破坏时,我试图将音频记录一段时间.
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#include <time.h>
#include <portaudio.h>
#include <sndfile.h>
#define FRAMES_PER_BUFFER (1024)
#define SAMPLE_SIZE (4)
typedef struct
{
uint16_t formatType;
uint16_t numberOfChannels;
uint32_t sampleRate;
float* recordedSamples;
} AudioData;
AudioData initAudioData(uint32_t sampleRate, uint16_t channels, int type)
{
AudioData data;
data.formatType = type;
data.numberOfChannels = channels;
data.sampleRate = sampleRate;
return data;
}
float avg(float *data)
{
int elems = sizeof(data) / sizeof(data[0]);
float sum = 0;
for (int i = 0; i < elems; i++)
{ …Run Code Online (Sandbox Code Playgroud) 我正在尝试用 PyAudio 做一个声音处理项目,但有时我会收到这个错误,我不明白为什么。
以下代码播放在我的笔记本电脑麦克风上听到的音频,然后暂停 3 秒钟,然后继续。这段代码运行良好,如果我鼓掌,在暂停期间,暂停结束后音频不会播放,这使得缓冲区填满后任何额外的音频都丢失了。
但是如果我将 CHUNK 减少到 20 这样的低数字,一旦它暂停一秒钟就会抛出错误
File "C:\Anaconda3\lib\site-packages\pyaudio.py", line 608, in read
return pa.read_stream(self._stream, num_frames, exception_on_overflow)
OSError: [Errno -9981] Input overflowed
Run Code Online (Sandbox Code Playgroud)
因此,如果音频在暂停期间由于(我认为)缓冲区填满而不会引发错误而丢失,那么当我减少每个缓冲区的帧数时为什么会出现错误?
代码:
import pyaudio
import time
# initialize stream parameters
FORMAT = pyaudio.paInt16
CHANNELS = 1
RATE = 44100
CHUNK = 1024
p = pyaudio.PyAudio()
stream = p.open(format=FORMAT,
channels=CHANNELS,
rate=RATE,
input=True,
output=True,
frames_per_buffer=CHUNK)
x = 1
while True:
data = stream.read(CHUNK)
stream.write(data)
x=x%100 + 1
if x == 100:
print(time.time())
time.sleep(3)
Run Code Online (Sandbox Code Playgroud)
编辑 - 我想我通过将此参数添加到读取中解决了这个问题: …