UNIAPP调用讯飞语音评测API

1、历经千辛万苦,UNIAPP调用评测API终于完成,在此做下总结下:首先看效果!

2、实现第1步,首先是鉴权,用到的CryptoJS等工具都可以从讯飞和uniapp官方获取
import * as base64 from "base-64"
import CryptoJS from '../../static/crypto-js/crypto-js.js'
import parser from '../../static/fast-xml-parser/src/parser'
import * as utf8 from "utf8"

getWebSocketUrl() {
                return new Promise((resolve, reject) => {
                    // 请求地址根据语种不同变化
                    var url = "wss://ise-api.xfyun.cn/v2/open-ise";
                    var host = "ise-api.xfyun.cn";
                    var apiKeyName = "api_key";
                    var date = new Date().toGMTString();
                    var algorithm = "hmac-sha256";
                    var headers = "host date request-line";
                    var signatureOrigin = `host: ${host}\ndate: ${date}\nGET /v2/open-ise HTTP/1.1`;
                    var signatureSha = CryptoJS.HmacSHA256(signatureOrigin, this.APISecret);
                    var signature = CryptoJS.enc.Base64.stringify(signatureSha);
                    var authorizationOrigin =
                        `${apiKeyName}="${this.APIKey}", algorithm="${algorithm}", headers="${headers}", signature="${signature}"`;
                    var authorization = base64.encode(authorizationOrigin);
                    url = `${url}?authorization=${authorization}&date=${date}&host=${host}`;

                    // console.log(url)
                    resolve(url); // 主要是返回地址
                });
            },
3、实现第2不,构建websocket连接
data() {
            return {
                socketTask: {}, // 全局ws任务
                audioDataList: [], // 临时录音存储集合
                APPID: '',
                APISecret: '',
                APIKey: '',
                ent: 'cn_vip',
                category: 'read_sentence',
                TEXT: '\uFEFF' + '今天天气怎么样',
                wsLiveFlag: false,
                iseResult: '',
                iseFinalResult: '',
                speakMark: '开始评测录音',
                buttonGroup: [{
                    text: '开始评测录音',
                    backgroundColor: 'green',
                    color: '#fff'
                }, {
                    text: '停止评测录音',
                    backgroundColor: '#ffa200',
                    color: '#fff'
                }],
            };
        },

 -------------------------------------------------

async bulidSocketConnect() {
                let myUrl = await this.getWebSocketUrl();
                // myUrl = 'wss://wdfgdzx.top/ws_server/zs'
                // console.log(encodeURI(encodeURI(myUrl).replace(/\+/g, '%2B')))
                let realThis = this;
                this.socketTask = uni.connectSocket({
                    //url: encodeURI(encodeURI(myUrl).replace(/\+/g, '%2B')),
                    url: myUrl,
                    method: 'GET',
                    success: res => {
                        console.log(res, "ws成功连接...", myUrl)
                        realThis.wsLiveFlag = true;
                    }
                })
                realThis.socketTask.onError((res) => {
                    console.log("连接发生错误", res)
                })
                realThis.socketTask.onOpen((res) => {
                    console.info("wss的onOpen成功执行...", res)
                    // 第一帧..........................................
                    console.log('open成功...')
                    let params = {
                        common: {
                            app_id: realThis.APPID
                        },
                        business: {
                            category: realThis.category,
                            ent: realThis.ent, // 中文
                            rstcd: "utf8",
                            sub: 'ise',
                            tte: 'utf-8',
                            cmd: "ssb",
                            auf: 'audio/L16;rate=16000',
                            aue: 'raw',
                            text: realThis.TEXT,
                        },
                        data: {
                            status: 0,
                            data: "",
                            // data: uni.arrayBufferToBase64(audioData[0]),
                        },
                    };
                    console.log("发送第一帧...", params)
                    realThis.socketTask.send({ // 发送消息,,都用uni的官方版本
                        data: JSON.stringify(params),
                        success() {
                            console.log('第一帧发送成功')
                        }
                    });
                });

                // 接受到消息时
                realThis.socketTask.onMessage((res) => {
                    console.log('收到API返回的内容:', res.data);
                    realThis.iseResult = res.data;
                    let temp = JSON.parse(res.data)
                    // console.log(temp)
                    if (temp.code !== 0) {
                        console.log(`${temp.code}:${temp.message}`);
                        realThis.socketTask.close({
                            success(res) {
                                console.log('关闭成功', res)
                                realThis.wsLiveFlag = false;
                            },
                            fail(err) {
                                console.log('关闭失败', err)
                            }
                        })
                    }
                    if (temp.code === 0) {
                        if (res.data && temp.data.status === 2) {
                            const data = base64.decode(temp.data.data);
                            let decodeStr = utf8.decode(data);
                            console.log(temp)
                            console.log(decodeStr) // 打印完毕评测结果再关闭
                            realThis.iseFinalResult = decodeStr;
                            setTimeout(() => {
                                realThis.socketTask.close({
                                    success(res) {
                                        console.log('关闭成功', res)
                                    },
                                    fail(err) {
                                        console.log('关闭失败', err)
                                    }
                                })
                            }, 2000)
                        }
                    }
                })

            },
