我正在进行实时音频处理。 首先,我将带有USB网络摄像头的raspberry pi 3连接为麦克风。 我正在使用 alsaaudio 从麦克风获取流音频数据。 然后,我处理数据。到目前为止,一切正常。
因此,接下来,我想在浏览器上实时显示声波声音。 我尝试使用烧瓶来流数据并在浏览器上绘制声图。
引用自:
我可以做这样的事情。
@app.route('/stream')
def stream():
def generate(sound):
while True:
frame = sound.get_frame()
yield '{}\n'.format(frame)
sleep(1)
return app.response_class(generate(Sound()), mimetype='text/plain')
和声音模块
# constants
CHANNELS = 1
INFORMAT = alsaaudio.PCM_FORMAT_S16_LE
FSAMP = 48000
FRAME_SIZE = 1024
FRAMES_PER_FFT = 16
# variable for helping the calculation fft
SAMPLES_PER_FFT = FRAME_SIZE*FRAMES_PER_FFT
FREQ_STEP = float(FSAMP)/SAMPLES_PER_FFT
window = 0.5*(1-np.cos(np.linspace(0, 2*np.pi, SAMPLES_PER_FFT, False)))
buf = np.zeros(SAMPLES_PER_FFT, dtype=np.float32)
# set up audio input
input_device = ['dsnoop:CARD=C615,DEV=0']
recorder=alsaaudio.PCM(type=alsaaudio.PCM_CAPTURE,device=input_device[0])
recorder.setchannels(CHANNELS)
recorder.setrate(FSAMP)
recorder.setformat(INFORMAT)
class Sound:
def __init__(self ):
pass
# Frame generation for Browser streaming wiht Flask...
def get_frame(self):
buf[:-FRAME_SIZE] = buf[FRAME_SIZE:]
data = array.array('h')
data.fromstring(recorder.read()[1])
buf[-FRAME_SIZE:] = data
# calculate fft
fft = np.fft.rfft(buf*window)
# find the frequency
freq = (np.abs(fft).argmax()) * FREQ_STEP
return data
但是,每当我尝试运行程序时,都会显示此错误。
data.fromstring(recorder.read()[1])
ValueError: bytes length not a multiple of item size
我尽了最大的努力寻找原因,但仍然不明白。
我该如何解决?还是应该以其他方式在浏览器上显示波形图?
我在树莓派3和Logitech c615网络摄像头上使用的是Python 3.5麦克风。