已解决:安卓,怎么优雅接入科大讯飞语音评测功能?

news2024/9/29 17:22:14

写在前面:

网上关于讯飞接入的博客都很少,按说讯飞都是业界翘楚,不知为何,很少搜索到精品,一搜就是一个要求开会员的博客,我也是醉了。讯飞提供的文档也是不清晰,我是摸着石头过河,过来了,我就给大家总结一个方法,给大家免费看,只要是我的粉丝,我永远给大家免费的阅读支持。

之前接入过web端的语音评测,那叫个麻烦建议大家不要轻易尝试,如果大家有必要的需求,可以尝试,但是建议不要玩,容易入坑。文章结尾有对各平台使用讯飞的一些看法和建议,需要的可以到文章末尾去看。

正文开始:

首先,我们从官网上下载demo,此时如果你还没有注册讯飞账号,那你先去注册一个开发者账号,不得不说,作为大公司,讯飞还是有些气量的,每天给账号500个免费的评测额度,(数量不知道我理解的是否正确,至少我已经免费用了一年了),然后创建自己的应用,如下图创建好以后就有了appid,这些不细说了,讯飞的文档主要就是介绍这些了,至于技术上的事儿基本没咋提
在这里插入图片描述
然后我们开始打包下载讯飞的sdk,我们点击上图的应用名称,然后进入到如下页面,点击下载sdk,这里的sdk会把我们生成的应用秘钥打包进去,我们只需要在app中配置一个appid就可以了。
在这里插入图片描述
然后我们点亮我们需要的功能,点击下载就可以,我选择了语音合成和语音测评功能,如下图,不建议选择新版,就用普通版本就可以,功能接口都一样,新版盲猜有坑:
在这里插入图片描述
下载完以后,打开文件夹,会看到一堆文件夹,我们需要的就是libs,其他的不需要,也不需要运行他说的sample,因为运行这个项目可能会很耗费时间,没必要。但是我们还是可以使用AS打开这个sample项目,以便于我们查找一些功能的使用方法,当然这是我的操作,你们也可以只看我的教程,不过我的教程只讲评测的功能,其实有了评测的经验,再做别的也手到擒来。
在这里插入图片描述
首先我们新建一个安卓项目,添加阿里云的镜像依赖,然后重新下载依赖,然后我们把上图的libs中的所有内容拷贝至Android工程的libs目录下。如下图所示:
在这里插入图片描述
在这里插入图片描述
然后,我们鼠标右键Msc.jar文件,选择一个Add As Library,将jar包添加到库里,我已经添加过了,弹不出来这个选项所以不截图了。
同时,我们在main包下创建如下图所示的文件夹,并且将上述sdk中的文件复制过来,如下图:
在这里插入图片描述
然后我们开始开发:
打开清单文件,然后添加文档中提到的安卓权限:

<!--连接网络权限,用于执行云端语音能力 -->
<uses-permission android:name="android.permission.INTERNET"/>
<!--获取手机录音机使用权限,听写、识别、语义理解需要用到此权限 -->
<uses-permission android:name="android.permission.RECORD_AUDIO"/>
<!--读取网络信息状态 -->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<!--获取当前wifi状态 -->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<!--允许程序改变网络连接状态 -->
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/>
<!--读取手机信息权限 -->
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<!--读取联系人权限,上传联系人需要用到此权限 -->
<uses-permission android:name="android.permission.READ_CONTACTS"/>
<!--外存储写权限,构建语法需要用到此权限 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<!--外存储读权限,构建语法需要用到此权限 -->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<!--配置权限,用来记录应用配置信息 -->
<uses-permission android:name="android.permission.WRITE_SETTINGS"/>
<!--手机定位信息,用来为语义等功能提供定位,提供更精准的服务-->
<!--定位信息是敏感信息,可通过Setting.setLocationEnable(false)关闭定位请求 -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<!--如需使用人脸识别,还要添加:摄相头权限,拍照需要用到 -->
<uses-permission android:name="android.permission.CAMERA" />

