vue3+vite+ts项目集成科大讯飞语音识别(项目搭建过程以及踩坑记录)

news2024/11/24 5:06:33

🐱个人主页:不叫猫先生
🙋‍♂️作者简介:前端领域新星创作者、华为云享专家、阿里云专家博主,专注于前端各领域技术,共同学习共同进步,一起加油呀!
💫系列专栏:vue3从入门到精通
📝个人签名:不破不立

目录

    • 项目背景
    • 一、项目环境
    • 二、注册科大讯飞
    • 三、下载语音识别demo
    • 四、新建vue3项目
    • 四、项目目录
    • 五、配置
    • 六、踩坑记录
    • 七、实现效果

项目背景

本人最近在做数字人项目,用到科大讯飞的语音识别功能,遇到了许多坑,做个总结,给兄弟们铺铺路。科大讯飞语音识别主要通过识别声音然后转换成文字,具体展示如下图所示:
在这里插入图片描述

一、项目环境

vue3+ts+vite

二、注册科大讯飞

注册后新建个应用,拿到APPID、APISecret、APIkey,在项目中会用到这三个参数,新用户有500条免费的服务量。
,在这里插入图片描述

三、下载语音识别demo

科大讯飞文档中心中示例demo,博主选择的是js语言,注意该demo项目环境为webpack+js

在这里插入图片描述

选择demo-js语言下载
,

四、新建vue3项目

yarn creat vite 'project-name'
或者
npm init vite@latest 'project-name'

在这里插入图片描述

四、项目目录

digitalPerson
├─ .gitignore
├─ README.md
├─ auto-imports.d.ts
├─ index.html
├─ package.json
├─ public
│  ├─ index.html
│  └─ vite.svg
├─ src
│  ├─ App.vue
│  ├─ assets
│  │  └─ vue.svg
│  ├─ components
│  │  └─ HelloWorld.vue
│  ├─ iat_ws.js
│  ├─ layout
│  │  └─ index.vue
│  ├─ main.ts
│  ├─ router
│  │  └─ index.ts
│  ├─ style.css
│  ├─ until
│  │  ├─ base64js.js
│  │  ├─ bootstrap.js
│  │  ├─ browser.min.js
│  │  ├─ jquery.js
│  │  └─ transcode.worker.js
│  ├─ views
│  │  └─ index.vue
│  └─ vite-env.d.ts
├─ tsconfig.json
├─ tsconfig.node.json
├─ vite.config.ts
├─ vite.config.ts.js
└─ yarn.lock

五、配置

package.json配置项具体如下,我们需要安装一些依赖来支持语音识别demo适应vue3环境,不然会遇到很多问题.

 "dependencies": {
    "@originjs/vite-plugin-commonjs": "^1.0.3",
    "@rollup/plugin-inject": "^5.0.3",
    "ant-design-vue": "^3.2.15",
    "jquery": "^3.6.2",
    "vue": "^3.2.45",
    "vue-router": "^4.1.6"
  },
  "devDependencies": {
    "@types/node": "^18.11.17",
    "@vitejs/plugin-vue": "^4.0.0",
    "crypto-js": "4.0.0",
    "typescript": "^4.9.3",
    "unplugin-auto-import": "^0.12.1",
    "vconsole": "^3.15.0",
    "vite": "^4.0.0",
    "vue-tsc": "^1.0.11"
  }
依赖名称描述
@originjs/vite-plugin-commonjs项目中混用 require 和 import ,即存在混用 commonJS 和 ES6 模块的情况,需要用该插件的transformMixedEsModules 配置进行 hotfix
@rollup/plugin-inject使用该插件注入全局 jQuery 环境
@types/node可以整体解决模块的声明文件问题
crypto-js加密、解密
unplugin-auto-import自动导入vue、vue-router等提供的API
vconsole提供轻量、可拓展、针对手机网页的前端开发者调试面板

具体代码实现如下:


