UNIAPP调用讯飞语音评测API

news2024/11/18 15:42:21

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.coloradmin.cn/o/733912.html

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

相关文章

redis操作问题

使用redisTemplate 往set集合中批量添加值 # 第一种办法就是for循环&#xff0c;每次进行setfor (int i 0; i < 1000000; i) {redisTemplate.opsForSet().add("key",i);} # 第二中办法就是使用HashSet批量添加数据Set set new HashSet<>();for (int i 1…

mybatisplus生成代码

导包&#xff1a; <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-freemarker</artifactId></dependency><dependency><groupId>com.baomidou</groupId><artifactId>m…

CorelDRAW2023免费版平面设计矢量绘图工具

最初CorelDRAW 被开发运行于Windows版&#xff0c;数年后Macintosh版也随之发布。同时&#xff0c;CorelDRAW曾经存在过Linux的版本&#xff0c;但后来被放弃了。CorelDRAW简称cdr&#xff0c;是一款功能强大的矢量图制作软件&#xff0c;一说到矢量图制作&#xff0c;大家都会…

Go实现socks5服务器

SOCKS5 是一个代理协议&#xff0c;它在使用TCP/IP协议通讯的前端机器和服务器机器之间扮演一个中介角色&#xff0c;使得内部网中的前端机器变得能够访问Internet网中的服务器&#xff0c;或者使通讯更加安全。SOCKS5 服务器通过将前端发来的请求转发给真正的目标服务器&#…

应用层:万维网WWW

1.万维网WWW 笔记来源&#xff1a; 湖科大教书匠&#xff1a;应用层概述 湖科大教书匠&#xff1a;万维网WWW 声明&#xff1a;该学习笔记来自湖科大教书匠&#xff0c;笔记仅做学习参考 浏览器最重要的部分是渲染引擎&#xff0c;也就是浏览器内核。负责对网页内容进行解析和…

【触类旁通】编写代码和写小说的相似性

【触类旁通】编写代码和写小说的相似性 1&#xff0c;序2&#xff0c;对比分析2.1 相同点2.1.1 三要素2.1.2 读者-用户&#xff08;受众&#xff09;2.1.3 目录——功能模块2.1.4 故事情节——框架2.1.5 文笔——编程风格2.1.6 多部作品——多个阶段2.1.7 修辞——设计模式2.1.…

Mycat【Mycat分片规则(取模、分片枚举、范围约定)】(六)-全面详解(学习总结---从入门到深化)

目录 Mycat分片规则_取模 Mycat分片规则_分片枚举 Mycat分片规则_范围约定 Mycat分片规则_取模 实现方式 取模分片就是根据数据表的某一个字段&#xff0c;通常是某一个整数型的字 段&#xff0c;对其进行十进制的求模运算&#xff0c;将运算结果作为Mycat的路由结果。 注…

Element-案例-脚本页面布局

案例需求&#xff1a; 根据页面原型完成员工管理页面开发&#xff0c;并通过Axios完成数据异步加载 步骤 创建页面&#xff0c;完成页面的总体布局规划布局中各个组件的实现列表数据的异步加载&#xff0c;并渲染展示 1.创建页面&#xff0c;完成页面的总体布局规划 分析案…

代码随想录算法训练营第十三天 | 二叉树系列4

二叉树系列4 617 合并二叉树重点代码随想录的代码我的代码(晚上理解后自己编写) 700 二叉搜索树中的搜索未看解答自己编写看了解答后&#xff0c;精简了两个判断的写法重点代码随想录的代码我的代码(晚上理解后自己编写) 98 验证二叉搜索树重点看到二叉搜索树&#xff0c;就要想…

rust 自动化测试、迭代器与闭包、智能指针、无畏并发

编写测试可以让我们的代码在后续迭代过程中不出现功能性缺陷问题&#xff1b;理解迭代器、闭包的函数式编程特性&#xff1b;Box<T>智能指针在堆上存储数据&#xff0c;Rc<T>智能指针开启多所有权模式等&#xff1b;理解并发&#xff0c;如何安全的使用线程&#x…

