讯飞语音识别RecognizerDialog自定义view

集成语音识别的过程中,语音识别的那个RecognizerDialog下面有 “语音识别能力由讯飞输入法提供”看着很别扭, 想去掉或者完全使用自定义的View,研究了一波。

这里写图片描述

RecognizerDialog自定义view需要先看官方直接提供demo里的部分代码,选择是否显示对话框。

        if (isShowDialog) {
            // 显示听写对话框
            mIatDialog.setListener(mRecognizerDialogListener);
            mIatDialog.show();
            showTip(getString(R.string.text_begin));
        } else {
            // 不显示听写对话框
            ret = mIat.startListening(mRecognizerListener);
            if (ret != ErrorCode.SUCCESS) {
                showTip("听写失败,错误码:" + ret);
            } else {
                showTip(getString(R.string.text_begin));
            }
        }

    
    
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

1.isShowDialog为true

当isShowDialog为true时是直接使用官方的RecognizerDialog,但是我又不想看到对话框下边那一行字,研究许久,发现可以修改UI,获取字体所在的控件,设置为”“,隐藏字体,也可改写成自己想要的字体效果,重写字体的点击事件
隐藏字体:

             mIatDialog.setListener(mRecognizerDialogListener);
                mIatDialog.show();
                showTip(getString(R.string.text_begin));
            //获取字体所在的控件,设置为"",隐藏字体,
            TextView txt = (TextView)mIatDialog.getWindow().getDecorView().findViewWithTag("textlink");
            txt.setText("");

    
    
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

这里写图片描述

重写修改字体效果:

                mIatDialog.setListener(mRecognizerDialogListener);
                mIatDialog.show();
                showTip(getString(R.string.text_begin));
            // 也可改写成自己想要的字体效果,重写字体的点击事件
            TextView txt = (TextView)mIatDialog.getWindow().getDecorView().findViewWithTag("textlink");
            txt.setText("xxxxxxxxxx");
            txt.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                   //点击后想做的事件
                }
            });

    
    
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

这里写图片描述

2.isShowDialog为false

当isShowDialog为false时,完全抛开官方RecognizerDialog,自定义dialog,在听写监听器RecognizerListener中处理显示或隐藏自定义dialog逻辑。

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

    @Override
    public void onBeginOfSpeech() {
        // 此回调表示:sdk内部录音机已经准备好了,用户可以开始语音输入
        showTip("开始说话");
        //显示自定义的dialog
    }

    @Override
    public void onError(SpeechError error) {
        //隐藏自定义dialog
        // Tips:
        // 错误码:10118(您没有说话),可能是录音机权限被禁,需要提示用户打开应用的录音权限。
        // 如果使用本地功能(语记)需要提示用户开启语记的录音权限。
        if(mTranslateEnable && error.getErrorCode() == 14002) {
            showTip( error.getPlainDescription(true)+"\n请确认是否已开通翻译功能" );
        } else {
            showTip(error.getPlainDescription(true));
        }
    }

    @Override
    public void onEndOfSpeech() {
        //隐藏自定义dialog
        // 此回调表示:检测到了语音的尾端点,已经进入识别过程,不再接受语音输入
        showTip("结束说话");
    }

    @Override
    public void onResult(RecognizerResult results, boolean isLast) {
        Log.d(TAG, results.getResultString());
        if( mTranslateEnable ){
            printTransResult( results );
        }else{
            printResult(results);

        }

        if (isLast) {
            // TODO 最后的结果
        }
    }

    @Override
    public void onVolumeChanged(int volume, byte[] data) {
        showTip("当前正在说话,音量大小:" + volume);
        Log.d(TAG, "返回音频数据:"+data.length);
    }

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

    
    
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64

值得一提的是,onVolumeChanged方法中会一直回调声音音量的大小,有业务需求的可以在这个方法里处理自己的逻辑。

@Override
    public void onVolumeChanged(int volume, byte[] data) {
        showTip("当前正在说话,音量大小:" + volume);
        Log.d(TAG, "返回音频数据:"+data.length);
    }

    
    
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

转自:https://blog.csdn.net/tangyayong/article/details/78925045

猜你喜欢

转载自blog.csdn.net/u013651026/article/details/80346047