讯飞与腾讯云:Android 语音识别服务对比选择

目录

一、讯飞语音识别

1.1 讯飞语音识别介绍

1.1.1 功能特点

1.1.2 优势

1.2 接入流程

1.2.1 注册账号并创建应用

1.2.2 下载SDK等相关资料

1.2.3 导入SDK

1.2.4 添加用户权限

1.2.5 初始化讯飞SDK

1.2.6 初始化语音识别对象

1.2.7 显示结果

二、腾讯云语音识别

2.1 腾讯云语音识别介绍

2.1.1 功能特点

2.1.2 优势

2.2 接入流程

2.2.1 注册腾讯云账号

2.2.2 获取相关的凭证信息

2.2.3 下载SDK等相关资料

2.2.4 导入SDK和添加其他依赖

2.2.5 添加用户权限

2.2.6 初始化腾讯云SDK

2.2.7 设置识别结果回调

2.2.8 录音文件直接识别

2.2.9 录音并识别语音

2.2.10 recognize 介绍

三、选择建议

相关推荐


        在 移动端 接入语音识别方面,讯飞和腾讯云都是优秀的选择,但各有其特点和优势。以下是对两者的详细比较:

一、讯飞语音识别

1.1 讯飞语音识别介绍

1.1.1 功能特点

        1.提供全面的语音识别功能,包括实时语音识别和离线语音识别。

        2.支持多种语言识别,满足不同语种用户的需求。(普通话/英语免费,其他语音可试用半年。试用到期后需单独购买,价格为:2万/个/年)

        3.提供丰富的SDK和API接口,方便开发者集成和使用。

1.1.2 优势

        1.讯飞在语音识别领域有较高的知名度和市场占有率。

        2.提供了详细的开发文档和示例代码,方便开发者快速上手。

        3.支持定制化开发,可以根据用户需求进行个性化定制。

1.2 接入流程

1.2.1 注册账号并创建应用

        注册讯飞开放平台账号,创建应用并获得AppID。

1.2.2 下载SDK等相关资料

        直接下载SDK,SDK中包含简易可运行的Demo。

1.2.3 导入SDK

        将在官网下载的Android SDK 压缩包中libs目录下所有子文件拷贝至Android工程的libs目录下。

        sdk下文件夹main/assets/,自带UI页面(iflytek文件夹)和相关其他服务资源文件(语法文件、音频示例、词表),使用自带UI接口时,可以将assets/iflytek文件拷贝到项目中;我这用到是自己写的界面所以仅导入了libs目录下文件。

1.2.4 添加用户权限

        在工程 AndroidManifest.xml 文件中添加如下权限,在实际项目中还需要动态申请权限。

<!--连接网络权限,用于执行云端语音能力 -->
<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" />

        注意:如需在打包或者生成APK的时候进行混淆,请在proguard.cfg中添加如下代码:

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

1.2.5 初始化讯飞SDK

        初始化即创建语音配置对象,只有初始化后才可以使用MSC的各项服务。建议将初始化放在程序入口处(如Application、Activity的onCreate方法),初始化代码如下: 

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

// public class SpeechConstant {
//     public static final java.lang.String APPID = "appid";
//     ......
// }

