Django中WebSocket因错误代码1011断开连接的问题排查(附语音识别消费者实现代码)
Django中WebSocket因错误代码1011断开连接的问题排查(附语音识别消费者实现代码)
最近在Django里搞WebSocket语音识别时,碰到了1011错误导致连接莫名断开的情况?别愁,咱们一步步拆解问题,顺便附上调整后的完整代码参考~
错误1011的核心原因
这个错误代码本质是服务器内部触发了未被捕获的异常,大概率是代码里的细节疏漏导致的,咱们从这几个方向排查:
- 依赖与路径问题:先检查Vosk模型路径是否正确,
model_path必须指向本地已解压好的模型文件夹,模型下载不完整或者路径写错,会直接导致初始化失败;另外确认vosk、sounddevice、websockets这些依赖库的版本适配,避免版本冲突拖后腿。 - 异步同步冲突:Django的
AsyncWebsocketConsumer跑在异步环境里,但Vosk的AcceptWaveform是同步方法,直接在异步函数里调用会阻塞事件循环,时间久了就会触发WebSocket连接超时断开。 - 异常未捕获:原代码里没做异常处理,比如
json.loads(result)如果返回的格式不符合预期,会直接抛出异常,没被捕获的异常会触发服务器内部错误,直接导致1011断开。 - 音频格式不匹配:得确认前端传过来的音频是16000Hz采样率、单声道、16位PCM格式,和Vosk模型要求的参数完全一致,格式不对会导致识别失败,进而引发连锁错误。
修正后的语音识别消费者代码
import asyncio import websockets import sounddevice as sd import vosk import queue import json 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() try: # 用线程池处理同步的Vosk方法,避免阻塞异步事件循环 result = await asyncio.to_thread(self._process_single_audio, data) if result: result_dict = json.loads(result) recognized_text = result_dict.get('text', '') print(f"Recognized text: {recognized_text}") # 可选:把识别结果发回前端展示 await self.send(text_data=recognized_text) except Exception as e: print(f"Error processing audio: {str(e)}") # 可选:把错误信息反馈给前端 await self.send(text_data=f"Error: {str(e)}") def _process_single_audio(self, data): if self.rec.AcceptWaveform(data): return self.rec.Result() return self.rec.PartialResult()
关键优化点说明
- 补上了原代码缺失的
import json模块,解决语法错误。 - 把音频识别的同步逻辑抽成单独的
_process_single_audio方法,用asyncio.to_thread异步调用,避免阻塞异步事件循环。 - 增加了
try-except异常捕获,及时处理错误并输出日志,防止异常直接冲断WebSocket连接。 - 新增了向前端推送识别结果/错误信息的逻辑,方便前后端交互。
备注:内容来源于stack exchange,提问作者Dhruvil Antala




