【UNI-APP】阿里NLS一句话听写typescript模块

阿里提供的demo代码都是javascript,自己捏个轮子。参考着自己写了一个阿里巴巴一句话听写Nls的typescript模块。VUE3的组合式API形式

startClient:开始听写,注意下一步要尽快开启识别和传数据,否则6秒后会关闭

startRecognition:开始识别事务,传入识别回调,可以打印字符或显示到屏幕

sendSound:发送二进制PCM数据(格式16MHz16bit)

stopRecognition:结束识别事务

/*** 阿里语音,一句话识别模块for ccframe** 无心跳设计,非长连接推送,因此在需要使用的时候才进行连接** @Jim 2024/07/08*/
import * as utils from '@/utils/index'
import { nextTick } from 'vue'
// import Global from '@/utils/constants'const NLS_SERVER_URL = 'wss://nls-gateway.aliyuncs.com/ws/v1'
const NLS_MODE = 'SpeechRecognizer' // 一句话识别
const WEBSOCKET_MAX_RETRY = 3
const RECONNECT_INTERVAL = 3000interface INlsConfig {url?: stringappkey: string // 应用的keytoken: string // 从服务器获得,要缓存
}let client: (UniNamespace.SocketTask & { readyState?: WsState }) | undefined
const clientId = utils.uuid(utils.UUIDFormat.StandardCompact)
let taskId: string = ''
let config: INlsConfig
let reconnectAttempts = 0
let taskStarted = falseenum WsState {CONNECTING,OPEN,CLOSING,CLOSED
}/**** @param action* @returns 请求json*/
const buildMsg: (action: string, payload: Record<string, any>) => string = (action,payload = {}
) => {if (taskId.length === 0) {taskId = utils.uuid(utils.UUIDFormat.StandardCompact)}const msg = {header: {message_id: utils.uuid(utils.UUIDFormat.StandardCompact),task_id: taskId,namespace: NLS_MODE,name: action,appkey: config.appkey},payload,context: {sdk: {name: 'nls-wx-sdk',version: '0.0.1',language: 'wxjs'}}}return JSON.stringify(msg, null, 0)
}/*** 开启连接,开启后立即要传,否则会被关闭.* @param config* @param callback*/
export const startClient = (conf?: INlsConfig,startCallback?: () => void,recognizedCallback?: (text: string) => void
) => {if (client && client.readyState !== WsState.CLOSED) {// 关闭原连接client.close({})}client = uni.connectSocket({url: conf.url ?? NLS_SERVER_URL,tcpNoDelay: true,header: {'X-NLS-Token': conf?.token ?? config.token},success: (res) => {if (!config) config = confconsole.log(`connected to ${NLS_SERVER_URL} success`)},fail: (res) => {console.log(`connect to ${NLS_SERVER_URL} failed:${res.errMsg}`)}})client.readyState = WsState.CONNECTINGclient.onMessage((res) => {if (typeof res.data === 'string') {const msgObj = JSON.parse(res.data)switch (msgObj?.header?.name) {case 'RecognitionStarted': {console.log('started')break}case 'RecognitionResultChanged': {if (recognizedCallback) {const text = msgObj?.payload?.resultif (text) {recognizedCallback(text)}}console.log('changed')break}case 'RecognitionCompleted': {const text = msgObj?.payload?.resultif (text) {recognizedCallback(text)}taskStarted = false // 结束识别break}case 'TaskFailed': {taskStarted = false // 结束识别break}}}console.log('recv:' + res.data)})client.onOpen(() => {reconnectAttempts = 0client.readyState = WsState.OPENif (startCallback) nextTick(startCallback)})client.onError((error) => {console.error('WebSocket error:', error)if (reconnectAttempts < WEBSOCKET_MAX_RETRY) {setTimeout(() => startClient(), RECONNECT_INTERVAL)} else {console.error('Max reconnect attempts reached')}})client.onClose(() => {client.readyState = WsState.CLOSEDconsole.log('connection closed')})
}export const startRecognition = () => {if (client && client.readyState === WsState.OPEN)client.send({data: buildMsg('StartRecognition', {format: 'opus',sample_rate: 16000,enable_intermediate_result: true,enable_punctuation_prediction: true,enable_inverse_text_normalization: true}),success: (res) => {taskStarted = true}})
}export const stopRecognition = () => {if (client && client.readyState === WsState.OPEN)client.send({data: buildMsg('StopRecognition', {format: 'opus',sample_rate: 16000,enable_intermediate_result: true,enable_punctuation_prediction: true,enable_inverse_text_normalization: true}),complete: () => {taskStarted = false // 不管是否成功,都不发送音频了}})
}export const sendSound = (msgBytes: ArrayBuffer) => {if (client && client.readyState === WsState.OPEN && taskStarted)client.send({data: msgBytes,success: (res) => {console.log('send ' + msgBytes.byteLength + ' success')}})
}

util的uuid工具见我前一篇文章https://mp.csdn.net/mp_blog/creation/editor/140267684icon-default.png?t=N7T8https://mp.csdn.net/mp_blog/creation/editor/140267684

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/870710.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

004-基于Sklearn的机器学习入门:回归分析(下)

本节及后续章节将介绍机器学习中的几种经典回归算法&#xff0c;包括线性回归&#xff0c;多项式回归&#xff0c;以及正则项的岭回归等&#xff0c;所选方法都在Sklearn库中聚类模块有具体实现。本节为下篇&#xff0c;将介绍多项式回归和岭回归等。 目录 2.3 多项式回归 2…

Point Cloud Library (PCL) for Python - pclpy 安装指南 (1)

以下所有的版本号务必按照说明安装。 1.安装 Python 3.6 https://www.python.org/ftp/python/3.6.8/python-3.6.8-amd64.exe #或 百度网盘 2.确认 Python 版本为 3.6.x python #Python 3.6.8 (tags/v3.6.8:3c6b436a57, Dec 24 2018, 00:16:47) [MSC v.1916 64 bit (AMD64)] on…

给后台写了一个优雅的自定义风格的数据日志上报页面

highlight: atelier-cave-dark 查看后台数据日志是非常常见的场景,经常看到后台的小伙伴从服务器日志复制一段json数据字符串,然后找一个JSON工具网页打开,在线JSON格式化校验。有的时候,一些业务需要展示mqtt或者socket的实时信息展示,如果不做任何修改直接展示一串字符…

将有序数组转化成二叉搜索数

1 问题 将一个按照升序排列的有序数组&#xff0c;转换为一棵高度平衡二叉搜索树。本题中&#xff0c;一个高度平衡二叉树是指一个二叉树每个节点的左右两个子树的高度差的绝对值不超过1。 2 方法 采用递归的方法找到root结点&#xff0c;以及左子树和右子树。 代码清单 1 clas…

自动驾驶的规划控制简介

自动驾驶的规划控制是自动驾驶系统中的核心组成部分&#xff0c;它负责生成安全、合理且高效的行驶轨迹&#xff0c;并控制车辆按照这个轨迹行驶。规划控制分为几个层次&#xff0c;通常包括行为决策&#xff08;Behavior Planning&#xff09;、轨迹规划&#xff08;Trajector…

学习笔记——动态路由——IS-IS中间系统到中间系统(特性之路由撤销)

6、路由撤销 ISIS路由协议的路由信息是封装在LSP报文中的TLV中的&#xff0c;但是它对撤销路由的处理和OSPF的处理方式类似。 在ISIS中撤销一条路由实则是将接口下的ISIS关闭&#xff1a; 撤销内部路由&#xff1a; 在ISIS中路由信息是由IP接口TLV和IP内部可达性TLV共同来描…

Zip压缩文件的操作

ZipInputStreamhe和ZipOutputStream这两个类本身不具备读写文件的能力&#xff0c;这两个类都间接继承自Filter Input Stream&#xff0c;因此它们的构造方法允许传入一个真正具备读写功能的字符流对象。如FileInputStream和FileOutputStream的对象&#xff0c;从尾完成文件的读…

数据赋能(145)——开发:数据拆分——实施过程、应用特点

实施过程 数据拆分的实施过程通常涉及以下几个关键步骤&#xff1a; 确定拆分目标和需求&#xff1a; 明确数据拆分的目的和需求&#xff0c;例如是为了减少数据处理的复杂性、提高查询效率还是为了满足特定的业务需求。根据需求确定拆分后的数据结构和拆分规则。选择拆分方法…

合宙 Air780E模块 AT 指令 MQTT连接

固件说明 重启模块 //tx ATRESET//rx ATRESETOK ^boot.romv!\n RDY^MODE: 17,17E_UTRAN ServiceCGEV: ME PDN ACT 1NITZ: 2024/07/10,08:33:440,0查询模块版本信息 //tx ATCGMR//rx ATCGMRCGMR: "AirM2M_780E_V1161_LTE_AT"OK基本流程 4G模块支持MQTT和MQTT SSl协…

【LeetCode】存在重复元素 II

目录 一、题目二、解法完整代码 一、题目 给你一个整数数组 nums 和一个整数 k &#xff0c;判断数组中是否存在两个 不同的索引 i 和 j &#xff0c;满足 nums[i] nums[j] 且 abs(i - j) < k 。如果存在&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。…

如何安装和管理RabbitMQ

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。 简介 将事情推迟一段时间而不是立即去做&#xff0c;可能被认为是懒惰的。事实上&#xff0c;大多数情况下可能确实如此。然而&#xff…

顶顶通呼叫中心中间件-私有化asrproxy配置热词模型

顶顶通呼叫中心中间件-私有化asrproxy配置热词模型 1、配置热词文件 将热词存在一个txt文件中&#xff0c;比如&#xff1a;hotword.txttxt文本里面写热词&#xff0c;一个热词一行&#xff0c;用utf8编码把热词文件上传到asrproxy程序目录中&#xff0c;路径&#xff1a;/dd…

音视频入门基础:H.264专题(12)——FFmpeg源码中通过SPS属性计算视频分辨率的实现

一、引言 在上一节《音视频入门基础&#xff1a;H.264专题&#xff08;11&#xff09;——计算视频分辨率的公式》中&#xff0c;讲述了通过SPS中的属性计算H.264编码的视频的分辨率的公式。本文讲解FFmpeg源码中计算视频分辨率的实现。 二、FFmpeg源码中计算视频分辨率的实现…

读人工智能全传10深度思维

1. 深度思维 1.1. DeepMind 1.1.1. 深度思维 1.1.2. 2014年的员工不足25人 1.1.3. 深度思维公司公开宣称其任务是解决智能问题 1.1.4. 2014年谷歌收购DeepMind&#xff0c;人工智能突然成了新闻热点&#xff0c;以及商业热点 1.1.4.1. 收购报价高达4亿英镑 1.1.4.2. 深度…

头歌资源库(26)方格填数

一、 问题描述 二、算法思想 这是一个排列组合问题。我们可以使用动态规划的思想来求解。 假设dp[i]表示填入前i个位置的数字的方案数。考虑第i个位置&#xff0c;它有9种填法&#xff08;0~9减去前一个位置上的数字&#xff09;&#xff0c;则有dp[i] 9 * dp[i-1]。由于第…

ArduPilot开源飞控之AP_Mount_Backend

ArduPilot开源飞控之AP_Mount_Backend 1. 源由2. 框架设计2.1 类构造函数2.2 公共方法2.2.1 重要方法2.2.2 运动能力&#xff08;需要在子类中重写&#xff09;2.2.3 模式处理2.2.4 目标处理2.2.5 命令处理2.2.6 消息传递和状态2.2.7 回调函数2.2.8 相机控制2.2.9 测距仪 2.3 保…

samout 结构再优化 收敛速度再加快

代码 import torch import numpy as npclass MaxState(torch.nn.Module):def __init__(self, hidden_dim, heads, win):super(MaxState, self).__init__()assert hidden_dim % heads 0, "Hidden size must be divisible by the number of heads."self.head_size h…

基于python实现并编译提升cpu与内存使用率的脚本

在服务器运维过程中&#xff0c;有很多公司会对服务器的资源使用率进行监测&#xff0c;发现使用率不高了&#xff0c;会对服务器降配。如果你是乙方&#xff0c;你可以尝试一下这种方法&#xff0c;脚本提升cpu与内存的使用率。如果你需要对服务器性能或者服务稳定性进行测试&…

Redis 布隆过滤器性能对比分析

redis 实现布隆过滤器实现方法&#xff1a; 1、redis 的 setbit 和 getbit 特点&#xff1a;对于某个bit 设置0或1&#xff0c;对于大量的值需要存储&#xff0c;非常节省空间&#xff0c;查询速度极快&#xff0c;但是不能查询整个key所有的bit&#xff0c;在一次请求有大量…

240711_昇思学习打卡-Day23-LSTM+CRF序列标注(2)

240711_昇思学习打卡-Day23-LSTMCRF序列标注&#xff08;2&#xff09; 今天记录LSTMCRF序列标注的第二部分。仅作简单记录 Score计算 首先计算正确标签序列所对应的得分&#xff0c;这里需要注意&#xff0c;除了转移概率矩阵&#x1d40f;外&#xff0c;还需要维护两个大小…