Best way to stream audio data between the browser and FastAPI

Viewed 801

I have some basic Server and Client Side code with FastAPI, but I am trying to find the best way to read in that data for a live application that does some audio processing. I am not sure how to approach this, as FastAPI can only read the data from the client as bytes. Should I even bother converting it to a Blob after recording? Maybe use HTTP for simplicity (just building a prototype so it does not need to be optimal)? I also read about RTSP but I can't seem to find any good resources for it, so I would appreciate some way to point me in the right direction. Thanks for any advice!

Client

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <h1>helloworld</h1>

    <script>
        var ws = new WebSocket("ws://localhost:8000/ws", 'echo-protocol');
        navigator.mediaDevices.getUserMedia({ audio: true })
            .then(stream => {
                const mediaRecorder = new MediaRecorder(stream);
                mediaRecorder.start(5000);

                mediaRecorder.addEventListener("dataavailable", event => {
                    console.log("sending audio");
                    const audioBlob = new Blob([event.data], {type: 'audio/mp3'});
                    ws.send(audioBlob);
                    console.log("sent audio");
                });
            });
    </script>
</body>
</html> 

Server

from fastapi import FastAPI, WebSocket, Request
from fastapi.templating import Jinja2Templates


app = FastAPI()
templates = Jinja2Templates(directory="templates")


@app.get("/")
def read_root(request: Request):
    return templates.TemplateResponse("index.html", {"request": request})


@app.websocket("/ws")
async def websocket_endpoint(websocket: WebSocket):
    await websocket.accept()
    while True:
        data = await websocket.receive_bytes()
0 Answers
Related