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.hqwc.cn/news/14325.html

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

相关文章

使用promise函数封装post请求,封装aes加解密方法,并进行请求头aes加密,封装sm2国密加解密,进行请求体数据加密,响应数据解密。

export default {async post(url, params { header:{}, data:{} }, showLoading true){if(showLoading){uni.showLoading({title:"加载中",mask:true})}let options{header:{...params.header},url:globalParams.basepathurl.url,data:{...params.data}}//渠道 ae…

拆特-机披涕的经典用法

背景 当今的ChatGPT是一款卓越的语言模型,能够助您打造出卓越的产品,并提升业务成功率。利用广泛的自然语言处理和机器学习算法,ChatGPT能够进行流畅自然的对话,理解自然语言问题并给出回答。借助ChatGPT,您可以构建智…

电子电气架构相关安全体系介绍

摘要: 随着电子电气架构技术的不断升级,整车越来越多的系统和组件对功能安全产生影响,为此,功能安全也从部分关键系统开发,向整车各系统全面开发拓展。同时,由于域集中式、中央集中式等新架构形态的出现&a…

Elasticsearch【全文检索、倒排索引、应用场景、对比Solr、数据结构】(一)-全面详解(学习总结---从入门到深化)

目录 Elasticsearch介绍_全文检索 Elasticsearch介绍_倒排索引 Elasticsearch介绍_Elasticsearch的出现 Elasticsearch介绍_Elasticsearch应用场景 Elasticsearch介绍_Elasticsearch对比Solr Elasticsearch介绍_Elasticsearch数据结构 Elasticsearch介绍_全文检索 Elasti…

unity物理系统

物理引擎即描述真实世界中物理现象的算法,如刚体物理,软体物理和流体物理,unity本身支持的主要为刚体物理,我们也可以自己编写一些其它的模拟效果。 unity内置Nvidia开发的Physx引擎(3D)和一个开源引擎Box…

【转换】编码转换工具笔记

应用场景 应用场景是程序整合第三方库多平台运行,第三方库window平台编译,代码移植到linux出现bom问题 思考解决 windows使用utf-8编码,linux使用utf-8无bom编码 工具主要针对utf-8编码文件,能够批量添加删除BOM,无…

vector [] 赋值出现的报错问题

下面这段代码的作用是创建了一个整数类型的vector&#xff08;std::vector<int>&#xff09;并对其进行操作。以下是代码的详细说明&#xff1a; 使用reserve(10)方法为向量分配至少10个元素的存储空间。reserve() 预留了额外的存储空间&#xff0c;以避免后续添加元素时…

Ubuntu: scp命令使用及Permission denied错误解决方案

scp命令介绍 scp 命令用于 Linux 之间复制文件和目录。scp 是 secure copy 的缩写, scp 是 Ubuntu 系统下基于 ssh 登陆进行安全的远程文件拷贝命令。 scp local_file remote_usernameremote_ip:remote_folder scp /Users/X.pem root192.168.1.247:/usr/local/ssl Permission…

『DotNetBrowser』.Net的浏览器嵌入组件,该选择DotNetBrowser 还是 CefSharp?

&#x1f4e3;读完这篇文章里你能收获到 全方位对比DotNetBrowser 和 CefSharp的优缺点 文章目录 一、引言二、引擎三、架构1. CefSharp架构2. DotNetBrowser架构 四、对比1. 稳定性和内存使用2. 应用程序域3. AnyCPU4. H.264, AAC5. 安全6. Visual Studio设计器7. 嵌入应用程…

Ubuntu 22.04.2 LTS 安装搜狗输入法后,修改区域格式Regional Format crash 崩溃 ,改用bash 指令修改

故障 系统已经升级到最新 基于Ubuntu 20.04 LTS apt upgrade升级而来。 yeqiangyeqiang-MS-7B23:~$ cat /etc/os-release PRETTY_NAME"Ubuntu 22.04.2 LTS" NAME"Ubuntu" VERSION_ID"22.04" VERSION"22.04.2 LTS (Jammy Jellyfish)"…

JavaWeb 笔记——5

JavaWeb 笔记——5 一、Filter1.1、概述1.2、Filter快速入门1.3、Filter执行流程1.4、Filter使用细节1.5、Filter-案例-登陆验证 二、Listener2.1、Listener概述与分类2.2、ServletContextListener使用 三、AJAX3.1、AJAX概述3.2、AJAX快速入门3.3、使用Ajax验证用户名是否存在…

DAY36:贪心算法(三)最大子数组和+买卖股票最佳时机

文章目录 53.最大子数组和枚举思路暴力解法贪心思路完整版时间复杂度 122.买卖股票的最佳时机Ⅱ&#xff08;解法比较巧妙&#xff09;思路完整版总结 53.最大子数组和 给你一个整数数组 nums &#xff0c;请你找出一个具有最大和的连续子数组&#xff08;子数组最少包含一个元…