■ Android集成百度语音识别

■ Android集成百度语音识别

实现这个功能的目的,是我看见我公司硬件工程师给客户回答问题的时候用公司研发的APP,每次都是手动输入打字,看着他带着老花镜的样子,于心不忍,毕竟咱就是干这个的.

实现效果
在这里插入图片描述

集成 百度语音实时识别
https://ai.baidu.com/sdk#asr
在这里插入图片描述
AndroidManifest.xml 文件

   <uses-permission android:name="android.permission.RECORD_AUDIO" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

    <!-- 蓝牙录音使用,不需要可以去除 -->
    <uses-permission android:name="android.permission.BROADCAST_STICKY" />
    <uses-permission android:name="android.permission.BLUETOOTH" />
    <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme"
        tools:ignore="GoogleAppIndexingWarning">
        
   <!-- 百度控制台申请的KEY -->
        <meta-data
            android:name="com.baidu.speech.APP_ID"
            android:value="22611822"/>

        <meta-data
            android:name="com.baidu.speech.API_KEY"
            android:value="YoR10GzzuZ58FYLpQ1utD5vy"/>
        <meta-data
            android:name="com.baidu.speech.SECRET_KEY"
            android:value="gGQvipUXC0dSSGmAQNMeHCMKTW4fGGrH"/>

        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

build.gradle

    packagingOptions{
   
        doNotStrip "*/*/libvad.dnn.so"
        doNotStrip "*/*/libbd_easr_s1_merge_normal_20151216.dat.so"
    }

集成jar包

dependencies {
   
//...省略
 implementation files('libs\\bdasr_V3_20191210_81acdf5.jar')
}

在这里插入图片描述
到这里基本就可以集成了百度语音实时识别,但是这里有个坑.就是语音申请的时候得领取配额
在这里插入图片描述
一定要领取配额,不然一顿 4004,一开始我以为是集成错误导致了,包名检查了N次…

