| from fastapi import FastAPI, WebSocket,WebSocketDisconnect |
| import asyncio |
| import base64 |
| from src.core.speechtotext import SpeechToText |
| from src.core.texttospeech import TextToSpeech |
| from src.core.texttotext import ConversationHandler |
| import os |
| app = FastAPI() |
| spt = SpeechToText() |
| ttt = ConversationHandler() |
| tts = TextToSpeech() |
| @app.websocket("/ws/voicechat") |
| async def websocket_endpoint(websocket: WebSocket): |
| await websocket.accept() |
| print("User connected.") |
| audio_buffer = bytearray() |
| |
| try: |
| while True: |
| try: |
| audio_data = await asyncio.wait_for(websocket.receive_bytes(), timeout=3.0) |
| print(f"Received {len(audio_data)} bytes") |
| audio_buffer.extend(audio_data) |
| |
| except asyncio.TimeoutError: |
| if len(audio_buffer) > 0: |
| print("Silence detected. Processing speech...") |
| transcript = await spt.trancribe_audio(audio_buffer) |
| audio_buffer.clear() |
| |
| if transcript: |
| print(f"User said: {transcript}") |
| response = await ttt.handle_conversation(transcript) |
| if response: |
| print(f"AI Response: {response}") |
| audio = await tts.synthesize(response) |
| audio_base64 = base64.b64encode(audio).decode("utf-8") |
| await websocket.send_json({ |
| "transcript": transcript, |
| "response": response, |
| "audio": audio_base64, |
| "status": "complete" |
| }) |
| await websocket.receive_text() |
| |
| except Exception as e: |
| print(f"Error: {e}") |
| except WebSocketDisconnect: |
| print("User disconnected.") |
| if __name__ == '__main__': |
| import uvicorn |
| uvicorn.run(app,port=7860,host= "0.0.0.0", |
| timeout_keep_alive=300, timeout_graceful_shutdown=600) |