然后,需要混淆的话,添加一下这个,不添加会将讯飞sdk同步混淆导致闪退,如果不配置混淆就可以忽略。

-keep class com.iflytek.**{*;}
-keepattributes Signature

然后进行初始化:将如下代码行添加到应用的自定义Application或者调用评测的Activity的oncreate方法中,context用this就行:

// 将“12345678”替换成您申请的APPID,申请地址:http://www.xfyun.cn
// 请勿在“=”与appid之间添加任何空字符或者转义符
SpeechUtility.createUtility(context, SpeechConstant.APPID +"=12345678");

然后就开始调用关键方法:
我把封装的类贴出来吧,可以拿来即用,我是通过h5调用的,使用activity也是可以直接调用的:

package com.lz.english.activity.webview

import android.Manifest
import android.content.pm.PackageManager
import android.os.Bundle
import android.util.Log
import android.webkit.JavascriptInterface
import androidx.core.app.ActivityCompat
import androidx.core.content.ContextCompat
import com.google.gson.Gson
import com.iflytek.cloud.EvaluatorListener
import com.iflytek.cloud.EvaluatorResult
import com.iflytek.cloud.SpeechConstant
import com.iflytek.cloud.SpeechError
import com.iflytek.cloud.SpeechEvaluator
import com.lz.english.activity.WebViewActivity
import com.lz.english.databinding.ActivityWebviewBinding
import com.lz.english.result.xml.XmlResultParser
import com.lz.english.utils.ToastUtils
import org.greenrobot.eventbus.EventBus

private const val s1 = "ise_unite"

private const val s = "ise_unite"

