保姆级教程:js前端接入科大讯飞语音评测,实现朗读打分,vue对接科大讯飞语音评测,还可以实现句子逐词分析对错以及打分,将demo接入vue项目中

需求说明:实现一个点击录制英文句子朗读,然后调用科大讯飞接口分析朗读准确度,并逐词分析朗读正确性。

步骤一、下载运行demo

首先附上科大讯飞语音评测流式版的文档链接:链接在此
然后在文档里找到demo下载,如图:
语音评测demo

这是一个原生的html项目,我们使用环境打开,使用cnpm安装依赖并运行,这里的步骤藏在README中,可以直接看并复制运行命令:
科大讯飞语音评测demo目录结构
科大讯飞语音评测demo目录结构
以上就是项目的目录结构了,安装好依赖以后按照他定义的命令来运行即可。运行出来的画面是这样的:
在这里插入图片描述

步骤二、注册获取appid

运行起来以后还不能直接调用接口,因为我们需要在讯飞开放平台注册登录并创建应用,然后拿到appid,apisecret,apikey这3个数据,然后填到demo中的index.js中去,保存再来操作点击开始识别,就可以用了,免费版的每天可以调用500次接口,测试够用了。

key
这是分析完成的结果
在这里插入图片描述

步骤三、引入自己的VUE项目中

demo是使用webpack的包管理工具,如果我们要接入vue,那我们接着往下走:
首先我们大概估计哪些是重要的工具,如图:
在这里插入图片描述
红框圈起来的是我们需要用到的文件,其实已经是全部的内容了,红线删除的两个页面和样式文件留不留都无所谓,反正我们肯定要用我们自己的样式页面。最最重要的就是index.js文件了,这里直接写了长链接的开启、录音权限的调用、请求状态的监听等等,这个文件很重要,

我们把index.js里面的所有带有布局id的内容都删掉,比如:
在这里插入图片描述
当然还有其他的一些布局相关的也删掉,自己去找一下吧。删掉以后看调用吧,调用最重要的就是两个监听事件,一个是长链接状态监听,一个是获取分析结果监听,代码长这样:


let iseRecorder = new IseRecorder()
let countInterval
// 状态改变时触发
iseRecorder.onWillStatusChange = function(oldStatus, status) {
    
    
  // 可以在这里进行页面中一些交互逻辑处理:倒计时(语音评测支持180s),录音的动画,按钮交互等
}

// 监听识别结果的变化
iseRecorder.onTextChange = function(grade) {
    
    
  console.log('iseRecorder.onTextChange==>',grade)
  console.log(JSON.stringify(grade))
}

这就是调用并监听,我们把这两个监听事件放到我们的vue组件的mounted中,让他自动创建监听并实现事件的操作。

在这里插入图片描述
然后我们搞一个按钮,点击以后调用this.iseRecorder.start()这句来实现录制,当录制状态发生改变的时候,我们可以在监听事件中获取到状态来对我们的界面进行操作(图标切换、进度条展示、倒计时等)
在这里插入图片描述

注意!!! 添加依赖并配置worker

这里调用会出一个问题,那就是在index.js里有这么一句:let transWorker = new TransWorker(),这句话会报一个错,
_IMPORTED_MODULE_50___default.a is not a constructor
at eval (index.js:19:1)
错误内容说这里不是一个构造器,不能new,我们进到transcode.worker.js这个文件里看下
在这里插入图片描述
发现确实也不是一个类,(大致解释一下:是使用立即调用函数表达式(Immediately-invoked function expression,IIFE)来创建一个名为transAudioData的对象,并将其作为Web Worker的处理程序。Web Worker在处理传入消息时会调用onmessage函数,因此该函数被指定为self.onmessage的值。然后,transAudioData对象具有一个transcode方法,用于执行音频转码。当此方法被调用时,它将输入的音频数据进行转码,并使用postMessage方法将输出数据发送回主线程。)

上面这段文字了解就好了,咱们接着解决问题,为什么demo中就可以直接new,而我们不行呢,是因为少一个配置:

首先我们在依赖中添加(你的项目中可能还缺少其中的别的依赖,根据报错去引入即可)

"crypto-js": "^4.0.0",
"fast-xml-parser": "^3.17.4",
"crypto-js": "^4.0.0",
"copy-webpack-plugin": "^5.1.1",

在vue.config.js文件顶部添加:

const CopyWebpackPlugin = require('copy-webpack-plugin');

然后在vue.config.js中的configureWebpack下添加以下内容(注意这里的路径的写法和demo有区别哦,写法不对是无法传输录音数据的呦):

		module: {
    
    
            rules: [
                {
    
    
                    test: /\.worker\.js$/,
                    use: {
    
     loader: 'worker-loader' }
                }
            ]
        },
        plugins: [
            new CopyWebpackPlugin([{
    
    
                from: './src/audiorecord/pages/doc/readme.md',
                to: './data/doc.readme.md'
            }, {
    
    
                from: './src/audiorecord/pages/doc/transcode.js',
                to: './data/transcode.js'
            }, {
    
    
                from: './src/audiorecord/pages/doc/websocket.js',
                to: './data/websocket.js'
            }])
        ],

在这里插入图片描述

解释一下这部分配置内容,就是音频录制相关的内容,如果不配置的话,就无法获取录制的音频数据。

然后在控制台命令行终端ctrl+C停止,然后重新运行项目,就可以生效了,这个问题很关键,没有人指点的话会卡很久,
然后我们就可以接着上面的步骤,在vue组件中继续调用了。至此可以成功返回数据了。数据如图,至于解析json数据,自己去处理吧,能看到这儿的同学肯定不用我来指点怎么去分析json数据吧,数据拿到了,那不就想怎么处理就怎么处理喽。

在这里插入图片描述

结尾、打分参数

对了,打分和分析单词对错的参数,文档里都有,官方文档在此,包括每个单词也有分数,但是单词的对错有一个专门的参数,我把这个秘密告诉你吧:serr_msg,你去数据里搜索这个参数名就可以,这个参数等于0代表正确,1代表错误,其他的值是官方用来测试新值的,可以忽略不计,都按照错误处理吧。

结语

到这里就完了,虽然乱了一些,但是总归很详细,希望你能看明白哈哈哈,不明白的或者没实现的可以评论区提问,我知无不言。主要是给自己做个记录,以防下次再用就忘记了,拜拜~~

猜你喜欢

转载自blog.csdn.net/Spy003/article/details/130120518