You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Django中WebSocket因错误代码1011断开连接的问题排查(附语音识别消费者实现代码)

Django中WebSocket因错误代码1011断开连接的问题排查(附语音识别消费者实现代码)

最近在Django里搞WebSocket语音识别时,碰到了1011错误导致连接莫名断开的情况?别愁,咱们一步步拆解问题,顺便附上调整后的完整代码参考~

错误1011的核心原因

这个错误代码本质是服务器内部触发了未被捕获的异常,大概率是代码里的细节疏漏导致的,咱们从这几个方向排查:

  • 依赖与路径问题:先检查Vosk模型路径是否正确,model_path必须指向本地已解压好的模型文件夹,模型下载不完整或者路径写错,会直接导致初始化失败;另外确认vosksounddevicewebsockets这些依赖库的版本适配,避免版本冲突拖后腿。
  • 异步同步冲突: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

火山引擎 最新活动