4、实现步骤3,不断的通过uniapp实时录音,发送音频给服务端API,点击结束录音发送最后一帧音频
buttonClick(e) { // 点击评测按钮
                if (e.content.text === "开始评测录音") {
                    this.speakMark = '正在评测,语音输入中...'
                    const realThis = this;
                    // 开始录音,初始化一些东西
                    const option = {
                        duration: 600000, // 录音的时长,单位 ms,最大值 600000(10 分钟)
                        sampleRate: 16000, // 采样率(pc不支持)
                        numberOfChannels: 1, // 录音通道数
                        // encodeBitRate: 48000, // 编码码率(默认就是48000)
                        frameSize: 1, // 指定帧大小,单位 KB。传入 frameSize 后,每录制指定帧大小的内容后,会回调录制的文件内容,不指定则不会回调。暂仅支持 mp3、pcm 格式。
                        format: "pcm", // 音频格式,默认是 aac
                    }
                    recorderManager.onStart(() => {
                        console.log("recorder start");
                    });
                    recorderManager.onFrameRecorded((res) => {
                        // frameBuffer    ArrayBuffer    录音分片结果数据。  isLastFrame    Boolean    当前帧是否正常录音结束前的最后一帧
                        const {
                            frameBuffer
                        } = res;
                        // console.log(frameBuffer) 这里把音频放到临时的集合中,方便保存为文件
                        if (frameBuffer) {
                            realThis.audioDataList.push(frameBuffer);
                            // 2、判断连接了,发送中间帧..........................................
                            if (realThis.wsLiveFlag) {
                                const params = {
                                    business: {
                                        cmd: "auw",
                                        aus: 2,
                                        aue: "raw"
                                    },
                                    data: {
                                        status: 1,
                                        encoding: "raw",
                                        data_type: 1,
                                        data: uni.arrayBufferToBase64(frameBuffer),
                                    },
                                };
                                console.log("发送中间帧", params, realThis.wsLiveFlag)
                                realThis.socketTask.send({
                                    data: JSON.stringify(params),
                                    success() {
                                        console.log('中间帧发送成功')
                                    },
                                    fail(res) {
                                        console.log('中间帧发送失败...', res)
                                    }
                                });
                            }
                        }
                    });
                    recorderManager.start(option); // 开始录音时,建立ws连接
                    this.bulidSocketConnect();
                    //setTimeout(this.bulidSocketConnect, 2000) //  main延迟2秒入口建立ws连接
                }
                if (e.content.text === "停止评测录音") {
                    this.speakMark = '开始评测录音'
                    // 3、发送最后一帧..........................................
                    const params = {
                        "business": {
                            "cmd": "auw",
                            "aus": 4,
                            "aue": "raw"
                        },
                        "data": {
                            "status": 2,
                            "encoding": "raw",
                            "data_type": 1,
                            "data": "",
                        }
                    };
                    this.socketTask.send({
                        data: JSON.stringify(params),
                        success(res) {
                            console.log('最后一帧发送成功...', res)
                        },
                        fail(res) {
                            console.log('最后一帧发送失败...', res)
                        }
                    });
                    console.log("发送最后一帧", params)
                    console.log('录音结束');
                    recorderManager.stop();
                }
            },