class JsBridge(
    context: WebViewActivity,
    binding: ActivityWebviewBinding,
    mIse: SpeechEvaluator
) {
    private val TAG = "JsBride"
    // 创建语音评测对象,使用lateinit关键字标记为非空
//    private lateinit var mIse:SpeechEvaluator ;
    companion object {
        private const val REQUEST_RECORD_AUDIO_PERMISSION = 1
    }
    private lateinit var context: WebViewActivity
    private lateinit var binding: ActivityWebviewBinding
    private lateinit var mIse: SpeechEvaluator
    init {
        this.context = context
        this.binding = binding
        this.mIse = mIse
        setParams()
    }
    // 评测监听接口
    private val mEvaluatorListener: EvaluatorListener = object : EvaluatorListener {
        override fun onResult(result: EvaluatorResult, isLast: Boolean) {
            Log.d(TAG, "evaluator result :$isLast")
            if (isLast) {
                val builder = StringBuilder()
                builder.append(result.resultString)
                Log.d(TAG, "evaluator result :${builder.toString()}")
                mLastResult = builder.toString()
                val resultParser = XmlResultParser()
                val result = resultParser.parse(mLastResult)
                val gsonStr = Gson().toJson(result)
                Log.e(TAG,gsonStr)
                if (null != result) {
                    binding.webView.loadUrl("javascript:recordFinishCallback('${gsonStr}')")
                } else {
                    ToastUtils.showToast("语音解析失败")
                }
            }
        }

        override fun onError(error: SpeechError) {
            Log.d(TAG, "evaluator over")
        }

        override fun onBeginOfSpeech() {
            // 此回调表示:sdk内部录音机已经准备好了,用户可以开始语音输入
            Log.d(TAG, "evaluator begin")
            binding.webView.loadUrl("javascript:androidStartRecord()")
        }

        override fun onEndOfSpeech() {
            // 此回调表示:检测到了语音的尾端点,已经进入识别过程,不再接受语音输入
            Log.d("WebView", "evaluator stoped")
        }

        override fun onVolumeChanged(volume: Int, data: ByteArray) {
            Log.d("WebView","当前音量:$volume")
            Log.d(TAG, "返回音频数据:" + data.size)
        }

        override fun onEvent(eventType: Int, arg1: Int, arg2: Int, obj: Bundle) {
            // 以下代码用于获取与云端的会话id,当业务出错时将会话id提供给技术支持人员,可用于查询会话日志,定位出错原因
            //	if (SpeechEvent.EVENT_SESSION_ID == eventType) {
            //		String sid = obj.getString(SpeechEvent.KEY_EVENT_SESSION_ID);
            //		Log.d(TAG, "session id =" + sid);
            //	}
        }
    }

    @JavascriptInterface
    fun goBack() {
        EventBus.getDefault().post("view_goBack")
    }

    // 启动录音
    @JavascriptInterface
    fun startRecord(content:String,timeout:String,vad_bos:String,vad_eos:String) {
        Log.e(TAG,"timeout::$timeout")
        Log.e(TAG,"vad_bos::$vad_bos")
        Log.e(TAG,"vad_eos::$vad_eos")
        if (ContextCompat.checkSelfPermission(this.context, Manifest.permission.RECORD_AUDIO)
            != PackageManager.PERMISSION_GRANTED
        ) {
            // 如果没有录音权限,请求权限
            ActivityCompat.requestPermissions(
                this.context,
                arrayOf(Manifest.permission.RECORD_AUDIO),
                REQUEST_RECORD_AUDIO_PERMISSION
            )
        } else {
            // 已经有录音权限,执行录音操作
            mIse?.setParameter(SpeechConstant.KEY_SPEECH_TIMEOUT, timeout)
            mIse?.setParameter(SpeechConstant.VAD_BOS, vad_bos)// 设置语音前端点:静音超时时间,即用户多长时间不说话则当做超时处理
            mIse?.setParameter(SpeechConstant.VAD_EOS, vad_eos)// 设置语音后端点:后端点静音检测时间,即用户停止说话多长时间内即认为不再输入, 自动停止录音
            val int = mIse?.startEvaluating(content, null, mEvaluatorListener)
            if (mIse == null){
                Log.e(TAG,"mIse is null")
            }
            Log.e(TAG,"startRecord")
            Log.e(TAG,"ErrorCode:$int")
        }

    }

    // 停止录音
    @JavascriptInterface
    fun stopRecord() {
        Log.e(TAG,"stoping...")
        mIse.stopEvaluating()
    }

    // 评测语种
    private var language: String? = null
    // 评测题型
    private var category: String? = null
    // 结果等级
    private var result_level: String? = null
    private var mLastResult: String? = null
    private fun setParams() {
//        mIse = SpeechEvaluator.createEvaluator(context, null);
        // 设置评测语言
        language = "en_us"
        // 设置需要评测的类型
        category = "read_sentence"
        // 设置结果等级(中文仅支持complete)
        result_level = "complete"
        // 设置语音前端点:静音超时时间,即用户多长时间不说话则当做超时处理
        val vad_bos = "5000"
        // 设置语音后端点:后端点静音检测时间,即用户停止说话多长时间内即认为不再输入, 自动停止录音
        val vad_eos = "1800"
        // 语音输入超时时间,即用户最多可以连续说多长时间;
        val speech_timeout = "5000"

        // 设置流式版本所需参数 : ent sub plev
        if ("zh_cn" == language) {
            mIse?.setParameter("ent", "cn_vip")
        }
        if ("en_us" == language) {
            mIse?.setParameter("ent", "en_vip")
        }
        mIse?.setParameter(SpeechConstant.SUBJECT, "ise")
        mIse?.setParameter("plev", "0")

        // 设置评分百分制 使用 ise_unite  rst  extra_ability 参数, 其中ise_unite==0是5分制,==1是百分制
        mIse?.setParameter("ise_unite", "1")
        mIse?.setParameter("rst", "entirety")
        mIse?.setParameter("extra_ability", "syll_phone_err_msg;pitch;multi_dimension")
        mIse?.setParameter(SpeechConstant.LANGUAGE, language)
        mIse?.setParameter(SpeechConstant.ISE_CATEGORY, category)
        mIse?.setParameter(SpeechConstant.TEXT_ENCODING, "utf-8")
//        mIse?.setParameter(SpeechConstant.VAD_BOS, vad_bos)
//        mIse?.setParameter(SpeechConstant.VAD_EOS, vad_eos)
//        mIse?.setParameter(SpeechConstant.KEY_SPEECH_TIMEOUT, speech_timeout)
        mIse?.setParameter(SpeechConstant.RESULT_LEVEL, result_level)
        mIse?.setParameter(SpeechConstant.AUDIO_FORMAT_AUE, "opus")
        // 设置音频保存路径,保存音频格式支持pcm、wav,
        mIse?.setParameter(SpeechConstant.AUDIO_FORMAT, "wav")
        mIse?.setParameter(
            SpeechConstant.ISE_AUDIO_PATH,
            context.getExternalFilesDir("msc")?.absolutePath + "/ise.wav"
        )
        //通过writeaudio方式直接写入音频时才需要此设置
        //mIse?.setParameter(SpeechConstant.AUDIO_SOURCE,"-1");
    }
}