1.2.6 初始化语音识别对象

    private void initSpeech() {
        // 使用SpeechRecognizer对象,可根据回调消息自定义界面;
        mIat = SpeechRecognizer.createRecognizer(this, mInitListener);
        setParam();
    }

    /**
     * 初始化监听器。
     */
    private InitListener mInitListener = code -> {
        Log.d(TAG, "SpeechRecognizer init() code = " + code);
        if (code != ErrorCode.SUCCESS) {
            //showTip("初始化失败,错误码:" + code + ",请点击网址https://www.xfyun.cn/document/error-code查询解决方案");
        }
    };

    /**
     * 参数设置
     *
     * @return
     */
    public void setParam() {
        if (mIat != null) {
            // 清空参数
            mIat.setParameter(SpeechConstant.PARAMS, null);
            // 设置听写引擎,此处engineType为“cloud”
            mIat.setParameter( SpeechConstant.ENGINE_TYPE, engineType );
            //设置返回结果格式,目前支持json,xml以及plain 三种格式,其中plain为纯听写文本内容
            mIat.setParameter(SpeechConstant.RESULT_TYPE, "json");
            // 设置语言(目前普通话,可切换成英文)
            mIat.setParameter(SpeechConstant.LANGUAGE, "zh_cn");
            // 设置语言区域
            mIat.setParameter(SpeechConstant.ACCENT, "mandarin");

            // 设置语音前端点:静音超时时间,即用户多长时间不说话则当做超时处理
            //取值范围{1000~10000}
            mIat.setParameter(SpeechConstant.VAD_BOS, "10000");

            // 设置语音后端点:后端点静音检测时间,即用户停止说话多长时间内即认为不再输入, 自动停止录音
            //取值范围{1000~10000}
            mIat.setParameter(SpeechConstant.VAD_EOS, "1000");

            // 设置标点符号,设置为"0"返回结果无标点,设置为"1"返回结果有标点
            mIat.setParameter(SpeechConstant.ASR_PTT, "0");

            // 设置音频保存路径,保存音频格式支持pcm、wav.
            mIat.setParameter(SpeechConstant.AUDIO_FORMAT, "wav");
            mIat.setParameter(SpeechConstant.ASR_AUDIO_PATH,
                    getExternalFilesDir("msc").getAbsolutePath() + "/iat.wav");
        }
    }

1.2.7 开始录音

    public void startListen() {
        buffer.setLength(0);
        mIatResults.clear();
        int ret = mIat.startListening(mRecognizerListener);
        if (ret != ErrorCode.SUCCESS) {
            Log.d(TAG, "听写失败,错误码:" + ret + ",请点击网址https://www.xfyun.cn/document/error-code查询解决方案");
        } else {
            Log.d(TAG, "开始说话");
            if (!isSoundRecording){
                isSoundRecording = true;
                runOnUiThread(() -> {
                    binding.llSoundRecording.setVisibility(View.VISIBLE);
                    binding.ivStopSoundRecording.setVisibility(View.VISIBLE);
                    if (animationDrawable != null) {
                        animationDrawable.start();
                    }
                });
            }

        }
    }
    /**
     * 听写监听器。
     */
    private RecognizerListener mRecognizerListener = new RecognizerListener() {

        @Override
        public void onBeginOfSpeech() {
            // 此回调表示:sdk内部录音机已经准备好了,用户可以开始语音输入
            Log.d(TAG, "RecognizerListener.onEvent:sdk内部录音机已经准备好了,用户可以开始语音输入");
        }

        @Override
        public void onError(SpeechError error) {
            // Tips:
            // 错误码:10118(您没有说话),可能是录音机权限被禁,需要提示用户打开应用的录音权限。
            Log.d(TAG, "RecognizerListener.onError " + error.getPlainDescription(true));

        }

        @Override
        public void onEndOfSpeech() {
            // 此回调表示:检测到了语音的尾端点,已经进入识别过程,不再接受语音输入
            Log.d(TAG, "RecognizerListener.onEndOfSpeech ");

        }

        @Override
        public void onResult(RecognizerResult recognizerResult, boolean b) {
            Log.d(TAG, "RecognizerListener.onResult 结束" + recognizerResult.getResultString());
            Log.d(TAG, results.getResultString());
            if (isLast) {
                Log.d(TAG, "onResult 结束");
            }
            //设置返回结果格式,目前支持json,xml以及plain 三种格式,其中plain为纯听写文本内容
            //mIat.setParameter(SpeechConstant.RESULT_TYPE, "json");
            //在初始化的时候我们设置的事json,所以处理json就可以了。
            if (resultType.equals("json")) {
                printResult(results);
                return;
            }
//            if (resultType.equals("plain")) {
//                buffer.append(results.getResultString());
//                mResultText.setText(buffer.toString());
//                mResultText.setSelection(mResultText.length());
//            }
        }


        @Override
        public void onVolumeChanged(int volume, byte[] data) {
            Log.d(TAG, "RecognizerListener.onVolumeChanged");
        }

        @Override
        public void onEvent(int eventType, int arg1, int arg2, Bundle obj) {
            Log.d(TAG, "RecognizerListener.onEvent" + eventType);
        }
    };

