如何在浏览器上绘制实时音频图

时间:2018-07-12 07:39:26

标签: python audio plot browser audio-streaming

我正在进行实时音频处理。 首先,我将带有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麦克风。

0 个答案:

没有答案