使用Flask将音频从pyaudio传输到HTML5

时间:2017-11-04 01:11:12

标签: python html5 audio flask pyaudio

我想通过Flask将麦克风的音频(通过pyaudio录制)传输到任何连接的客户端。

这是音频的来源:

    def getSound(self):
        # Current chunk of audio data
        data = self.stream.read(self.CHUNK)
        self.frames.append(data)
        wave = self.save(list(self.frames))

        return data

这是我的烧瓶代码:

@app.route('/audiofeed')
def audiofeed():
    def gen(microphone):
        while True:
            sound = microphone.getSound()
            #with open('tmp.wav', 'rb') as myfile:
            #   yield myfile.read()

            yield sound

    return Response(stream_with_context(gen(Microphone())))

这是客户:

    <audio controls>
        <source src="{{ url_for('audiofeed') }}" type="audio/x-wav;codec=pcm">
        Your browser does not support the audio element.
    </audio>

它有时会起作用,但大部分时间我都会“ [Errno 32]断管

当用open(“tmp.wav”)取消注释时 - part(self.save()可选地获取所有先前的帧并将它们保存在tmp.wav中),我得到一个流,但所有出来的扬声器是一个“点击” - 噪音。

我愿意接受任何建议。如何将我的麦克风实时流式传输(无预录制!)输入到网络浏览器?

谢谢!

4 个答案:

答案 0 :(得分:2)

很久以前就问过这个问题,但是由于我花了一整天的时间弄清楚如何实现相同的问题,所以我想给出答案。也许对某人会有帮助。

“ [Errno 32]管道损坏” 错误是由于客户端无法播放音频并关闭此流而导致的。 由于数据流中没有标题,因此无法播放音频。您可以使用here代码中的genHeader(sampleRate, bitsPerSample, channels, samples)函数轻松创建标头。此标头必须至少附加到已发送数据的第一块(chunck=header+data)。请注意,音频只能只能播放,直到客户端达到您必须在标题中指定的下载文件大小为止。因此,解决方法是在标头中设置一些大文件大小,例如2Gb。

答案 1 :(得分:2)

在标头函数中写datasize = len(samples) * channels * bitsPerSample而不是datasize = 2000*10**6

def gen_audio():

    CHUNK = 512
    sampleRate = 44100
    bitsPerSample = 16
    channels = 2
    wav_header = genHeader(sampleRate, bitsPerSample, channels)

    audio = AudioRead()
    data = audio.get_audio_chunck()
    chunck = wav_header + data
    while True:
        yield (chunck)
        data = audio.get_audio_chunck()
        chunck = data

答案 2 :(得分:1)

尝试此操作对我有用。 shell cmd“ cat”工作正常,请参见代码 使用FLASK进行iam

import subprocess
import os
import inspect
from flask import Flask
from flask import Response

@app.route('/playaudio')
    def playaudio():
        sendFileName=""
        def generate():

            #  get_list_all_files_name this function gives all internal files inside the folder

   filesAudios=get_list_all_files_name(currentDir+"/streamingAudios/1")

            # audioPath is audio file path in system 
            for audioPath in filesAudios:
                data=subprocess.check_output(['cat',audioPath])
                yield data
        return Response(generate(), mimetype='audio/mp3')

答案 3 :(得分:0)

经过大量研究和修补,我终于找到了解决方案。

基本上,归结为使用Flask的SocketIO实现通过WebSockets提供pyaudio.paFloat32音频数据,以及使用HTML5的AudioContext在JavaScript中接收/播放数据。

因为这需要一些代码,所以我认为将其全部张贴在这里并不是一个好主意。相反,请随时在simpleCam

中检出我正在使用的项目

相关代码在: -noise_detector.py(录制) -server.py(WebSocket传输) -static / js / player.js(接收/播放)

感谢大家的支持!