Python将音频流PCM字符串高效转换为数组,重复使用

标签 python arrays string memory audio

您好,我想将通过麦克风录制的音频流转换为整数数组(或 float 或其他)以供以后分析(fft 等)。然而,我目前的方法让我觉得效率有点低,而且我认为我看到了零星的内存分配延迟。

我正在使用 alsaaudio,因为 ossaudiodev 不再适用于大多数 Linux 发行版,但这并不重要。我从设备中获取的音频流是一个 2048 个字符的字符串,对应于 1024 个 16 位音频帧。我认为“array”是将字符串转换为 int 数组的最佳方式,但是在每个循环结束时,我必须为下一轮数据清除数组,我使用 del 如果查看循环内部运行所需的时间(不包括读取),我发现每第 4 次或第 5 次(它是零星的)循环将花费更长的时间,所以我的问题是内存分配是我当前的策略有效?

音频设备是这样设置的:

import array
import alsaaudio as alsa
audio_data = array.array("h")
ain = alsa.PCM(alsa.PCM_CAPTURE,alsa.PCM_NORMAL,card='default')
ain.setchannels(1)
ain.setrate(rate)
ain.setformat(alsa.PCM_FORMAT_S16_LE)
ain.setperiodsize(1024)

然后在一个循环中我这样做

Nsamples,astream = ain.read()
audio_data.fromstring(astream)
## some analysis is done (FFT, plot whatever)
# i.e. 
Freq = np.abs(sy.fft(audio_data))
# clear the audio data array for next segment
del audio_data[:]

最佳答案

你试过 numpy.fromstring 了吗?

关于Python将音频流PCM字符串高效转换为数组,重复使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10946039/

相关文章:

Java String split() 丢失字符串

javascript - 在 Flask 中嵌入 Bokeh 图

c++ - 如何根据其成员数据对结构/类数组进行排序?

java - 从填充数组计算范围时出现问题(Java)

java - 将 EditText 存储在数组中并显示在 TextView 中

string - golang 扫描器读取到读取器结束

python - python包(多文件模块)的行为与一个大模块完全一样吗?

python - 如何在 tkinter 文本小部件中突出显示文本

Python 列表理解

python - 如何将字符串转换为整数并将它们相加?