需求说明:实现一个点击录制英文句子朗读,然后调用科大讯飞接口分析朗读准确度,并逐词分析朗读正确性。
步骤一、下载运行demo
首先附上科大讯飞语音评测流式版的文档链接:链接在此
然后在文档里找到demo下载,如图:
这是一个原生的html项目,我们使用环境打开,使用cnpm安装依赖并运行,这里的步骤藏在README中,可以直接看并复制运行命令:
以上就是项目的目录结构了,安装好依赖以后按照他定义的命令来运行即可。运行出来的画面是这样的:
步骤二、注册获取appid
运行起来以后还不能直接调用接口,因为我们需要在讯飞开放平台注册登录并创建应用,然后拿到appid,apisecret,apikey这3个数据,然后填到demo中的index.js中去,保存再来操作点击开始识别,就可以用了,免费版的每天可以调用500次接口,测试够用了。
这是分析完成的结果
步骤三、引入自己的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代表错误,其他的值是官方用来测试新值的,可以忽略不计,都按照错误处理吧。
结语
到这里就完了,虽然乱了一些,但是总归很详细,希望你能看明白哈哈哈,不明白的或者没实现的可以评论区提问,我知无不言。主要是给自己做个记录,以防下次再用就忘记了,拜拜~~