当前位置: 首页 > 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.lryc.cn/news/578457.html

相关文章:

  • Set和Map的解析与应用场景
  • 集中式ZDM-E0400P3热电阻RTD测温模块(1) — 基础应用
  • WPF学习笔记(18)触发器Trigger
  • Postman - API 调试与开发工具 - 标准使用流程
  • Vue3 中 Excel 导出的性能优化与实战指南
  • 遥感影像岩性分类:基于CNN与CNN-EL集成学习的深度学习方法
  • 城市灯光夜景人像街拍摄影后期Lr调色教程,手机滤镜PS+Lightroom预设下载!
  • 【仿muduo库实现并发服务器】Poller模块
  • 华为交换机堆叠与集群技术深度解析附带脚本
  • 数字图像处理学习笔记
  • Python 可迭代的对象、迭代器 和生成器(Python 3.3中新出现的句法:yield from)
  • 静态工厂注入 vs 实例工厂注入
  • LINUX2.6设备注册与GPIO相关的API
  • FFmpeg 中./configure的解析
  • Linux基本命令篇 —— bc命令
  • 微软服务器安全问题
  • 【蓝牙】Linux Qt4查看已经配对的蓝牙信息
  • MCP 协议使用核心讲解
  • HDMI2.1 FRL流控 概览
  • 基于OPUS-MT模型的中译英程序实现
  • swing音频输入
  • Vue 安装使用教程
  • 【机器学习深度学习】模型微调的基本概念与流程
  • 动手实践:如何提取Python代码中的字符串变量的值
  • QA - RAG智能问答系统中的文档切片与实现原理
  • 深入金融与多模态场景实战:金融文档分块技术与案例汇总
  • 打造可观测的 iOS CICD 流程:调试、追踪与质量保障全记录
  • python下划线开头函数总结
  • 服务器安装 ros2时遇到底层库依赖冲突的问题
  • Crystaldiskinfo查询的硬盘参数信息