【发布时间】:2015-12-16 09:14:19
【问题描述】:
如何在来自麦克风的 matplotlib 输入信号上绘图? 我试图用 plt.plot(frames) 绘图,但由于某种原因,frames 是一个字符串?
a) 为什么 frames 变量是一个字符串列表?
b) 为什么数据变量是字符串列表?
c) 它们应该代表单个样本的能量/幅度并且是整数吗?
d) 当我指定我想要 1024 的块大小时,为什么数据长度是 2048?
(我猜是因为我使用了 paInt16,但仍然看不到为什么它不能是 1024)
我有以下麦克风输入代码:
import pyaudio
import audioop
import matplotlib.pyplot as plt
import numpy as np
from itertools import izip
import wave
FORMAT = pyaudio.paInt16 # We use 16bit format per sample
CHANNELS = 1
RATE = 44100
CHUNK = 1024 # 1024bytes of data red from a buffer
RECORD_SECONDS = 3
WAVE_OUTPUT_FILENAME = "file.wav"
audio = pyaudio.PyAudio()
# start Recording
stream = audio.open(format=FORMAT,
channels=CHANNELS,
rate=RATE, input=True,
frames_per_buffer=CHUNK)
frames = []
for i in range(0, int(RATE / CHUNK * RECORD_SECONDS)):
data = stream.read(CHUNK)
frames.append(data)
frames = ''.join(frames)
stream.stop_stream()
stream.close()
audio.terminate()
【问题讨论】:
-
您可以在示例代码中包含您的导入语句吗?此外,frames 变量是一个字符串列表,因为您将其声明为
frames = ''.join(frames)。你不需要这样做,因为你已经附加了所有你需要的帧,你有一个列表。 -
是的,我知道这一点,但数据也是一个字符串。我认为 struct.unpack 需要做一些事情,但我不知道具体是什么。
-
但是你问为什么
frames是一个字符串列表?无论如何,Stream.read() 应该返回一个字符串,如 API 文档中所指定:people.csail.mit.edu/hubert/pyaudio/docs -
在python3中需要在前面加上
b:b"".join(frames)
标签: python matplotlib speech-recognition