在Flask应用程序中保存通过WebSocket连接传输的音频字节

siotufzp  于 2023-06-06  发布在  其他
关注(0)|答案(1)|浏览(193)

问题背景:开发一个应用程序,可以打开WebSocket进行音频流传输,并连接到客户端,以便在通过websocket传输音频字节时输出语音到文本转换。
有一个python flask后端和javascript前端来开发一个独立的WebSocket应用程序,提供检测。
前端代码::index.html

<script src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/4.0.1/socket.io.js" integrity="sha512-q/dWJ3kcmjBLU4Qc47E4A9kTB4m3wuTY7vkFJDTZKjTs8jhyGQnaUrxa0Ytd0ssMZhbNua9hE+E7Qv1j+DyZwA==" crossorigin="anonymous"></script>
<script type="text/javascript" charset="utf-8">
    var socket = io.connect('http://localhost:5000');
    socket.on('connect', function() {
        //socket.emit('my event', {data: 'I\'m connected!'});
    });

</script>
<div><h1>Welcome to microphone streaming test</h1></div>

<video id="video" autoplay></video>

<script async src='../static/js/capture.js'></script>

上面是html文件,让用户设备麦克风获得音频使用导航器
Capure.js

const video = document.getElementById('video');
debugger
function funSendsocketData(buffer){
    debugger;
    socket.emit('my event', {data: buffer});
}
function startup(){
navigator.mediaDevices.getUserMedia({
    audio:true,
    video:false
}).then(stream=>{
video.srcObject = stream;
recorder = new MediaRecorder(stream);  
if(recorder.state === "recording"){
    recorder.stop();
}
else{
    recorder.start(5000);
    recorder.addEventListener('dataavailable', (async event => {

        if (typeof event.data === 'undefined') return;
        if (event.data.size === 0) return;   
        debugger;

        event.data.arrayBuffer().then(buffer =>
            funSendsocketData(buffer)
        );  
    }));
}


}).catch(console.error)
}
window.addEventListener('load',startup,false)

捕获5000毫秒或5秒的数据,并发送blobover WebSocket连接以保存或处理。
Flask后端

@socketio.on('my event')
def handle_message(data):
    #blob = requests.data
    import base64
    wav_file = open("temp.webm", "wb")
    decode_string = base64.b64decode(bytes(data['data']))
    with open("audioToSave.mp3", "wb") as fh:
        fh.write(decode_string)
    
    
    wav_file.write(decode_string)

问题在于后端,因为我无法将blob保存到要由whisper处理的文件中。我的斑点是正确地转移到后端,但我无法保存文件为webm或wav或mp3。

7bsow1i6

7bsow1i61#

在代码中,您试图将接收到的blob数据保存为Flask后端中的音频文件,但以所需格式(webm,wav或mp3)保存文件似乎存在问题。要解决此问题,您可以对Flask后端代码进行以下修改:

from flask import request

@socketio.on('my event')
def handle_message(data):
    # Extract blob data from the request
    blob_data = request.data

    # Save the blob data as a file
    with open("audioToSave.webm", "wb") as file:
        file.write(blob_data)

    # Perform further processing with the saved file
    # ...

通过使用Flask中的request对象,您可以访问请求中发送的原始数据,并直接将其保存到文件中。在该示例中,团块数据被保存为当前工作目录中的“audioToSave.webm”。您可以根据需要修改文件名和路径。

相关问题