当前位置: 首页 > news >正文

讯飞大模型实时语音识别

最近需要完成一个实时语音识别的项目,因此将讯飞的实时语音识别项目简单封装了一下,代码如下:

import threading
import time
import wave
import pyaudio
import json
import websocket
import hashlib
import hmac
import base64
from urllib.parse import quote# ================== 配置信息 ==================
APPID = ""
API_KEY = ""# ================== 音频参数 ==================
CHUNK = 1024        # 每帧大小
FORMAT = pyaudio.paInt16  # 音频格式
CHANNELS = 1        # 单声道
RATE = 16000        # 采样率
INTERVAL = 0.04     # 发送间隔(秒)# ================== 实时识别客户端 ==================
class RealtimeASRClient:def __init__(self, output_file=None):self.ws = Noneself.connected = Falseself.output_file = output_fileself.lock = threading.Lock()def connect(self):try:ts = str(int(time.time()))tt = (APPID + ts).encode('utf-8')md5 = hashlib.md5()md5.update(tt)baseString = md5.hexdigest()baseString = bytes(baseString, encoding='utf-8')apiKey = API_KEY.encode('utf-8')signa = hmac.new(apiKey, baseString, hashlib.sha1).digest()signa = base64.b64encode(signa)signa = str(signa, 'utf-8')base_url = "ws://rtasr.xfyun.cn/v1/ws"self.ws = websocket.create_connection(f"{base_url}?appid={APPID}&ts={ts}&signa={quote(signa)}")print("WebSocket 连接成功")self.connected = Trueexcept Exception as e:print("WebSocket 连接失败:", e)self.connected = Falsedef send_audio_stream(self, stream):if not self.connected:returnend_tag = "{\"end\": true}"try:while self.connected:data = stream.read(CHUNK, exception_on_overflow=False)if not data:breakself.ws.send(data, opcode=websocket.ABNF.OPCODE_BINARY)time.sleep(INTERVAL)  # 控制节奏except Exception as e:print("音频发送错误:", e)finally:self.ws.send(bytes(end_tag.encode('utf-8')))print("已发送结束标记")def recv(self):if not self.connected:returntry:while self.connected:result = self.ws.recv()if not result:print("接收结束")breaktry:result_dict = json.loads(result)if result_dict.get("action") == "result":data = json.loads(result_dict.get("data", ""))text = self.extract_text_from_result(data)if text:print("实时识别:", text)if self.output_file:self.output_file.write(text + "\n")self.output_file.flush()except json.JSONDecodeError:print("JSON 解析失败:", result)except Exception as e:print("接收异常:", e)finally:self.close()def close(self):self.connected = Falseif self.ws:self.ws.close()print("WebSocket 已关闭")def extract_text_from_result(self, result_dict):try:ws_list = result_dict.get("cn", {}).get("st", {}).get("rt", [{}])[0].get("ws", [])text = ""for ws in ws_list:if ws.get("cw") and len(ws["cw"]) > 0:word = ws["cw"][0].get("w", "")text += wordreturn text.strip()except Exception as e:print("解析失败:", e)return ""

此外,博主需要在开启语音识别的过程中,开启一个线程,其要进行录音,并将结果保存到txt中,最后还需要将录音与图像进行合并,生成一个完整视频,在实验过程中,博主发现其识别速度较慢,因此在查询相关技术文档后,发现只需要改变一下数据传输块大小和发送频率便可以显著提升速度,即:

CHUNK = 1024        # 每帧大小
INTERVAL = 0.04     # 发送间隔(秒)

默认是1024B,每40毫秒发送一次,经过博主测试,可以稳定在4096B,10毫秒的处理速度。
至于识别精度,说实话,一言难尽,这个实时的识别效果比起上传读取音频的识别效果要差很多。
不过毕竟它能够实现一个实时效果,就看大家如何选择了

在这里插入图片描述

http://www.lqws.cn/news/597403.html

相关文章:

  • Kubernetes 之Ingress 从基础到实战全解析
  • Async和Await关键字
  • 电力交易的实现路径
  • CppCon 2018 学习:A New Take on Polymorphism
  • (JAVA)自建应用调用企业微信API接口,实现消息推送
  • 【网工|知识升华版|理论】ARQ机制|CSMA/CD协议
  • Rust征服字节跳动:高并发服务器实战
  • 记一次使用sa-token导致的预检请求跨域问题
  • 前端常用构建工具介绍及对比
  • 人才交流的价值创造模型与合作演化方程
  • Kubernetes Pod 调度基础
  • 华为设备 QoS 流分类与流标记深度解析及实验脚本
  • 【UniApp picker-view 多列对齐问题深度剖析与完美解决】
  • 4.Stable Diffusion WebUI 模型训练
  • OpenCV CUDA模块设备层-----“大于阈值设为零” 的图像处理函数 thresh_to_zero_inv_func()
  • torch.nn
  • Postman - API 调试与开发工具 - 标准使用流程
  • Mac 部署 Dify小红书种草工作流
  • 新手向:从零开始MySQL超详细安装、配置与使用指南
  • stm32l4系列启用看门狗后,调用HAL_IWDG_Refreh()就复位
  • HakcMyVM-Arroutada
  • java生成word文档
  • 飞算JavaAI:重构软件开发范式的智能引擎
  • ABB驱动系列SCYC51213 63911607C驱动板
  • java微服务-linux单机CPU接近100%优化
  • Python应用指南:利用高德地图API获取公交+地铁可达圈(二)
  • 再见 RAG?Gemini 2.0 Flash 刚刚 “杀死” 了它!
  • 学习面向对象
  • 第TR3周:Pytorch复现Transformer
  • 快速手搓一个MCP服务指南(九): FastMCP 服务器组合技术:构建模块化AI应用的终极方案