1.2.7 显示结果

        拿到结果,那后面还不是你说了算

    private HashMap<String, String> mIatResults = new LinkedHashMap<>(); 
   /**
     * 显示结果
     */
    private void printResult(RecognizerResult results) {
        String text = JsonParser.parseIatResult(results.getResultString());
        String sn = null;
        // 读取json结果中的sn字段
        try {
            JSONObject resultJson = new JSONObject(results.getResultString());
            sn = resultJson.optString("sn");
        } catch (JSONException e) {
            e.printStackTrace();
        }

        mIatResults.put(sn, text);

        StringBuffer resultBuffer = new StringBuffer();
        for (String key : mIatResults.keySet()) {
            resultBuffer.append(mIatResults.get(key));
        }
        mResultText.setText(resultBuffer.toString());
        mResultText.setSelection(mResultText.length());
    }

        讯飞错误码:错误码查询 - 讯飞

        讯飞官方文档:语音听写 Android SDK 文档 | 讯飞

二、腾讯云语音识别

2.1 腾讯云语音识别介绍

2.1.1 功能特点

        腾讯云语音识别(ASR)基于深度学习技术,具备较高的语音识别准确性。

        提供实时语音识别和离线语音识别两种类型,满足不同场景需求。

        支持多种语种和方言识别,如中文、英文、粤语等。

2.1.2 优势

        腾讯云作为国内领先的云服务提供商,拥有强大的技术实力和丰富的应用场景。

        提供了丰富的语音识别和语音合成产品,可以满足开发者多样化的需求。

        提供了可视化控制台和详尽的API文档,方便开发者进行配置和管理。

2.2 接入流程

2.2.1 注册腾讯云账号

        注册腾讯云账号(需要个人实名认证/企业认证),并在控制台中创建语音识别应用。

2.2.2 获取相关的凭证信息

        获取相关的凭证信息(如SecretId和SecretKey),用于后续的API调用。

2.2.3 下载SDK等相关资料

        直接下载SDK,SDK中包含简易可运行的Demo。

2.2.4 导入SDK和添加其他依赖

        添加录音文件识别 SDK aar,将 asr-file-recognize-release.aar 放在 libs 目录下,在 App 的 build.gradle 文件中添加。

implementation(name: 'asr-file-recognize-release', ext: 'aar')
implementation 'com.google.code.gson:gson:2.8.5'

2.2.5 添加用户权限

        在工程 AndroidManifest.xml 文件中添加如下权限,在实际项目中还需要动态申请权限。

< 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.WRITE_EXTERNAL_STORAGE"/>
<!--外存储读权限,构建语法需要用到此权限 -->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

        注意:如需在打包或者生成APK的时候进行混淆,请在proguard.cfg中添加如下代码:

-keepclasseswithmembernames class * { # 保持 native 方法不被混淆
native <methods>;
}
-keep public class com.tencent.cloud.qcloudasrsdk.*

2.2.6 初始化腾讯云SDK

        int appId = xxxxx;
        int projectId = 0; //此参数固定为0;
        String secretId = "xxxxxx";
        String secretKey = "xxx";
        if (fileFlashRecognizer == null) {
                /**直接鉴权**/
            fileFlashRecognizer = new QCloudFlashRecognizer(appId, secretId, secretKey);

               /**使用临时密钥鉴权
                * * 1.通过sts 获取到临时证书 (secretId secretKey  token) ,此步骤应在您的服务器端实现,见https://cloud.tencent.com/document/product/598/33416
                *   2.通过临时密钥调用接口
                * **/
//            fileFlashRecognizer = new QCloudFlashRecognizer(DemoConfig.apppId, "临时secretId", "临时secretKey","对应的token");

        }

