File size: 2,230 Bytes
631d7fd
d35ad3d
bf0fcc3
 
 
4c9b3cc
bf0fcc3
 
 
739bccd
 
3b9863d
ea9e44a
bf0fcc3
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3b9863d
bf0fcc3
 
 
 
 
3cfb14f
bf0fcc3
 
 
 
739bccd
 
 
bf0fcc3
 
739bccd
bf0fcc3
 
739bccd
 
 
 
bf0fcc3
 
 
 
8b61153
389171c
bf0fcc3
 
8b61153
 
bf0fcc3
 
 
8b61153
bf0fcc3
 
631d7fd
 
 
 
 
8b61153
bf0fcc3
 
 
 
739bccd
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
from fastapi import FastAPI, WebSocket, WebSocketDisconnect
from transcribe.serve import WhisperTranscriptionService
from uuid import uuid1
from logging import getLogger
import numpy as np
from transcribe.processing import ProcessingPipes
from contextlib import asynccontextmanager
from multiprocessing import Process, freeze_support
from fastapi.staticfiles import StaticFiles
from fastapi.responses import RedirectResponse
import os
from transcribe.utils import pcm_bytes_to_np_array
from config import BASE_DIR
logger = getLogger(__name__)


async def get_audio_from_websocket(websocket)->np.array:
    """
    Receives audio buffer from websocket and creates a numpy array out of it.

    Args:
        websocket: The websocket to receive audio from.

    Returns:
        A numpy array containing the audio.
    """
    frame_data = await websocket.receive_bytes()
    if frame_data == b"END_OF_AUDIO":
        return False
    return pcm_bytes_to_np_array(frame_data)


@asynccontextmanager
async def lifespan(app:FastAPI):
    global pipe
    pipe = ProcessingPipes()
    pipe.wait_ready()
    logger.info("Pipeline is ready.")
    yield


FRONTEND_DIR = os.path.join(BASE_DIR, "frontend")


app = FastAPI(lifespan=lifespan)
app.mount("/app", StaticFiles(directory=FRONTEND_DIR, html=True), name="frontend")
pipe = None

@app.get("/")
async def root():
    return RedirectResponse(url="/app/")

@app.websocket("/ws")
async def translate(websocket: WebSocket):
    query_parameters_dict = websocket.query_params
    from_lang, to_lang = query_parameters_dict.get('from'), query_parameters_dict.get('to')

    client = WhisperTranscriptionService(
        websocket,
        pipe,
        language=from_lang,
        dst_lang=to_lang,
        client_uid=f"{uuid1()}",
    )

    if from_lang and to_lang and client:
        logger.info(f"Source lange: {from_lang}  -> Dst lange: {to_lang}")
        await websocket.accept()
    try:
        while True:
            frame_data = await get_audio_from_websocket(websocket)
            client.add_frames(frame_data)
    except WebSocketDisconnect:
        return

if __name__ == '__main__':
    freeze_support()
    import uvicorn
    uvicorn.run(app, host="0.0.0.0", port=9191)