import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import { resolve } from 'path'
import AutoImport from 'unplugin-auto-import/vite'
import { viteCommonjs } from '@originjs/vite-plugin-commonjs' // 让浏览器支持commonjs语法
import inject from '@rollup/plugin-inject'
export default defineConfig({
  plugins: [
    vue(),
    AutoImport({
      imports: ['vue', 'vue-router']//自动导入vue和vue-router相关函数
    }),
    inject({
      $: "jquery",  // 这里会自动载入 node_modules 中的 jquery
      jQuery: "jquery",
      "windows.jQuery": "jquery"
    }),
    viteCommonjs({
    transformMixedEsModules: true//混用 commonJS 和 ES6 模块
    })
  ],
  resolve: {
    alias: {
      '@': resolve(__dirname, 'src'),
      'components': resolve(__dirname, 'src/components'),
    },
    extensions: ['.js', '.json', '.ts', '.vue'], // 使用路径别名时想要省略的后缀名,可以自己 增减
  },
  server: {
    port: 8070,
    host: true,
    open: true,
    proxy: {},
    hmr: true,  // 开启热更新
  }
})

六、踩坑记录

在科大讯飞的js-demo中,并没有用到vue或者vite,我们实际开发时都会遇到let transWorker = new TransWorker()代码报错,比如:

报错1:TypeError:TransWorker is not a constructor
报错2:Uncaught SyntaxError: The requested module '/src/until/transcode.worker.js?t=1671455993687' does not provide an export named 'default'

为什么会报错呢?

import TransWorker from ‘js/transcode.worker.js引入了webWorker文件,webWorker相当于js中的线程,在主线程中启动一个子线程不影响ui,有关webworker内容如下:

web worker 是运行在后台的 JavaScript,不会影响页面的性能。 当在 HTML 页面中执行脚本时,页面的状态是不可响应的,直到脚本已完成。
web worker 是运行在后台的 JavaScript,独立于其他脚本,不会影响页面的性能。您可以继续做任何愿意做的事情:点击、选取内容等等,而此时 web worker 在后台运行。

在iat_ws.js(本人自定义的文件)文件里面const transWorker = new TransWorker() 报错,原因是vue里面不能直接使用原生的new Worker,vite中有专门关于webworker的配置项,详细请前往vite中webworker配置

语法:
const worker = new Worker(new URL(‘./worker.js’, import.meta.url))

所以需要将以下代码

 import TransWorker from './until/transcode.worker.js'
 let transWorker = new TransWorker()

改为如下

  const transWorker = new Worker(new URL('./until/transcode.worker.js', import.meta.url))

并且transcode.worker.js文件需要修改为如下所示:

  self.onmessage = function(e){
    transAudioData.transcode(e.data)
  }
  let transAudioData = {
    transcode(audioData) {
      let output = transAudioData.to16kHz(audioData)
      output = transAudioData.to16BitPCM(output)
      output = Array.from(new Uint8Array(output.buffer))
      self.postMessage(output)
    },
    to16kHz(audioData) {
      var data = new Float32Array(audioData)
      var fitCount = Math.round(data.length * (16000 / 44100))
      var newData = new Float32Array(fitCount)
      var springFactor = (data.length - 1) / (fitCount - 1)
      newData[0] = data[0]
      for (let i = 1; i < fitCount - 1; i++) {
        var tmp = i * springFactor
        var before = Math.floor(tmp).toFixed()
        var after = Math.ceil(tmp).toFixed()
        var atPoint = tmp - before
        newData[i] = data[before] + (data[after] - data[before]) * atPoint
      }
      newData[fitCount - 1] = data[data.length - 1]
      return newData
    },
    to16BitPCM(input) {
      var dataLength = input.length * (16 / 8)
      var dataBuffer = new ArrayBuffer(dataLength)
      var dataView = new DataView(dataBuffer)
      var offset = 0
      for (var i = 0; i < input.length; i++, offset += 2) {
        var s = Math.max(-1, Math.min(1, input[i]))
        dataView.setInt16(offset, s < 0 ? s * 0x8000 : s * 0x7fff, true)
      }
      return dataView
    },
  }

七、实现效果

具体实现效果如下,样式忽略😄
在这里插入图片描述

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

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

相关文章

Web前端105天-day48-jQuery