我来解释一下上面的工具类里的内容,可以看到方法上有一个注解@JavascriptInterface,这个注解是表示是给h5的js代码调用的,如果不涉及和前端js交互的话,这个注解可以删。其中评测最关键的方法,就是setParams方法,这个方法配置了一些打分参数等,注释已经很详细了,然后就是startRecord方法,这个方法就是开始录音的方法,这个方法还动态传入了几个参数,这几个参数是用来配置几个时长的,其中

timeout:String是用来设置最长录制几秒就自动停止录制并开始打分,
vad_bos:String是表示用户多长时间不说话则当做超时处理,
vad_eos:String是表示用户停止说话多长时间内即认为不再输入, 自动停止录音

还有一些配置在setParams方法中的参数,特别说一个分制的参数,有满分百分制和5分制,其中ise_unite==0是5分制,==1是百分制:

        // 设置评分百分制 使用 ise_unite  rst  extra_ability 参数, 其中ise_unite==0是5分制,==1是百分制
        mIse?.setParameter("ise_unite", "1")

然后就是关键的结果处理监听回调mEvaluatorListener了,这个是一个监听对象,这个对象复写了回调方法,来处理讯飞返回的结果,这里用到了一个类库,XmlResultParser,这个类库我们需要从讯飞的sdk中的sample中去copy过来,如图,我们把result文件夹完整复制
在这里插入图片描述
然后粘贴到自己项目包下的位置,如图,此时我们需要把这里面所有文件中引用的错误的包名路径修改成我们自己的正确的包名,然后再去工具类中引用XmlResultParser工具,这个工具,顾名思义,就是讯飞的程序员手撸了一个xml解析工具
在这里插入图片描述
sample自带的这个XmlResultParser工具,里面的实体类的数据不是很全,比如有一些流畅分,准确度分这些都没有,我们可以手动加一下,如图,打开result文件,我加了三个分值数据,在这里加的属性,必须得是人家返回结果包含的,不能随便加:
在这里插入图片描述
result这里加了以后,还需要在这里加一下解析:
在这里插入图片描述
然后怎么调用这个工具类呢?很简单,先在activity中创建一个mIse全局对象,在oncreate中赋值,我这里只写了赋值,声明的代码你自己写吧,然后传入这个对象,至于我用的这个工具对象jsBridge,你完全可以不按照我这个来,你可以直接吧工具类定义成object类型,怎么调用都可以。我是将上下文this传了过去,以防有ui操作,我还将binding传了进去,你们不需要可以不传,然后把mIse评测对象传了进去。

mIse = SpeechEvaluator.createEvaluator(this, null)
jsBridge = JsBridge(this, binding,mIse!!)

如果你觉得麻烦,甚至可以直接将工具类的那部分关键代码复制到你的activity里,省的麻烦,我之所以分离,是因为我的activity里逻辑太多了,看着有些头大。

然后附上我的运行图:
在这里插入图片描述

到此,就算大功告成了,写博客太累了,为了帮助大家理解,我仔细梳理了流程,花了有三个小时吧,要是我个人做记录,可能复制几个代码就够了,所以如果帮到阁下,还望给个关注,虽然关注也不挣钱,但是看到有人跟我有互动,我就知道这个世界,不止我一个人。

写在最后:

以下说一些个人观点,不想看或者不认同的就可以离开了:

关于科大讯飞:讯飞给了每天500的免费评测数量,这个气量,就比某些公司要强很多了,再加上讯飞的技术确实很好,所以基本在同行业市场上没有对手,比如云知声(个人免费半年,企业免费一年,有安卓sdk但是文档说明比葛优的头发还要稀疏),还有一些小众的比如有个叫什么驰声的这种完全没有免费额度的(而且sdk还是你在他们官网留下电话然后他们的销售给你打电话联系你,然后加你微信跟你拉个群让技术给申请一个appkey来使用),当然,讯飞的翻译功能也强于专业做翻译的同行不少,比如有道,有道的翻译比较死板,讯飞没有专攻翻译领域,否则应该就没有有道翻译的市场了。用过讯飞输入法的应该都知道,讯飞输入法自带语音转文字,甚至可以你直接说中文,他转英文文字,而且是多年前就很准确了,甚至他还能识别方言,其实要说国内的AI大模型,我唯一比较期待的就是讯飞的大模型了,关于文心一言和千义通问,我是不怎么看好的,因为这两为了竞争市场匆忙上线,上下文关联性以及对于中文理解能力跟ChatGPT比起来差得不是一点半点,甚至听说文心一言还推出了付费版本,这一点就挺搞笑的,有点搞不清楚自己的斤两,也有可圈可点的地方,那就是免费版支持图片生成,虽然生成的图不尽如人意吧,但是也算一个得分项。

关于浏览器端:因为浏览器对于录音功能的限制,也就只能局限于PC端用一用了,移动端用h5来访问录音功能,体验很不好。要开发移动端使用的,建议还是开发一个app,如果实在想做网页,也可以使用原生壳子加webview嵌套h5来实现讯飞语音的功能,这样可以使用原生的录音功能和讯飞sdk,这样实现起来用户使用很舒服,开发也很舒服。

关于uniapp:还有就是uniapp的客户端版不要接入科大讯飞的所有内容,这是因为科大讯飞已经封禁了新客户的http的请求方式,只能通过websocket的方式进行流式数据传输,而uniapp的录音分片功能不支持app端,只支持部分小程序,而uniapp的h5端就更不考虑了,uni开发是挺舒服的,但是遇到问题了,就知道uniapp还不如原生vue项目好做。其实如果非小程序需求,不建议使用uniapp做开发,除非是特别简单的页面需求,否则涉及一点点特殊定制的硬件功能,可能就歇菜了,举个简单例子,uniapp不支持使用formdata进行数据传输,而他提供了一个叫upload的方法,说是能代替进行formdata 传输,但是格式不能自定义,相当于白搞,再就是从uniapp的文档上就可以看到各种的不支持,有的功能不支持app端,有的不支持h5端,有的不支持小程序端,有的干脆只支持h5,有的只支持微信小程序,有的只支持抖音小程序,
说句唱衰的话,就uni这样的开发平台,你说该咋用,说他是跨平台解决方案弃之可惜吧,但是用着又如此食之无味,这大概也就是他这么多年没火起来的原因吧,给你们截个图你们就大概明白了,这个截图只是冰山一角,
在这里插入图片描述
所以想搞跨平台方案的,建议还是考虑清楚,毕竟貌似uni的团队并不打算维护这个uniapp了,那些社区里陈年的bug,貌似也打算让他继续陈年了,千万别相信uni市场上那些收费的插件,可能各平台版本更新一次插件就歇菜了,听说最近uni出了一个appx,貌似很吊的样子,说是性能和原生一样,众所周知,uniapp是一个webview的性能,性能很差,要是这个appx能做好,确实会很有市场,那将是要超越flutter的存在了,毕竟uni还能兼容小程序,但是要我相信dcloud团队能做好他,诸葛亮来当说客,我也得犹豫一下要不要信,我预估这个appx能用的周期应该是10年左右,但是技术更新换代这么快,10年也许写代码都不用太多的人力了,所以本人暂时先不考虑用了。

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

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

相关文章

MySQL JSON数据类型全解析(JSON datatype and functions)