5、直接可运行的DMEO可以,加V 138-5601-1943联系

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android科大讯飞语音集成,非常详细的使用讲解

讯飞语音开发集成地址http://www.xfyun.cn/ 解压后的doc文件夹下的msc develop 文件中有详细集成步骤 AppId: 1.先要注册开发者账户, 添加我的应用 , 下载sdk 2.下载后将sdk解压, 把案例导入工程中运行看看效果 3.将libs下的两个jar包添加到libs目录下, 将同路径下的其它 …

Android 讯飞语音识别功能开发

以下代码主要参考博客: Android 科大讯飞语音识别 Android蓝牙串口开发部分请参照博客: Android蓝牙串口开发 讯飞语音官方开发文档: 语音听写 Android SDK 文档 文章目录 前言一、SDK的下载和导入1.SDK的下载2.新建工程3.配置项目a.导包b.权…

uniapp - 接入科大讯飞语音评测

欢迎关注微信公众号:FSA全栈行动 👋 一、简介 科大讯飞语音评测可以对字、词、句、篇章等题型进行多维度评分(准确度、流畅度、完整度、声韵调型等),支持中文和英文。最新的流式版使用 webSocket 调用接口&#xff0c…

目标检测算法——YOLOv5/YOLOv7改进之结合​PP-LCNet(轻量级CPU网络)

>>>深度学习Tricks&#xff0c;第一时间送达<<< 目录 ​PP-LCNet——轻量级且超强悍的CPU级骨干网络&#xff01;&#xff01; &#xff08;一&#xff09;前沿介绍 1.PP-LCNet主要模块 2.相关实验结果 &#xff08;二&#xff09;YOLOv5/YOLOv7改进之结…

从Blip2到Segment Anything视觉语义金字塔+ChatGPT= 把图片变文本段落, 8G显存即可Run...

关注公众号&#xff0c;发现CV技术之美 8G GPU显存即可以运行 Twitter链接&#xff1a;https://twitter.com/awinyimgprocess/status/1646225454599372800?s46&tHvOe9T2n35iFuCHP5aIHpQ 代码链接&#xff1a;https://github.com/showlab/Image2Paragraph https:// 01 …

目标检测算法——YOLOv5/YOLOv7改进之结合​ASPP(空洞空间卷积池化金字塔)

&#x1f496;&#x1f496;>>>加勒比海带&#xff0c;QQ2479200884<<<&#x1f496;&#x1f496; &#x1f340;&#x1f340;>>>【YOLO魔法搭配&论文投稿咨询】<<<&#x1f340;&#x1f340; ✨✨>>>学习交流 | 温澜潮…

从BLIP-2到SAM视觉语义金字塔+ChatGPT= 把图片变文本段落, 8G显存即可Run

点击下方卡片&#xff0c;关注“CVer”公众号 AI/CV重磅干货&#xff0c;第一时间送达 点击进入—>【图像分割】微信技术交流群 作者&#xff1a;老大 |&#xff08;已授权转载&#xff09;编辑&#xff1a;CVer https://zhuanlan.zhihu.com/p/621503837 8G GPU显存即可以运…

问一下ChatGPT:DIKW金字塔模型

经常看到这张DIKW金字塔模型图&#xff0c;还看到感觉有点过份解读的图&#xff0c;后面又加上了insight&#xff0c;impact等内容。 Data&#xff1a;是数据&#xff0c;零散的、无规则的呈现到人们眼前&#xff0c;如果你只看到这些数字&#xff0c;如果没有强大的知识背景&a…

QCon: 工程师成长的金字塔思维

QCon 线下会议终于来了&#xff0c;但这次的分享有一些意外&#xff0c;不是性能、架构、内核、缓存&#xff0c;而不是AI实践相关的内容&#xff0c;论坛的主题是“工程师成长实践”&#xff0c;而我的topic 是“工程师成长的金字塔思维”。本以为这是一个非热门话题&#xff…

拉普拉斯金字塔

原文 高斯金字塔G0层下采样后为G1&#xff0c;用G0减去G1的上采样&#xff0c;就得到了拉普拉斯层L0. 高斯金字塔G1层上采样后与拉普拉斯金字塔L0层相加后就得到了G0层。 import numpy as np import cv2 as cv from matplotlib import pyplot as pltimg cv.imread(left_01.png…