使用方法
这里我直接附上我写的代码了


    protected TextView txtResult;
    private EventManager asr;
    protected boolean enableOffline = false; // 测试Unit 2.0 功能,必须一直联网
    private EditText etText;
    private LinearLayout llView;
    private CustomPopWindow mCustomPopWindowCause;
    private TextView tvContent;
    private TextView tvState;
    private LinearLayout llClick;

    /** * 基于SDK集成2.2 发送开始事件 * 点击开始按钮 * 测试参数填在这里 */
    @SuppressLint("HandlerLeak")
    private void start() {
   
        Map<String, Object> params = new LinkedHashMap<String, Object>();
        String event = null;
        event = SpeechConstant.ASR_START; // 替换成测试的event

        if (enableOffline) {
   
            params.put(SpeechConstant.DECODER, 2);
        }
        // 基于SDK集成2.1 设置识别参数
        params.put(SpeechConstant.ACCEPT_AUDIO_VOLUME, false);
        params.put(SpeechConstant.PID, 15374); // 或 19364 Unit 2.0 固定pid,仅支持中文普通话
        params.put(SpeechConstant.NLU, "enable");
        params.put(SpeechConstant.VAD_ENDPOINT_TIMEOUT, 0); // 长语音
        String json = null; // 可以替换成自己的json
        json = new JSONObject(params).toString(); // 这里可以替换成你需要测试的json
        asr.send(event, json, null, 0, 0);
        Log.e("X000", json + "");

    }

    /** * 点击停止按钮 * 基于SDK集成4.1 发送停止事件 */
    private void stop() {
   

        asr.send(SpeechConstant.ASR_STOP, null, null, 0, 0); //
    }


    /** * enableOffline设为true时,在onCreate中调用 * 基于SDK离线命令词1.4 加载离线资源(离线时使用) */
    private void loadOfflineEngine() {
   
        Map<String, Object> params = new LinkedHashMap<String, Object>();
        params.put(SpeechConstant.DECODER, 2);
        params.put(SpeechConstant.ASR_OFFLINE_ENGINE_GRAMMER_FILE_PATH, "assets://baidu_speech_grammar.bsg");
        asr.send(SpeechConstant.ASR_KWS_LOAD_ENGINE, new JSONObject(params).toString(), null, 0, 0);
    }

    /** * enableOffline为true时,在onDestory中调用,与loadOfflineEngine对应 * 基于SDK集成5.1 卸载离线资源步骤(离线时使用) */
    private void unloadOfflineEngine() {
   
        asr.send(SpeechConstant.ASR_KWS_UNLOAD_ENGINE, null, null, 0, 0); //
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
   
        super.onCreate(savedInstanceState);
        setContentView(R.layout.common_mini);
        EventBus.getDefault().register(this);
        initView();
        initPermission();
        // 基于sdk集成1.1 初始化EventManager对象
        asr = EventManagerFactory.create(this, "asr");
        // 基于sdk集成1.3 注册自己的输出事件类
        asr.registerListener(this); // EventListener 中 onEvent方法

        if (enableOffline) {
   
            loadOfflineEngine(); // 测试离线命令词请开启, 测试 ASR_OFFLINE_ENGINE_GRAMMER_FILE_PATH 参数时开启
        }
    }


    // 基于sdk集成1.2 自定义输出事件类 EventListener 回调方法
    // 基于SDK集成3.1 开始回调事件
    @Override
    public void onEvent(String name, String params, byte[] data, int offset, int length) {
   

        if (params != null && !params.isEmpty()) {
   
            try {
   
                JSONObject object = new JSONObject(params);
                JSONArray jsonArray = object.getJSONArray("results_recognition");
                StringBuffer str = new StringBuffer();
                if (jsonArray != null || jsonArray.length() != 0) {
   
                    for (int i = 0; i < jsonArray.length(); i++) {
   
                        String msg = jsonArray.getString(i);
                        str.append(msg + " ");
                    }
                    tvContent.setText(str.toString());
                }

            } catch (JSONException e) {
   
                e.printStackTrace();
            }


        }


    }


    private void initView() {
   
        txtResult = (TextView) findViewById(R.id.txtResult);
        etText = findViewById(R.id.et_text);
        llView = findViewById(R.id.ll_layout);
        findViewById(R.id.btn_x).setOnClickListener(new View.OnClickListener() {
   
            @Override
            public void onClick(View v) {
   
                ShowVoice();
            }
        });
    }

    @Subscribe(threadMode = ThreadMode.MAIN)
    public void ConsultEvent(XYTextEvent item) {
   
        String context = item.getContext();
        String trim = etText.getText().toString().trim();
        if (!trim.isEmpty()) {
   
            etText.setText(trim + context);
        } else {
   
            etText.setText(context);
        }

    }


    /** * 展示语音 */
    @SuppressLint("ClickableViewAccessibility")
    private void ShowVoice() {
   
        final View contentView = LayoutInflater.from(MainActivity.this).inflate(R.layout.dialog_windows, null);
        mCustomPopWindowCause = new CustomPopWindow.PopupWindowBuilder(MainActivity.this)
                .setView(contentView)
                .enableBackgroundDark(true) //弹出popWindow时,背景是否变暗
                .setBgDarkAlpha(0.6f) // 控制亮度
                .enableOutsideTouchableDissmiss(true)
                .create();
        mCustomPopWindowCause.showAtLocation(llView, Gravity.FILL, 0, 0);
        tvContent = contentView.findViewById(R.id.tv_content);
        tvState = contentView.findViewById(R.id.tv_state);
        llClick = contentView.findViewById(R.id.ll_click);


        //触摸手势事件
        llClick.setOnTouchListener(new View.OnTouchListener() {
   
            @Override
            public boolean onTouch(View v, MotionEvent event) {
   

                switch (event.getAction()) {
   
                    case MotionEvent.ACTION_DOWN:
                        tvState.setText("正在说...~");
                        llClick.setBackgroundResource(R.drawable.ra_bg);
                        start();
                        break;
                    case MotionEvent.ACTION_UP:
                        tvState.setText("按住说话~");
                        llClick.setBackgroundResource(R.drawable.re_bg);
                        stop();
                        EventBus.getDefault().post(new XYTextEvent(tvContent.getText().toString()));
                        mCustomPopWindowCause.dissmiss();

                        // etText.setText(tvContent.getText().toString());
                        break;
                }

                return true;
            }
        });

    }

    /** * android 6.0 以上需要动态申请权限 */
    private void initPermission() {
   
        String permissions[] = {
   Manifest.permission.RECORD_AUDIO,
                Manifest.permission.ACCESS_NETWORK_STATE,
                Manifest.permission.INTERNET,
                Manifest.permission.WRITE_EXTERNAL_STORAGE
        };

        ArrayList<String> toApplyList = new ArrayList<String>();

        for (String perm : permissions) {
   
            if (PackageManager.PERMISSION_GRANTED != ContextCompat.checkSelfPermission(this, perm)) {
   
                toApplyList.add(perm);
                // 进入到这里代表没有权限.

            }
        }
        String tmpList[] = new String[toApplyList.size()];
        if (!toApplyList.isEmpty()) {
   
            ActivityCompat.requestPermissions(this, toApplyList.toArray(tmpList), 123);
        }

    }

    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
   
        // 此处为android 6.0以上动态授权的回调,用户自行实现。
    }

    @Override
    protected void onPause() {
   
        super.onPause();
        asr.send(SpeechConstant.ASR_CANCEL, "{}", null, 0, 0);
    }

    @Override
    protected void onDestroy() {
   
        super.onDestroy();
        // 基于SDK集成4.2 发送取消事件
        asr.send(SpeechConstant.ASR_CANCEL, "{}", null, 0, 0);
        if (enableOffline) {
   
            unloadOfflineEngine(); // 测试离线命令词请开启, 测试 ASR_OFFLINE_ENGINE_GRAMMER_FILE_PATH 参数时开启
        }

        // 基于SDK集成5.2 退出事件管理器
        // 必须与registerListener成对出现,否则可能造成内存泄露
        asr.unregisterListener(this);

        if (EventBus.getDefault().isRegistered(this))
            EventBus.getDefault().unregister(this);

    }