JSON&#xff08;JavaScript Object Notation&#xff09;是一种常见的信息交换格式&#xff0c;其简单易读且非常适合程序处理。MySQL从5.7版本开始支持JSON数据类型&#xff0c;本文对MySQL中JSON数据类型的使用进行一个总结。 目录 一、MySQL中的JSON 1.1 JSON数据格式 1.2 …

最长公共子串的问题(正常方法和矩阵法,动态规划)

题目&#xff1a; 给定两个字符串 text1 和 text2&#xff0c;返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 &#xff0c;返回 0 。 一个字符串的 子序列 是指这样一个新的字符串&#xff1a;它是由原字符串在不改变字符的相对顺序的情况下删除某些字符…

Windows Qt C++ VTK 绘制三维曲线

Qt 自带数据可视化从文档上看&#xff0c;只能实现三维曲面。 QwtPlot3D在Qt6.6.0上没编译通过。 QCustomPlot 只能搞二维。 VTK~搞起。抄官网demo。 后续需求&#xff1a; 1、对数轴 2、Y轴逆序 3、Z轴值给色带&#xff0c;类似等高线图的色带 期待各位大佬多多指导。…

如何快速搭建实用的爬虫管理平台

目录 一、前言 二、选择合适的爬虫框架 三、搭建数据库 步骤1 步骤2 步骤3 四、搭建Web服务器 步骤1 步骤2 步骤3 步骤4 五、管理爬虫 六、总结 一、前言 爬虫是互联网数据采集的关键工具&#xff0c;但是随着数据量的增加和需求的多样化&#xff0c;手动运行和管…

超越传统,想修哪里就修哪里,SUPIR如何通过文本提示实现智能图像修复

项目简介 通过参数增加使得模型不仅能够修复图像中的错误或损坏&#xff0c;还能根据文本提示进行智能修复。例如根据描述来改变图像中的特定细节。这样的处理方式提升了图像修复的质量和智能度&#xff0c;使得模型能够更准确、更灵活地恢复和改进图像。 SUPIR的主要功能图像…

详解矩阵的LDU分解

目录 一. 矩阵分解 二. 解方程 三. 例题说明 四. 矩阵的LDU分解 五. 矩阵三角分解的唯一性 一. 矩阵分解 其实我们可以把一个线性系统&#xff08;Linear System&#xff09;看成两个三角系统&#xff08;Triangular Systems&#xff09;&#xff0c;本文章将解释为什么可…

QT实现USB摄像头接入显示

一、UVC协议简介 UVC全称是USB Video Class&#xff08;USB视频类&#xff09;&#xff0c;是一种标准化的USB视频设备通信协议&#xff0c;它定义了摄像头与主机之间的数据传输协议和格式。 UVC协议的出现&#xff0c;解决了摄像头厂商之间互不兼容&#xff0c;以及摄像头应…

2.Linux的例行性工 作(计划任务)

目录 1. 场景&#xff1a; 2. 单一执行的例行性任务--at&#xff08;一次性&#xff09; 2.1. 安装 2.2. at命令详解 2.2.1. 格式 2.2.2. 参数 2.2.3. 时间格式 2.2.4. 实验1 2.2.5. 实验2 2.2.6. 注意 2.2.7. at命令执行过程分析 2.2.8. 实验3 3. 循环执行的例行…

Elasticsearch:聊天机器人、人工智能和人力资源:电信公司和企业组织的成功组合

作者&#xff1a;来自 Elastic Jrgen Obermann, Piotr Kobziakowski 让我们来谈谈大型企业人力资源领域中一些很酷且改变游戏规则的东西&#xff1a;生成式 AI 和 Elastic Stack 的绝佳组合。 现在&#xff0c;想象一下大型电信公司的典型人力资源部门 — 他们正在处理一百万件…

mac/macos上编译electron源码

官方教程&#xff1a;Build Instructions | Electron 准备工作这里不写了&#xff0c;参考官方文档&#xff0c;还有上一篇windows编译electron electron源码下载及编译-CSDN博客 差不多步骤&#xff0c;直接来 网络记得使用魔法 下载编译步骤 0. 选择目录很重要&#xff0…

