WebSocket отключен с кодом: 1011 в django

consumers.py

import asyncio
import websockets
import sounddevice as sd
import vosk
import queue
from channels.generic.websocket import AsyncWebsocketConsumer

model_path = "vosk_model/vosk-model-small-en-us-0.15"
model = vosk.Model(model_path)
sample_rate = 16000
audio_queue = queue.Queue()

class SpeechRecognitionConsumer(AsyncWebsocketConsumer):
    async def connect(self):
        await self.accept()
        self.rec = vosk.KaldiRecognizer(model, sample_rate)
        print("WebSocket connection accepted")

    async def receive(self, bytes_data):
        audio_queue.put(bytes_data)
        await self.process_audio()

    async def process_audio(self):
        while not audio_queue.empty():
            data = audio_queue.get()
            if self.rec.AcceptWaveform(data):
                result = self.rec.Result()
                result_dict = json.loads(result)
                recognized_text = result_dict.get('text', '')
                print("recognized_text: ", recognized_text)
                print("Final Result: ", recognized_text)
                await self.send(text_data=json.dumps({
                    'type': 'result',
                    'text': recognized_text
                }))
            else:
                partial_result = self.rec.PartialResult()
                partial_dict = json.loads(partial_result)
                partial_text = partial_dict.get('partial', '')
                print("Partial Result: ", partial_text)
                await self.send(text_data=json.dumps({
                    'type': 'partial',
                    'text': partial_text
                }))

    async def disconnect(self, close_code):
        print(f"WebSocket disconnected with code: {close_code}")

audio.py

import asyncio
import websockets
import sounddevice as sd

async def send_audio_data(websocket):
    loop = asyncio.get_event_loop()

    def audio_callback(indata, frames, time, status):
        if status:
            print(f"Audio Status: {status}")
        audio_data = bytes(indata)
        print(f"Received audio data of length: {len(audio_data)}")
        asyncio.run_coroutine_threadsafe(websocket.send(audio_data), loop)

    with sd.RawInputStream(samplerate=16000, channels=1, dtype='int16', blocksize=1024, callback=audio_callback):
        print("Recording and sending audio data...")
        while True:
            await asyncio.sleep(0.05)


async def main():
    uri = "ws://localhost:8000/ws/recognize/"
    async with websockets.connect(uri) as websocket:
        print("Connected to WebSocket server")
        await send_audio_data(websocket)

# Create an event loop
loop = asyncio.get_event_loop()
loop.run_until_complete(main())

Я разрабатываю функцию распознавания речи в своем Django-приложении, используя Django Channels и библиотеку Vosk. Однако я столкнулся с проблемой, когда WebSocket-соединение закрывается с кодом состояния 1011.

Когда я запускаю клиент, соединение WebSocket устанавливается, но оно часто закрывается с кодом состояния 1011. Я не знаю, что может быть причиной этой проблемы. Я проверил следующее:

  • Журналы сервера: Явных ошибок не обнаружено.
  • Аудиоданные: Отправляемые аудиоданные, похоже, действительны, и я могу подтвердить, что они принимаются потребителем.
Вернуться на верх