jQuery01 目录 前言 一、复习 二、jQuery 三、css操作 四、点击事件 五、class 六、show_hide 七、标签栏切换 八、自定有动画 九、属性操作 十、大小图切换 总结 前言 jQuery01学习开始 一、复习 DOM: 文档 对象 模型 HTML代码 转换成 document 对象, 然后再渲染…

ospf,三层交换机,热备,以太网通道练习实验(含命令)

♥️作者&#xff1a;小刘在这里 ♥️每天分享云计算网络运维课堂笔记&#xff0c;疫情之下&#xff0c;你我素未谋面&#xff0c;但你一定要平平安安&#xff0c;一 起努力&#xff0c;共赴美好人生&#xff01; ♥️夕阳下&#xff0c;是最美的&#xff0c;绽放&#xff0c;…

Sikuli循环执行点击图标的脚本

首先需要sikulix jar包 新建java项目 导入sikulix jar包 编写代码如下 这样电脑每隔一段时间就会去点击一下c.png这个图标 package one; import org.sikuli.script.Screen; public class clickMouse { public static void main(String[] args) throws Exception { …

人力资本管理(HCM)软件的主要好处是什么?

人力资本管理&#xff08;HCM&#xff09;包括企业在招聘、雇用和培训期间为优化生产力采取的所有流程。为了最大限度地发挥团队的作用&#xff0c;留住顶尖人才&#xff0c;管理者和领导者需要投资于适当的实践和资源。实现这一目标的方法之一是通过人力资本管理。 作为一套…

js中数组是如何在内存中存储的?

数组不是以一组连续的区域存储在内存中&#xff0c;而是一种哈希映射的形式。它可以通过多种数据结构来实现&#xff0c;其中一种是链表。 js分为基本类型和引用类型&#xff1a; 基本类型是保存在栈内存中的简单数据段&#xff0c;它们的值都有固定的大小&#xff0c;保存在…

【FFmpeg+Qt】视频进度条控制——点击跳转和拖动跳转

首先进度条采用Qslider&#xff0c;设置进度条主要有两点&#xff0c;一是当前视频总时长&#xff0c;二是当前播放时长&#xff0c;需要通过FFmpeg转码成mp4文件才能获取相应的时长数据&#xff1b; 往期回顾&#xff1a; 【QtFFmpeg】视频转码详细流程_logani的博客-CSDN博…

从用户测试中学到的知识

从客户那里获得良好的反馈是个挑战。用户测试有的时候看起来是一个艰巨而且昂贵的任务。但是用户测试可以带来良好的经验&#xff0c;从而帮助设计更好的产品。 那么&#xff0c;从哪里开始呢?我测试了几种方法&#xff0c;有些失败&#xff0c;有些成功。下面我将讲述我所学到…

基于JAVA的教学进度在线管理系统/教学大纲在线管理系统源代码+数据库,含详细项目需求分析、概要设计、详细设计及项目总结文档

项目启动步骤 使用 SQL_Scripts/tms.sql 中的 sql 语句创建数据库与数据库表(数据库建立中&#xff0c;暂无) 修改 src/a_little_config.txt 文件&#xff0c;填入正确的数据库连接用户名、密码 将项目导入 IntelliJ IDEA 或 eclipse。 打开 cn.findix.tms.bin 包下的 WWW 文…

C#使用随机数模拟器来模拟世界杯排名(三)

接上篇 C#使用随机数模拟器来模拟世界杯排名(二)_斯内科的博客-CSDN博客 上一篇我们使用随机数匹配比赛的世界杯国家&#xff0c; 这一篇我们使用随机数以及胜率模拟器 决赛出 世界杯冠军、亚军。 我们在主界面 新增按钮【开始比赛 直到 决出冠军】和【刷新重新随机分配】 …

Python语言程序设计实验报告

第二章&#xff1a;Python变量与数据类型 一、实验目的&#xff1a; 1.了解Python变量的概念与相关含义&#xff1b; 2.学习Python中的数据类型&#xff1b; 二、实验环境&#xff1a; 1.笔记本电脑 2.PyCharm Community Edition 2022.2.3工具 三、实验内容&#xff1a; 1.将字…

ZABBIX6.0LTS安装笔记

一、准备好干净的操作系统 推荐使用&#xff1a;Rocky Linux 8.6 二、安装ZABBIX 官网&#xff1a;https://www.zabbix.com/cn/download 【1】选择您Zabbix服务器的平台 【2】 安装Zabbix包 下载安装包源 # rpm -Uvh https://repo.zabbix.com/zabbix/6.0/rhel/8/x86_64/zabb…

Spring的动态AOP源码解析

一… 引入 1.1 概念 1.2 注解方式使用AOP @Aspect public class LogAspects {/*** 1. 本类引用,只需要写方法名* 2. 其他类引用,需要写路径*/@Pointcut("execution(public int com.floweryu.aop.MathCalculator.*(..))")public void pointCut

Linux--进程间通信

目录1. 进程间通信目的2. 管道2.1 管道特性&#xff08;匿名管道&#xff09;2.1.1 单向通信2.1.2 面向字节流2.2 管道的大小2.3 命名管道3. system V进程间通信3.1 shmget函数3.1.1 key VS shmid3.2 shmctl函数3.3 shmat函数 VS shmdt函数&#xff1a;3.4 测试4. 感性认识4.1 …

R语言中的多类别问题的绩效衡量:F1-score 和广义AUC

最近我们被客户要求撰写关于分类的研究报告&#xff0c;包括一些图形和统计输出。对于分类问题&#xff0c;通常根据与分类器关联的混淆矩阵来定义分类器性能。根据混淆矩阵 &#xff0c;可以计算灵敏度&#xff08;召回率&#xff09;&#xff0c;特异性和精度。 对于二进制…

基于javaweb物业管理系统的设计与实现/小区物业管理系统

摘 要 随着世界经济快速的发展&#xff0c;全国各地的城市规模不断扩大&#xff0c;住进城市的人口日益增多&#xff0c;房地产行业在现代社会的发展中有着重要的作用&#xff0c;有越来越多的人居住在小区里。 因此&#xff0c;一套高效并且无差错的物业管理系统软件在现代社会…

基于Android的校园一卡通App平台

演示视频信息&#xff1a; A6604基于Android的校园一卡通一、研究背景、目的及意义 &#xff08;一&#xff09;研究背景 二十一世纪是信息化的时代&#xff0c;信息化建设成为我们的首要任务。当前我国大力发展信息产业&#xff0c;在全国范围内各行各业开始实施信息化…

为什么要上机械制造业ERP系统?对企业有什么帮助?

在日益竞争激烈的市场背景下&#xff0c;机械制造企业提供的产品需要具有更短的交货期、更高的质量、更好的服务。而机械行业由于其工艺复杂的生产特点&#xff0c;工艺及在制品管理困难&#xff0c;单纯的靠手工记账处理&#xff0c;已经难以满足现代企业科学管理的需要。只有…

艾美捷IFN-gamma体内抗体参数及应用

艾美捷IFN-gamma体内抗体背景&#xff1a; 干扰素γ&#xff08;IFN-γ&#xff09;或II型干扰素是一种二聚可溶性细胞因子&#xff0c;是II型干扰素的唯1成员。它是一种细胞因子&#xff0c;对抵抗病毒和细胞内细菌感染的先天性和适应性免疫以及肿瘤控制至关重要。IFNG主要由…

TensorFlow平台应用

目录 一&#xff1a;TensorFlow简介 二&#xff1a;TensorFlow工作形式 三&#xff1a;图/Session 四&#xff1a;安装tensorflow 五&#xff1a;张量 六&#xff1a;变量/常量 七&#xff1a;创建数据流图、会话 八&#xff1a;张量经典创建方法 九&#xff1a;变量赋…

[Java EE初阶]Thread 类的基本用法

本就无大事,庸人觅闲愁. 文章目录1. 线程创建2. 线程中断2.1 通知终止后立即终止2.2 通知终止,通知之后线程继续执行2.3 通知终止后,添加操作后终止3. 线程等待4. 线程休眠5. 获取线程实例1. 线程创建 创建线程有五个方法 详情见我的另一个文章 https://editor.csdn.net/md/?…