Emergent Abilities of Large Language Models 机翻mark

摘要 证明通过扩大语言模型可以可靠地提高性能和样本效率在广泛的下游任务。相反&#xff0c;本文讨论了我们称之为大型语言模型的新兴能力的一种不可预测的现象。我们认为如果一个能力不存在于较小的模型中&#xff0c;但在较大的模型中存在&#xff0c;则该能力就是新兴的。…

InforSuiteAS中创中间件windows环境部署

版本&#xff1a;InforSuiteAS_StE_V10.0.5.2.1 环境要求&#xff1a;Java环境 DK1.8版本&#xff0c; 内存2GB或以上 &#xff0c; 硬盘空间 10GB或以上&#xff0c; 监视器 图形界面安装需要256色以上&#xff0c;字符界面安装没有色彩要求 &#xff0c;浏览器 Microsoft …

el-tree基础的树形节点设置节点不能选中高亮出来,对已经选中的节点设置disabled,对当前节点刚选中后设置禁用disabled

一、 el-tree基础的树形节点设置节点不能选中高亮出来 需求 我们使用element-ui或者element-plus的时候会遇到树形控件的使用&#xff0c;我们使用树形控件会限制有的节点不让选中和高亮出来&#xff0c;这个时候需要我们做限制。在实现中我们发现了element-ui和element-plus…

SQL注入实战:绕过操作

一&#xff1a;绕过操作 1、常用绕过方式 大小写绕过&#xff1a; 通过修改关键字内字母大小写来绕过过滤措施。例如:AnD11Select* from ** oRdEr by 1 双写绕过&#xff1a; 使用双写绕过。因为在过滤过程中只进行了一次替换。就是将关键字替换为对应的空。 比如 union在…

使用Opencv-python库读取图像、本地视频和摄像头实时数据

使用Opencv-python库读取图像、本地视频和摄像头实时数据 Python中使用OpenCV读取图像、本地视频和摄像头数据很简单&#xff0c; 首先需要安装Python&#xff0c;然后安装Opencv-python库 pip install opencv-python然后在PyCharm或者VScode等IDE中输入对应的Python代码 一…

VS执行程序的时候运行上一次的程序。

这个问题我找了很久&#xff0c;最后自己随便按一下&#xff0c;成功了&#xff0c;分享给大家&#xff1a; 上面的代码是我测试的时候用的&#xff0c;随便写个c或者c代码就行&#xff0c;因为这个时候&#xff0c;我的代码已经更改了&#xff0c;它依然执行上一次的程序。我…

2024.1.27每日一题

LeetCode 最大合金数 2861. 最大合金数 - 力扣&#xff08;LeetCode&#xff09; 题目描述 假设你是一家合金制造公司的老板&#xff0c;你的公司使用多种金属来制造合金。现在共有 n 种不同类型的金属可以使用&#xff0c;并且你可以使用 k 台机器来制造合金。每台机器都需…

【项目日记(五)】第二层: 中心缓存的具体实现(上)

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:项目日记-高并发内存池⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你做项目   &#x1f51d;&#x1f51d; 开发环境: Visual Studio 2022 项目日…

sqli-lbs靶场搭建

目录 环境小皮源码下载 1.源码解压&#xff1a; 2.搭建网站 2.1点击创建网站 2.2修改sql-connections\db-creds.inc 2.3重新启动 3.访问你设置的域名 3.1点击启动数据库配置 3.2返回第一个页面&#xff08;开启题目&#xff09; sqlilbs靶场搭建 环境小皮源码下载 下载地址&am…

AWTK 开源串口屏开发(8) - 系统设置

AWTK 开源串口屏开发 - 系统设置 系统设置只是一个普通应用程序&#xff0c;不过它会用 默认模型 中一些内置的属性和命令&#xff0c;所以这里专门来介绍一下。 1. 功能 在这个例子会用到 默认模型 中一些下列内置的属性和命令&#xff1a; 内置属性 属性类型说明rtc_yea…