File size: 2,149 Bytes
8d1b3ab
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
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)