欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

讯飞和腾讯云:安卓语音识别服务比较方案 - II.腾讯云语音识别

最编程 2024-10-13 07:01:27
...

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,并处理识别结果。

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