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

news2024/12/24 10:03:10

阿里提供的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 = 3000

interface INlsConfig {
  url?: string
  appkey: string // 应用的key
  token: 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 = false

enum 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 = conf
      console.log(`connected to ${NLS_SERVER_URL} success`)
    },
    fail: (res) => {
      console.log(`connect to ${NLS_SERVER_URL} failed:${res.errMsg}`)
    }
  })
  client.readyState = WsState.CONNECTING

  client.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?.result
            if (text) {
              recognizedCallback(text)
            }
          }
          console.log('changed')
          break
        }
        case 'RecognitionCompleted': {
          const text = msgObj?.payload?.result
          if (text) {
            recognizedCallback(text)
          }
          taskStarted = false // 结束识别
          break
        }
        case 'TaskFailed': {
          taskStarted = false // 结束识别
          break
        }
      }
    }
    console.log('recv:' + res.data)
  })

  client.onOpen(() => {
    reconnectAttempts = 0
    client.readyState = WsState.OPEN
    if (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.CLOSED
    console.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.coloradmin.cn/o/1927985.html

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

相关文章

AndroidStudio 删除未使用的资源精简apk体积

历史项目开发下来&#xff0c;会有很多未使用的类、布局xml 、资源文件等。 未使用的图片资源&#xff0c;会增大apk体积。 为了精简应用&#xff0c;需要去掉。 查找未使用的资源 Code – Analyze Code – Run Inspection by Name 输入 Unused 会有提示 选择要查找的目录…

C#环境与数据类型

文章目录 C#环境.NET 框架集成开发环境 创建一个C#项目数据类型值类型引用类型对象类型object动态类型dynamic字符串类型string 指针类型 类型转换隐式转换显示转换&#xff08;强制转换&#xff09;C#提供的类型转换方法Convert类Parse方法TryParse方法 C#环境 .NET 框架 C#是…

ESP32CAM人工智能教学13

ESP32CAM人工智能教学13 openCV 安装 小智发现openCV是一款非常出色的机器视觉软件&#xff0c;可以配合ESP32Cam的摄像头&#xff0c;开发出许许多多的人工智能应用情境。 下载视频服务驱动库 OpenCV是开源的计算机视觉驱动库&#xff0c;可以应用于机器人的图形处理、机器学…

Mac清理软件cleanmymac x4.14.4破解版,2024年有免费cleanmymac x激活码

​ CleanMyMac X 4.14.4破解版可以快速识别并删除占用磁盘空间的无用文件&#xff0c;提升我们系统的存储空间。它还可以优化启动项、修复系统错误和保护隐私等。总之CleanMyMac X十分强大有需要的赶快下载吧&#xff0c; CleanMyMac X 许可证激活码:ak39840506641bjckr 需要…

RK3568笔记三十八:DS18B20驱动开发测试

若该文为原创文章&#xff0c;转载请注明原文出处。 DS18B20驱动参考的是讯为电子的单总线驱动第十四期 | 单总线_北京迅为的博客-CSDN博客 博客很详细&#xff0c;具体不描述。 只是记录测试下DS18B20读取温度。 一、介绍 流程基本和按键驱动差不多&#xff0c;主要功能是…

7.16做题总结

今日也是让我看到了繁神的ACM历程&#xff0c;确实&#xff0c;我觉得繁神的历程里面确实有一句很好 不想打算法竞赛了。这是因为有别的事情要做&#xff0c;不是因为我打不动。    不想打比赛凌晨两点才睡了。因为我会困。    不想在群里和高水平选手水群了&#xff0c;因…

BayesPrism(贝叶斯棱镜法)可提取单细胞数据去卷积后将信息映射至bulkRNA数据

贝叶斯棱镜法作为一种工具可以根据scRNA数据(作为先验模型)去推断bulkRNA数据中肿瘤微环境组成(不同免疫细胞组分/不同细胞群)和基因表达情况。 开发者展示的图片就很形象了&#xff0c;左边图展示了把标注了不同细胞类型的单细胞数据作为先验信息(prior info)的基因信息和bul…

【内网渗透】内网渗透学习之域渗透常规方法

域渗透常规方法和思路 1、域内信息收集1.1、获取当前用户信息1.1.1、获取当前用户与域 SID1.1.2、查询指定用户的详细信息 1.2、判断是否存在域1.2、查询域内所有计算机1.3、查询域内所有用户组列表1.4、查询所有域成员计算机列表1.5、获取域密码信息1.6、获取域信任信息1.7、查…

STM32智能环境监测系统教程

目录 引言环境准备智能环境监测系统基础代码实现&#xff1a;实现智能环境监测系统 4.1 数据采集模块 4.2 数据处理与控制模块 4.3 通信与网络系统实现 4.4 用户界面与数据可视化应用场景&#xff1a;环境监测与管理问题解决方案与优化收尾与总结 1. 引言 智能环境监测系统通…

Redis的配置优化、数据类型、消息队列

文章目录 一、Redis的配置优化redis主要配置项CONFIG 动态修改配置慢查询持久化RDB模式AOF模式 Redis多实例Redis命令相关 二、Redis数据类型字符串string列表list集合 set有序集合sorted set哈希hash 三、消息队列生产者消费者模式发布者订阅者模式 一、Redis的配置优化 redi…

OSI 七层模型与五层模型

OSI&#xff08;开放系统互连&#xff09;七层模型和五层模型是描述计算机网络协议的两种不同层次划分方法。两者用于帮助理解和设计网络协议&#xff0c;但它们在层次划分上有所不同。

手机数据恢复:适用于 Android 的 4 大数据恢复应用程序

没有人希望丢失设备上的重要数据。如果发生这种情况&#xff0c;请不要惊慌。以下是可帮助您恢复丢失或删除的数据的 Android 数据恢复应用程序列表。 有多种方法可以恢复已删除或丢失的 Android 数据&#xff0c;最简单、最快捷的方法是使用第三方恢复应用程序。这些应用程序会…

Redis 中String类型操作命令(命令演示,时间复杂度,返回值,注意事项)

String 类型 文章目录 String 类型set 命令get 命令mset 命令mget 命令get 和 mget 的区别incr 命令incrby 命令decr 命令decrby 命令incrbyfloat 命令append 命令getrange 命令setrange 命令 字符串类型是 Redis 中最基础的数据类型&#xff0c;在讲解命令之前&#xff0c;我们…

新增支持GIS地图、数据模型引擎升级、增强数据分析处理能力

为了帮助企业提升数据分析处理能力&#xff0c;Smartbi重点围绕产品易用性、用户体验、操作便捷性进行了更新迭代&#xff0c;同时重磅更新了体验中心。用更加匹配项目及业务需求的Smartbi&#xff0c;帮助企业真正发挥数据的价值&#xff0c;赋能决策经营与管理。 Smartbi用户…

昇思25天学习打卡营第7天 | 基于MindSpore的GPT2文本摘要

本次打卡基于gpt2的文本摘要 数据加载及预处理 from mindnlp.utils import http_get# download dataset url https://download.mindspore.cn/toolkits/mindnlp/dataset/text_generation/nlpcc2017/train_with_summ.txt path http_get(url, ./)from mindspore.dataset impor…

比华为、特斯拉更大的野心

作者 | 艾泊宇 最近百度自动驾驶的网约车萝卜快跑在武汉大规模上路了。 同样是做自动驾驶&#xff0c;你看百度、华为、特斯拉&#xff0c;他们三家的思路完全不同。 但是可以看出来&#xff0c;各自完全不同的用意和意图&#xff0c;以及格局的高低。 华为很稳&#xff0c;…

BernNet Learning Arbitrary Graph Spectral Filters via Bernstein Approximation

发表于:neurips21 推荐指数: #paper/⭐⭐ 设定:在本文中,h是过滤器. bernstein 多项式逼近(这个证明有点稀里糊涂的,反正我觉得一点点问题,可能因为我水平低) p K ( t ) : ∑ k 0 K θ k ⋅ b k K ( t ) ∑ k 0 K f ( k K ) ⋅ ( K k ) ( 1 − t ) K − k t k . p_K(t):…

太牛了!从来没想到加密软件这么好用

还在为无法保证重要信息安全烦恼吗&#xff1f;金刚钻信息网站&#xff0c;一个集数据防泄密系统、企业数据云盘存储为一身的多个安全产品网站&#xff0c;为企业文件保驾护航&#xff01; 一、全方位防护&#xff0c;无懈可击 数据防泄密系统从电脑内部&#xff0c;电脑外部多…

AV1 编码标准熵编码技术概述

AV1熵编码 AV1编码技术是一种开源的视频编解码标准&#xff0c;由开放媒体联盟&#xff08;AOMedia&#xff09;开发&#xff0c;旨在提供高效的视频压缩&#xff0c;同时避免复杂的专利授权问题。在熵编码方面&#xff0c;AV1采用了一种多符号上下文自适应算术编码技术&#x…

EMR 集群时钟同步问题及解决方案An error occurred (InvalidSignatureException)

目录 1. 问题描述2. 问题原因3. 解决过程4. 时钟同步的重要性5. Linux 系统中的时钟同步方式6. 检查 Linux 系统时钟同步状态7. EMR 集群中的时钟同步配置8. 时钟同步对大数据组件的影响9. 监控和告警策略10. 故障排除和最佳实践11. 自动化时钟同步管理12. 时钟同步与数据一致性…