微信称不会推出「已读」功能;马斯克宣布成立 AI 公司 xAI;GPT-4 架构曝光,有 1.8 万亿参数|极客头条

「极客头条」—— 技术人员的新闻圈&#xff01; CSDN 的读者朋友们早上好哇&#xff0c;「极客头条」来啦&#xff0c;快来看今天都有哪些值得我们技术人关注的重要新闻吧。 整理 | 梦依丹 出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09; 一分钟速览新闻点&…

百度版本gactgpt即将来临,gpt人工智能机器横空出世

百度版本gactgpt即将来临&#xff0c;gpt人工智能机器横空出世&#xff0c;“一言”为定&#xff01;百度版ChatGPT确认&#xff01;李彦宏OKR曝光&#xff0c;率先应用于收索业务 gactCBT 大获&#xff0c;当下极有可能成为人工智能的 iPhone 时刻。为了在这场人工智能竞赛中…

解锁实盘交易,打通量化系统交易环节!股票量化分析工具QTYX-V2.3.9

前言 本期我们把股票量化分析工具QTYX的“交易”子页面给解锁了&#xff0c;这样一来&#xff0c;就打通了量化交易系统从分析到交易的完整过程&#xff0c;注意当前的QTYX版本升级到了2.3.9。 QTYX完整架构如下所示&#xff0c;其中包括了QTYX股票量化分析系统和实盘机器人两部…

自己做量化交易软件(43)小白量化实战16--利用小白量化金融模块在恒生PTrade交易系统(交易端)上仿大智慧指标回测及实战交易设计

自己做量化交易软件(43)小白量化实战16–利用小白量化金融模块在恒生PTrade交易系统(交易端)上仿大智慧指标回测及实战交易设计 量化产品PTrade(Personalise Trade)交易系统采用事件驱动式回测平台&#xff0c;与聚宽量化平台类似的量化框架&#xff0c;内置Ta-lib金融模块&am…

量化投资 | 量化交易平台工具汇总

量化投资必备手册&#xff0c;分享30个量化交易平台给你们&#xff0c;转需&#xff0c;不用谢&#xff01; 1. 掘金量化 量化交易系统官方网址&#xff1a;https://www.myquant.cn/ 2、国泰君安量化交易系统 量化交易系统网址&#xff1a;https://quant.gtja.com/ 3. 量化云…

初学Linux—解决开机卡在用户登录界面的问题

1.Linux关机之后开机界面卡在登录界面没有反应&#xff1b; 可能是我删除了某个文件… 2.解决办法&#xff1a; ctrlaltF2 ;切换终端 su root ;切换到超级用户 然后会弹出输入密码提示&#xff0c;直接输入超级用户的密码&#xff08;注意&#xff1a;linux中密码不会回显&am…

centos6.8开机一直卡在登录界面,无法登录

** **后面发现&#xff0c;问题出在&#xff0c;前几天配置的 java的jdk&#xff0c;还有mysql的环境变量上。 ** 解决问题的方法 使用CtrlAIt F3&#xff0c;竟然命令控制面板&#xff08;但是&#xff0c;进去后&#xff0c;你使用指令&#xff0c;比如&#xff0c;vi,ls -…

Ubuntu开机后卡在登陆界面进去不

系统&#xff1a;Ubuntu18.03 系统跑代码卡死了&#xff0c;导致鼠标键盘都用不了&#xff0c;直接强制关机后&#xff0c;卡在登陆界面进不去 步骤&#xff1a; 1. 系统启动后&#xff0c;在BIOS引导界面按"ESC"键进入选择菜单&#xff0c;选择第一个"*Ubun…

记一次绕过安全狗与360艰难提权

0x01 前言背景 端午短暂休息三天&#xff0c;复工之后朋友又丢给我一个Webshell&#xff0c;在打台球途中了解了一下这个奇怪的shell&#xff0c;说是无法执行命令&#xff0c;经过测试发现只能执行dir命令&#xff0c;确实奇怪&#xff0c;草草打了几局台球就回去拿起电脑开日…