附带三方库

    implementation 'com.github.pinguo-zhouwei:CustomPopwindow:2.1.1'
    implementation 'org.greenrobot:eventbus:3.1.1'

后记 :功能实现了,老工程师很开心.他跟我说他之所以打字,是因为他在给客户回答问题的时候得思索一下…
至于语音输入功能,他说现在的输入法都有这个功能了.要不你打字的时候,试一下长按空格键…-_-||

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/2816.html原文链接:https://javaforall.net

(1)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • JAVAdebug_java如何设置断点

    JAVAdebug_java如何设置断点大家好,我是时间财富网智能客服时间君,上述问题将由我为大家进行解答。以eclipse为例,debug的用法:1、首先在一个java文件中设断点,然后debugas,opendebugDialog,然后在对话框中选类后,Run。2、F5键与F6键均为单步调试,F5是stepinto,也就是进入本行代码中执行,F6是stepover,也就是执行本行代码,跳到下一行。3、F7是跳出函数,F8是…

    2022年10月15日
    2
  • win10 卸载cuda10.1

    win10 卸载cuda10.1创建于:@2020.04.19修改于:@2020.04.19文章目录1.背景2.cuda卸载1.背景在尝试安装tensorflow-gpu时,cuda安装版本错误。需要卸载。2.cuda卸载(1)在控制面板中打开【程序】–>【程序和功能】(2)确定要卸载的内容,图中红框内的内容(3)删除C盘里面C:\ProgramFiles\NVIDIAGPUComputi…

    2022年6月16日
    34
  • 【转】知识图谱构建全过程

    【转】知识图谱构建全过程https mp weixin com s lBeV6XWzk5bq zw 知识图谱 是结构化的语义知识库 用于迅速描述物理世界中的概念及其相互关系 通过将数据粒度从 document 级别降到 data 级别 聚合大量知识 从而实现知识的快速响应和推理 当下知识图谱已在工业领域得到了广泛应用 如搜索领域的 Google 搜索 百度搜索 社交领域的领英经济图谱 企业信息领域的天眼

    2026年1月27日
    0
  • httprunner(2)下载安装「建议收藏」

    httprunner(2)下载安装「建议收藏」环境要求HttpRunner是一个基于Python开发的测试框架,可以运行在macOS、Linux、Windows系统平台上。这里使用macOS系统进行演示对于python版本要求:py

    2022年7月28日
    26
  • laravel 共享session问题总结

    laravel 共享session问题总结

    2021年11月7日
    37
  • MODIS数据介绍——波段、产品

    MODIS数据介绍——波段、产品MODIS是搭载在terra和aqua卫星上的传感器,MODIS扫描周期为1.477秒,每条扫描线沿扫描方向有1354个Pixels,沿卫星轨道方向有10个1KMD的IFOV。在每个IFOV中,1KM分辨率波段有1个采样,500M分辨率波段有4个采样,250M波段有16个采样。通过网址进行下载:https://ladsweb.modaps.eosdis.nasa.gov/对于MODIS的波段…

    2022年5月10日
    59

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号