| 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, "web") |
|
|
|
|
| app = FastAPI(lifespan=lifespan) |
| app.mount("/app", StaticFiles(directory=FRONTEND_DIR, html=True), name="web") |
| 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) |
|
|