File size: 2,517 Bytes
13f6d73
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
from fastapi import APIRouter, WebSocket
from starlette.websockets import WebSocketState
from modules.models.speech_recognizer import SpeechRecognizer
router = APIRouter()

@router.websocket("/transcribe")
async def transcribe_audio(websocket: WebSocket):
    recognizer = SpeechRecognizer("ru", "deepdml/faster-whisper-large-v3-turbo-ct2")
    await websocket.accept()
    message_buffer = ""
    last_status = None
    
    try:
        while websocket.client_state == WebSocketState.CONNECTING or websocket.client_state == WebSocketState.CONNECTED:
            try:
                # Receive audio data
                audio = await websocket.receive_bytes()
                recognizer.append_audio(audio)
                recognized_text = recognizer.process_buffer()
                status = recognizer.get_status()

                # If the status hasn't changed and no new text is recognized, skip to next iteration
                if status == last_status and recognized_text[0] is None:
                    continue

                last_status = status

                # Handle recognized text based on status
                if status == 'voice':
                    message_buffer += recognized_text[2]
                    if len(message_buffer) > 0 and not str.isspace(message_buffer):
                        print(f"Sending partial message: {message_buffer}")
                        obj = {"text": message_buffer, "is_complete": False}
                        await websocket.send_json(obj)
                elif status == 'nonvoice':
                    message_buffer += recognizer.flush()[2]
                    if len(message_buffer) > 0 and not str.isspace(message_buffer):
                        print(f"Sending complete message: {message_buffer}")
                        obj = {"text": message_buffer, "is_complete": True}
                        await websocket.send_json(obj)
                    message_buffer = ""  # Reset buffer after sending message
            except (RuntimeError, ConnectionError) as e:
                # Catch errors due to disconnection or network issues
                print(f"Client disconnected: {e}")
                break
            except Exception as e:
                print(f"Unexpected error: {e}")
                break
    finally:
        # Ensure proper cleanup even if the loop exits
        recognizer.clear_buffer()
        try:
            await websocket.close()
        except Exception as e:
            print(f"Error closing websocket: {e}")