静态路由实验

目录 第一步&#xff1a; 第二步&#xff1a; 端口IP配置方法 环回接口IP配置方法 第三步&#xff1a; 第四步&#xff1a; 第一步&#xff1a; 先进行子网划分 192.168.1.0 24 子网划分 需要13个广播域 5个网段——子网划分 192.168.1.0 24 192.168.1.000 00000 27 192.…

数据结构一:绪论

一、绪论 数据结构是计算机科学中的一门基础课程&#xff0c;研究数据的存储、组织和管理方法&#xff0c;以及在这些数据上进行各种操作的算法和技术。掌握数据结构和算法是编程中非常重要的基础&#xff0c;对于实现高效、可靠的程序至关重要。常见的数据结构包括数组、链表、…

雅思口语考试时长多少分钟?

雅思口语考试是单独考的&#xff0c;对于第一次考雅思的同学来说&#xff0c;了解雅思考试的时长才能更好的备考雅思&#xff0c;那么雅思口语考试时长多久呢&#xff1f; 一、雅思口语考试时长 雅思口语考试时长一般为11-14分钟 第一段约4-5分钟&#xff0c;会面问候一番&am…

java项目之高校信息资源共享平台(ssm+mysql+jsp)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于ssm的高校信息资源共享平台。技术交流和部署相关看文末&#xff01; 开发环境&#xff1a; 后端&#xff1a; 开发语言&#xff1a;Java 框架&…

DynaSLAM 2018论文翻译

Dynaslam:动态场景下的跟踪、建图和图像修复 摘要-场景刚性假设是SLAM算法的典型特征。这种强假设限制了大多数视觉SLAM系统在人口稠密的现实环境中的使用&#xff0c;而这些环境是服务机器人或自动驾驶汽车等几个相关应用的目标。 在本文中&#xff0c;我们提出了一个基于ORB…

学习react,复制了一个C站Civitai

苦肝两个多月&#xff0c;终于复制了一个C站&#xff0c;也就是现在最热门的AI绘画社区Civitai。 来看看效果图吧&#xff01; 技术栈介绍 我还是一个菜鸡&#xff0c;所以不像c站那样用了各种技术。 目前只是为了展示数据&#xff0c;我的Civitai简单技术栈如下 前端&…

Java17:IO流

一&#xff1a;File类&#xff1a; 1.File类的理解&#xff1a; 1.File类的一个对象&#xff0c;代表一个文件或一个文件目录&#xff08;俗称&#xff1a;文件夹&#xff09; 2.File类声明在java.io包下 3.File类中涉及到关于文件或文件目录的创建,删除&#xff0c;重命名…

仙境传说RO:添加自定义道具

仙境传说RO&#xff1a;添加自定义道具 大家好&#xff0c;我是艾西今天和大家聊一下仙境传说RO怎么添加自定义道具。在我们开服时加入一些道具模组等往往会让我们的服务器更有特色以及消费点&#xff0c;那么让我们直接进入正题开始操作&#xff1a;&#xff08;此处我们讲的…

k8s集群安装Istio过程记录及问题总结

目录 一、介绍二、部署Helm三、部署Istio部署官方示例 Bookinfo 四、部署KaliBug 记录部署Bookinfo demo失败 一、介绍 这篇文章记录一下k8s集群安装Helm、Istio 和 Kiali&#xff0c;方便学习相关概念。 前提需要k8s集群&#xff1a; 可参考&#xff1a;Arm64架构(MacBookPr…

cmake流程控制--循环

目录 for循环 普通方式 demo cmake3.17中添加了一种特殊的形式,可以在一次循环多个列表,其形式如下: demo 类似python语言的for循环 demo while循环 demo cmake跳出循环(break)和继续下次循环(continue) demo block()和endblock()命令定义的块内也是允许break()和c…