【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/140267684
https://mp.csdn.net/mp_blog/creation/editor/140267684
相关文章:
【UNI-APP】阿里NLS一句话听写typescript模块
阿里提供的demo代码都是javascript,自己捏个轮子。参考着自己写了一个阿里巴巴一句话听写Nls的typescript模块。VUE3的组合式API形式 startClient:开始听写,注意下一步要尽快开启识别和传数据,否则6秒后会关闭 startRecognition…...
Apache Spark分布式计算框架架构介绍
目录 一、概述 二、Apache Spark架构组件栈 2.1 概述 2.2 架构图 2.3 架构分层组件说明 2.3.1 支持数据源 2.3.2 调度运行模式 2.3.3 Spark Core核心 2.3.3.1 基础设施 2.3.3.2 存储系统 2.3.3.3 调度系统 2.3.3.4 计算引擎 2.3.4 生态组件 2.3.4.1 Spark SQL 2.…...
Visual Studio 2019 (VS2019) 中使用 CMake 配置 OpenCV 库(快捷版)
2024.07.11 测试有效 最近需要用一下 opencv 处理图像,简单配置了一下Cmake下的 opencv 库。 没有编译 opencv ,也不知道他们为什么要自己编译 opencv 。 一、下载并安装 OpenCV 1.前往 OpenCV 官方网站 下载适用于您的系统的 OpenCV 安装包。 2.点击直接…...
BUG解决:postman可以请求成功,但Python requests请求报403
目录 问题背景 问题定位 问题解决 问题背景 使用Python的requests库对接物联数据的接口之前一直正常运行,昨天突然请求不通了,通过进一步验证发现凡是使用代码调用接口就不通,而使用postman就能调通,请求参数啥的都没变。 接口…...
VScode常用快捷键
VScode介绍 VSCode(全称:Visual Studio Code)是一款由微软开发且跨平台的免费源代码编辑器。能够在windows、Linux、IOS等平台上运行,通过安装一些插件可以让这个编辑器变成一个编译器。与Visual Studio相比,它是免费…...
Day1每日编程题日记:数字统计、两个数组的交集、点击消除
前言:该篇用于记录自看。曾回看昨天的做题代码,竟然会觉得陌生,这竟然是我写的,细细读了一下,原来我当时是这么想的。因此我觉得记代码没有实际用处,重点是领悟了思想,这样子代码就在心中&#…...
ENSP实现防火墙区域策略与用户管理
目录 实验拓扑与要求编辑 交换机与防火墙接口的配置 交换机: 创建vlan 接口配置 防火墙配置及接口配置 防火墙IP地址配置 云配置编辑编辑编辑 在浏览器上使用https协议登陆防火墙,并操作 访问网址:https://192.168.100.1:844…...
c#实现23种常见的设计模式--动态更新
c#实现23种常见的设计模式 设计模式通常分为三个主要类别: 创建型模式 结构型模式 行为型模式。 这些模式是用于解决常见的对象导向设计问题的最佳实践。 以下是23种常见的设计模式并且提供c#代码案例: 创建型模式: 1. 单例模式&#…...
昇思25天训练营Day11 - 基于 MindSpore 实现 BERT 对话情绪识别
模型简介 BERT全称是来自变换器的双向编码器表征量(Bidirectional Encoder Representations from Transformers),它是Google于2018年末开发并发布的一种新型语言模型。与BERT模型相似的预训练语言模型例如问答、命名实体识别、自然语言推理、…...
本地开发微信小程序,使用巴比达内网穿透
在微信小程序开发的热潮中,开发者常面临的一个挑战是如何在复杂的网络环境下测试和调试内网环境中的服务。巴比达正为这一难题提供了一条解决方案,极大简化了微信小程序与内网服务器之间通信的流程,加速了开发迭代周期。 以往,开…...
【LeetCode】快乐数
目录 一、题目二、解法完整代码 一、题目 编写一个算法来判断一个数 n 是不是快乐数。 「快乐数」 定义为: 对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。 然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变…...
大模型未来发展深度分析
大模型未来发展方向的深度探讨 近年来,人工智能技术的飞速发展,特别是大模型技术的崛起,为全球科技产业带来了前所未有的变革。大模型,以其强大的推理能力、创意生成能力和情绪智能,正在逐步成为推动社会经济发展的核…...
[线性RNN系列] Mamba: S4史诗级升级
前言 iclr24终于可以在openreview上看预印本了 这篇(可能是颠覆之作)文风一眼c re组出品;效果实在太惊艳了,实验相当完善,忍不住写一篇解读分享分享。 TL;DR (overview) Structured State-Sp…...
【鸿蒙学习笔记】元服务
官方文档:元服务规格 目录标题 什么是元服务特征第一个元服务-案例介绍创建项目源码启动模拟器启动entry创建卡片出发元服务 什么是元服务 特征 免安装分包预加载老化和更新机制 第一个元服务-案例介绍 创建项目 源码 Entry Component struct WidgetCard {buil…...
LIS+找规律,CF 582B - Once Again...
一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 582B - Once Again... 二、解题报告 1、思路分析 考虑朴素做法对T *n的数组求LIS 但是T * n可达1e9 思考一下,最优解无非就是几个循环节拼接,我们最差情况下对sqrt(T)个a[]求LIS即…...
数据赋能(145)——开发:数据拆分——实施过程、应用特点
实施过程 数据拆分的实施过程通常涉及以下几个关键步骤: 确定拆分目标和需求: 明确数据拆分的目的和需求,例如是为了减少数据处理的复杂性、提高查询效率还是为了满足特定的业务需求。根据需求确定拆分后的数据结构和拆分规则。选择拆分方法…...
【漏洞复现】Splunk Enterprise for Windows 任意文件读取漏洞 CVE-2024-36991
声明:本文档或演示材料仅用于教育和教学目的。如果任何个人或组织利用本文档中的信息进行非法活动,将与本文档的作者或发布者无关。 一、漏洞描述 Splunk Enterprise 是一款强大的机器数据管理和分析平台,广泛应用于企业中,用于实…...
FastAPI -- 第一弹
Hello World 经典的 Hello World 安装 pip install fastapi pip install "uvicorn[standard]"main.py from typing import Unionfrom fastapi import FastAPIapp FastAPI()app.get("/") def read_root():return {"Hello": "World"}…...
C++入门基础篇(1)
欢迎大家来到海盗猫鸥的博客—— 断更许久,让我们继续好好学习吧! 目录 1.namespace命名空间 命名空间的存在价值: 命名空间的定义: 命名空间的使用: 2.C输入输出函数 使用: 3.缺省参数 4.函数重载…...
基于html开发的在线网址导航在线工具箱源码
基于html开发的在线网址导航在线工具箱源码,将全部文件复制到服务器,入口文件是index.html 如需修改网址,可修改index.html 如需修改关于页面,可修改about里面的index页面 源码下载:https://download.csdn.net/down…...
7.4.分块查找
一.分块查找的算法思想: 1.实例: 以上述图片的顺序表为例, 该顺序表的数据元素从整体来看是乱序的,但如果把这些数据元素分成一块一块的小区间, 第一个区间[0,1]索引上的数据元素都是小于等于10的, 第二…...
QMC5883L的驱动
简介 本篇文章的代码已经上传到了github上面,开源代码 作为一个电子罗盘模块,我们可以通过I2C从中获取偏航角yaw,相对于六轴陀螺仪的yaw,qmc5883l几乎不会零飘并且成本较低。 参考资料 QMC5883L磁场传感器驱动 QMC5883L磁力计…...
在四层代理中还原真实客户端ngx_stream_realip_module
一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡(如 HAProxy、AWS NLB、阿里 SLB)发起上游连接时,将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后,ngx_stream_realip_module 从中提取原始信息…...
DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI
前一阵子在百度 AI 开发者大会上,看到基于小智 AI DIY 玩具的演示,感觉有点意思,想着自己也来试试。 如果只是想烧录现成的固件,乐鑫官方除了提供了 Windows 版本的 Flash 下载工具 之外,还提供了基于网页版的 ESP LA…...
【决胜公务员考试】求职OMG——见面课测验1
2025最新版!!!6.8截至答题,大家注意呀! 博主码字不易点个关注吧,祝期末顺利~~ 1.单选题(2分) 下列说法错误的是:( B ) A.选调生属于公务员系统 B.公务员属于事业编 C.选调生有基层锻炼的要求 D…...
【HTML-16】深入理解HTML中的块元素与行内元素
HTML元素根据其显示特性可以分为两大类:块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...
初学 pytest 记录
安装 pip install pytest用例可以是函数也可以是类中的方法 def test_func():print()class TestAdd: # def __init__(self): 在 pytest 中不可以使用__init__方法 # self.cc 12345 pytest.mark.api def test_str(self):res add(1, 2)assert res 12def test_int(self):r…...
关键领域软件测试的突围之路:如何破解安全与效率的平衡难题
在数字化浪潮席卷全球的今天,软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件,这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下,实现高效测试与快速迭代?这一命题正考验着…...
AI病理诊断七剑下天山,医疗未来触手可及
一、病理诊断困局:刀尖上的医学艺术 1.1 金标准背后的隐痛 病理诊断被誉为"诊断的诊断",医生需通过显微镜观察组织切片,在细胞迷宫中捕捉癌变信号。某省病理质控报告显示,基层医院误诊率达12%-15%,专家会诊…...
机器学习的数学基础:线性模型
线性模型 线性模型的基本形式为: f ( x ) ω T x b f\left(\boldsymbol{x}\right)\boldsymbol{\omega}^\text{T}\boldsymbol{x}b f(x)ωTxb 回归问题 利用最小二乘法,得到 ω \boldsymbol{\omega} ω和 b b b的参数估计$ \boldsymbol{\hat{\omega}}…...