2.2.7 设置识别结果回调

    //设置识别结果回调
    fileFlashRecognizer.setCallback(this);

    public interface QCloudFlashRecognizerListener {
        /**
         * 识别结果回调
         * @param recognizer 录音文件识别实例
         * @param result 服务器返回的识别结果 api文档 https://cloud.tencent.com/document/product/1093/52097
         * @param exception 异常信息
         *
         */
        void recognizeResult(QCloudFlashFileRecognizer recognizer,String result, int status,Exception exception);
    }

    //录音文件识别结果回调 ,详见api文档 https://cloud.tencent.com/document/product/1093/52097
    @Override
    public void recognizeResult(QCloudFlashRecognizer recognizer,  String result, Exception exception) {
        showLoading(false);
        mStartRec.setEnabled(true);
        mRecognize.setEnabled(true);
        Log.i(this.getClass().getName(), result);

        TextView textView = findViewById(R.id.recognize_flash_text_view);
        if (exception != null){
            textView.setText(exception.getLocalizedMessage());
        }else {
            textView.setText(result);
        }
        if (mPcmTmpFile != null){
            mPcmTmpFile.delete();
            mPcmTmpFile = null;
        }

    }

2.2.8 录音文件直接识别

        InputStream is = null;
        try {
            AssetManager am = getResources().getAssets();
            is = am.open("test2.mp3");
            int length = is.available();
            byte[] audioData = new byte[length];
            is.read(audioData);

            QCloudFlashRecognitionParams params = (QCloudFlashRecognitionParams) QCloudFlashRecognitionParams.defaultRequestParams();

            /**支持传音频文件数据或者音频文件路径,如果同时调用setData和setPath,sdk内将忽略setPath
             *  音频文件支持100M以内的文件,如果使用setData直接传音频文件数据,需要避免数据过大引发OOM,大文件建议传路径
             *  setVoiceFormat必须正确,否则服务器端将无法解析
             *  参数解释详解API文档https://cloud.tencent.com/document/product/1093/52097
             * **/
            params.setData(audioData);
//                    params.setPath("/sdcard/test2.mp3"); //需要读写权限
            params.setVoiceFormat("mp3"); //音频格式。支持 wav、pcm、ogg-opus、speex、silk、mp3、m4a、aac。

            /**以下参数不设置将使用默认值**/
//                    params.setEngineModelType("16k_zh");//引擎模型类型,默认16k_zh。8k_zh:8k 中文普通话通用;16k_zh:16k 中文普通话通用;16k_zh_video:16k 音视频领域。
//                    params.setFilterDirty(0);// 0 :默认状态 不过滤脏话 1:过滤脏话
//                    params.setFilterModal(0);// 0 :默认状态 不过滤语气词  1:过滤部分语气词 2:严格过滤
//                    params.setFilterPunc(0);// 0 :默认状态 不过滤句末的句号 1:滤句末的句号
//                    params.setConvertNumMode(1);//1:默认状态 根据场景智能转换为阿拉伯数字;0:全部转为中文数字。
//                    params.setSpeakerDiarization(0); //是否开启说话人分离(目前支持中文普通话引擎),默认为0,0:不开启,1:开启。
//                    params.setFirstChannelOnly(1); //是否只识别首个声道,默认为1。0:识别所有声道;1:识别首个声道。
//                    params.setWordInfo(0); //是否显示词级别时间戳,默认为0。0:不显示;1:显示,不包含标点时间戳,2:显示,包含标点时间戳。

            /**网络超时时间。
             * 注意:如果设置过短的时间,网络超时断开将无法获取到识别结果;
             * 如果网络断开前音频文件已经上传完成,将会消耗该音频时长的识别额度
             * **/
//                    params.setConnectTimeout(30 * 1000);//单位:毫秒,默认30秒
//                    params.setReadTimeout(600 * 1000);//单位:毫秒,默认10分钟
//                    params.setReinforceHotword(1); // 开启热词增强
//                    params.setSentenceMaxLength(10);

            long ret = 0;
            ret = fileFlashRecognizer.recognize(params);

            if (ret >= 0) {
                showLoading(true);
                mStartRec.setEnabled(false);
                mRecognize.setEnabled(false);
            }
        } catch (IOException e) {
            showLoading(false);
            onMessage("录音文件不存在");
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (is != null) is.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

2.2.9 录音并识别语音

        if (mRecord == null) {
            mRecord = new PcmAudioRecord(); //调用系统录音器录音,调用前请先申请权限
        }
        try {
            mPcmTmpFile = File.createTempFile("pcm_temp", ".pcm");
            boolean ret = mRecord.start(mPcmTmpFile);
            if (ret == false) {
                onMessage("录音器启动失败,请检查权限");
                return;
            }
            isRecording = true;
            showLoading(true);
            mRecognize.setEnabled(false);
            mStartRec.setText("stopRecord");
        } catch (IOException e) {
            e.printStackTrace();
            mStartRec.setEnabled(true);
            mRecognize.setEnabled(true);
            return;
        }
    } else

    {
        if (mRecord == null) {
            mStartRec.setEnabled(true);
            mRecognize.setEnabled(true);
            return;
        }
        mRecord.stop();
        QCloudFlashRecognitionParams params = (QCloudFlashRecognitionParams) QCloudFlashRecognitionParams.defaultRequestParams();
        params.setPath(mPcmTmpFile.getPath()); //需要读写权限
        params.setVoiceFormat("pcm");
        params.setReinforceHotword(1); // 开启热词增强

        try {
            long ret = fileFlashRecognizer.recognize(params);
            if (ret >= 0) {
                showLoading(true);
                mStartRec.setEnabled(false);
                mRecognize.setEnabled(false);
                isRecording = false;
                Button btn = findViewById(R.id.recognize_start_record);
                btn.setText("startRecord");
                showLoading(true);
                mStartRec.setEnabled(false);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

2.2.10 recognize 介绍

public class QCloudFlashRecognizer extends com.tencent.cloud.qcloudasrsdk.filerecognize.QCloudBaseRecognizer implements com.tencent.cloud.qcloudasrsdk.filerecognize.network.QCloudFlashRecognizeTaskListener {
    /**
     * 初始化方法
     *
     * @param activity  app activity
     * @param appId     腾讯云 appid
     * @param secretId  腾讯云 secretId
     * @param secretKey 腾讯云 secretKey
     */
    public QCloudFlashRecognizer(String appId, String secretId, String secretKey);

    /* * 通过 url 或语音数据调用录音文件识别
     * @param params 请求参数
     * @return 返回本次请求的唯一标识别 requestId
     */
    public long recognize(QCloudFlashRecognitionParams params) throws Exception;
}

        在Android项目中调用腾讯云的语音识别API,并处理识别结果。

        腾讯云语音识别:录音文件识别极速版-腾讯云

三、选择建议

        讯飞语音识别免费额度: 每天500条识别。

        腾讯云免费额度:一句话语音识别(每月5000条)、录音文件识别(每月10小时)。

        综上所述,讯飞和腾讯云都是优秀的Android语音识别解决方案。开发者在选择时,应根据自身需求、成本因素和用户评价进行综合考虑

相关推荐

Android SDK 遇到的坑之 AIUI(星火大模型)-CSDN博客文章浏览阅读3.4k次,点赞92次,收藏66次。需要给桌面机器人(医康养)应用做语音指引/控制/健康咨询等功能。AIUI常见错误:唤醒无效;错误码:600103;错误码:600022。_aiui android sdk 配置唤醒词https://shuaici.blog.csdn.net/article/details/141430041Android SDK 遇到的坑之讯飞语音合成-CSDN博客文章浏览阅读1.9k次,点赞50次,收藏36次。loadLibrary msc error:java.lang.UnsatisfiedLinkError: dlopen failed: library "libmsc.so" not found组件未安装.(错误码:21002)_组件未安装.(错误码:21002)https://shuaici.blog.csdn.net/article/details/141169429

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Django一分钟:DRF生成OpenAPI接口文档

DRF项目中如果想要自动生成API文档我们可以借助drf-spectacular这个库&#xff0c;drf-spectacular非常强大&#xff0c;它可以自动从DRF中提取信息&#xff0c;自动生成API文档&#xff0c;配置简单开箱即用&#xff0c;并且它对很多常用的第三方如&#xff1a;SimpleJWT、dja…

Spark练习-RDD创建,读取hdfs上的数据,指定rdd分区

目录 RDD的创建 读取HDFS上文件数据 RDD分区指定 RDD的创建 将python数据转为rdd # 将Python数据转为rdd data [1,2,3,4] res sum(data) # 使用python的方法计算时&#xff0c;采用的单机资源计算&#xff0c;如果数据量较大时&#xff0c;可以将python数据转为spark的r…

JavaWeb——Vue:打包部署(Nginx、目录介绍、部署及启动、访问 )

目录 打包 部署 Nginx 目录介绍 部署及启动 访问 前端 Vue 项目的最后一步是打包部署。在当前前后端分离的开发模式中&#xff0c;前端开发人员开发前端代码&#xff0c;后端开发人员开发后端代码。最终要将开发及测试完毕的前端 Vue 代码和后端代码分开部署在对应的服…

CentOS 7.9 局域网配置指定同步时间服务器

在 CentOS 7.9 中&#xff0c;默认的时间同步工具是 chrony。以下是如何配置 NTP 服务器地址并使用 chrony 进行时间同步的步骤&#xff1a; 1. 安装 chrony&#xff08;通常已经预装可忽略&#xff09; 通过systemctl status chronyd检查是否已经安装启动 如果没网可以直接…

SpringBoot框架下购物推荐网站的设计模式与实现

3系统分析 3.1可行性分析 通过对本东大每日推购物推荐网站实行的目的初步调查和分析&#xff0c;提出可行性方案并对其一一进行论证。我们在这里主要从技术可行性、经济可行性、操作可行性等方面进行分析。 3.1.1技术可行性 本东大每日推购物推荐网站采用JAVA作为开发语言&…

AD查看任意角度PCB的3D效果图

点击 视图 - > 切换到3维模式啥键都不按&#xff0c;滚动鼠标滚轮&#xff0c;3D图上下移动&#xff1b;这个很简单&#xff0c;经常用&#xff1b;按住Ctrl,滚动鼠标滚轮&#xff0c;3D图缩放&#xff1b;这个很简单&#xff0c;经常用&#xff1b;按住Shift&#xff0c;滚…

jenkins 插件SSH Pipeline Steps

一、安装 SSH Pipeline Steps | Jenkins plugin 二、添加全局linux服务器用户名密码&#xff1a;linux-142 三、新建流水线SshServer 添加Pipeline Script node {def remote [:]remote.name tstremote.host 192.168.31.142remote.allowAnyHosts truewithCredentials([usern…

【机器学习】朴素贝叶斯算法|商品评论情感分析案例介绍及代码实现

文章目录 朴素贝叶斯算法朴素贝叶斯算法介绍概率数学基础复习朴素贝叶斯算法-利用概率值进行分类的一种机器学习算法贝叶斯公式朴素贝叶斯算法拉普拉斯平滑系数 朴素贝叶斯API案例分析流程数据集代码实现运行结果 朴素贝叶斯算法 朴素贝叶斯算法介绍 概率数学基础复习 条件概…

1.4 使用Vite创建Vue 3项目

文章目录 什么是 ViteVite 的优点注意事项 创建 Vue 3 项目手动创建项目通过模板自动创建项目启动项目 Vue 3 项目目录结构Vue 3 项目运行过程项目运行过程项目关键文件 大家好&#xff0c;今天我们将一起学习如何使用 Vite 创建一个 Vue 3 项目。Vite 是一个现代的前端构建工具…

论文解析三: D2-Net 用于联合描述和检测局部特征的可训练CNN

目录 1.D2-Net摘要2.D2-Net关键点介绍3. Joint Detection and Description (联合检测和描述)3.1 Feature Extraction3.2 Feature Detection3.2.1 Hard feature detection &#xff08;硬特征检测&#xff09;3.2.1 Soft Feature Detection&#xff08;软特征检测&#xff09; 3…

Pandas处理时间序列之光谱分析与聚类

import matplotlib.pylab as plt %matplotlib inline import numpy as np from numpy import fft import pandas as pd 一、光谱分析 • 将时间序列分解为许多正弦或余弦函数的总和 • 这些函数的系数应该具有不相关的值 • 对正弦函数进行回归 光谱分析应用场景 基于光谱的…

comprehensive_tools之添加菜单

文章目录 安装 sass sass-loader新建Layout、styles修改配置文件App.vue修改 main.cssmain.ts删除components目录下的所有文件在router文件夹中新建routers.ts修改router/index.ts修改vite.config.tsAboutView.vue、ContactView.vue、HomeView.vueAboutView.vueContactView.vue…

2014年国赛高教杯数学建模A题嫦娥三号软着陆轨道设计与控制策略解题全过程文档及程序

2014年国赛高教杯数学建模 A题 嫦娥三号软着陆轨道设计与控制策略 嫦娥三号于2013年12月2日1时30分成功发射&#xff0c;12月6日抵达月球轨道。嫦娥三号在着陆准备轨道上的运行质量为2.4t&#xff0c;其安装在下部的主减速发动机能够产生1500N到7500N的可调节推力&#xff0c;…

二、PyCharm基本设置

PyCharm基本设置 前言一、设置中文汉化二、设置代码字体颜色三、设置鼠标滚轮调整字体大小四、修改 PyCharm 运行内存4.1 方式一4.1 方式二 五、显示 PyCharm 运行时内存六、设置代码模版配置的参数有&#xff1a; 七、PyCharm设置背景图总结 前言 为了让我们的 PyCharm 更好用…

rk3568,rk3588 , opencv 的了解。

网上的截图&#xff1a; 自动安装&#xff1b; 手动安装&#xff1b; 我只是 截图了一下&#xff0c;并没有实地的进行测试。

JAVA软开-面试经典题(7)-字符串常量池

字符串常量池 1.定义&#xff1a;字符串常量池&#xff08;String Constant Pool&#xff09;&#xff0c;用于存放字符串常量的运行时内存结构&#xff0c;其底层的实现为Hashtable。 【注意】 在JDK1.6之前&#xff0c;字符串常量池中只会存放具体的String实例&#xff0c;在…

学生护眼大路灯哪种好啊?五款真正护眼的护眼大路灯分享

在贴吧、论坛、知乎等社区网站上&#xff0c;大家可能经常看到家长吐槽、讨论学生护眼大路灯哪种好啊这类话题。说是由于孩子们用了不适合的护眼大路灯后&#xff0c;出现了光线刺眼、疲劳感加重等诸多伤眼问题。作为测评师&#xff0c;我对这个问题非常关注&#xff0c;也特意…

prompt learning

prompt learning 对于CLIP&#xff08;如上图所示&#xff09;而言&#xff0c;对其prompt构造的更改就是在zero shot应用到下游任务的时候对其输入的label text进行一定的更改&#xff0c;比如将“A photo of a{obj}”改为“[V1][V2]…[Vn][Class]”这样可学习的V1-Vn的token…

UE5 C++: 插件编写06 | 移动文件时自动Fix up redirectors

目录 前言&#xff1a; 本文内容&#xff1a; WHY WHAT HOW 详细步骤 代码解析 1. Build.cs file中 2. QuickAssetAction.cpp中 IMPORTANT NOTES 中文解释&#xff1a; 使用 AssetToolsModule 来修复重定向器 使用 AssetRegistryModule 来过滤所有重定向器 使用 FMo…

功能强大且简单易用的实时算法视频监控,智慧快消开源了。

智慧快消视频监控平台是一款功能强大且简单易用的实时算法视频监控系统。它的愿景是最底层打通各大芯片厂商相互间的壁垒&#xff0c;省去繁琐重复的适配流程&#xff0c;实现芯片、算法、应用的全流程组合&#xff0c;从而大大减少企业级应用约95%的开发成本。 基于多年的深度…