RecognitionListener 没有起作用,所有回调函数都一直没有执行
doctorkaobo 发布于2016-01 浏览:2552 回复:1
0
收藏

点击btn后,执行了start启动了录音,然后说话,但是 RecognitionListener没有起作用,所有回调函数都一直没有执行
public class ApiHandtongueActivity extends Activity implements RecognitionListener {

    private static final String TAG = "ApiHandtongueActivity";

    

    private SpeechRecognizer speechRecognizer;

    

    private Button btn;

    private Button setting;


    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);


        setContentView(R.layout.sdk2_apihandtongue);


        setting = (Button) findViewById(R.id.setting);

        setting.setOnClickListener(new View.OnClickListener() {

            @Override

            public void onClick(View v) {

                stop();

            }

        });

        speechRecognizer = SpeechRecognizer.createSpeechRecognizer(this, new ComponentName(this, VoiceRecognitionService.class));

        speechRecognizer.setRecognitionListener(this);


        btn = (Button) findViewById(R.id.btn);

        btn.setOnClickListener(new View.OnClickListener() {

            @Override

            public void onClick(View v) {

                start();

            }

        });

    }



    @Override

    protected void onDestroy() {

        speechRecognizer.destroy();

        super.onDestroy();

    }


    @Override

    protected void onActivityResult(int requestCode, int resultCode, Intent data) {

        super.onActivityResult(requestCode, resultCode, data);

        if (resultCode == RESULT_OK) {

            onResults(data.getExtras());

        }

    }


    public void bindParams(Intent intent) {

intent.putExtra("sample", 16000); // 离线仅支持 16000 采样率

intent.putExtra("language", "cmn-Hans-CN"); // 离线仅支持中文普通话

intent.putExtra("prop", 20000); // 输入


        SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this);

        if (sp.getBoolean("tips_sound", true)) {

            intent.putExtra(Constant.EXTRA_SOUND_START, R.raw.bdspeech_recognition_start);

            intent.putExtra(Constant.EXTRA_SOUND_END, R.raw.bdspeech_speech_end);

            intent.putExtra(Constant.EXTRA_SOUND_SUCCESS, R.raw.bdspeech_recognition_success);

            intent.putExtra(Constant.EXTRA_SOUND_ERROR, R.raw.bdspeech_recognition_error);

            intent.putExtra(Constant.EXTRA_SOUND_CANCEL, R.raw.bdspeech_recognition_cancel);

        }

        if (sp.contains(Constant.EXTRA_INFILE)) {

            String tmp = sp.getString(Constant.EXTRA_INFILE, "").replaceAll(",.*", "").trim();

            intent.putExtra(Constant.EXTRA_INFILE, tmp);

        }

        if (sp.getBoolean(Constant.EXTRA_OUTFILE, false)) {

            intent.putExtra(Constant.EXTRA_OUTFILE, "/storage/sdcard1/outfile.pcm");

        }

        if (sp.contains(Constant.EXTRA_SAMPLE)) {

            String tmp = sp.getString(Constant.EXTRA_SAMPLE, "").replaceAll(",.*", "").trim();

            if (null != tmp && !"".equals(tmp)) {

                intent.putExtra(Constant.EXTRA_SAMPLE, Integer.parseInt(tmp));

            }

        }

        if (sp.contains(Constant.EXTRA_LANGUAGE)) {

            String tmp = sp.getString(Constant.EXTRA_LANGUAGE, "").replaceAll(",.*", "").trim();

            if (null != tmp && !"".equals(tmp)) {

                intent.putExtra(Constant.EXTRA_LANGUAGE, tmp);

            }

        }

        if (sp.contains(Constant.EXTRA_NLU)) {

            String tmp = sp.getString(Constant.EXTRA_NLU, "").replaceAll(",.*", "").trim();

            if (null != tmp && !"".equals(tmp)) {

                intent.putExtra(Constant.EXTRA_NLU, tmp);

            }

        }


        if (sp.contains(Constant.EXTRA_VAD)) {

            String tmp = sp.getString(Constant.EXTRA_VAD, "").replaceAll(",.*", "").trim();

            if (null != tmp && !"".equals(tmp)) {

                intent.putExtra(Constant.EXTRA_VAD, tmp);

            }

        }

        String prop = null;

        if (sp.contains(Constant.EXTRA_PROP)) {

            String tmp = sp.getString(Constant.EXTRA_PROP, "").replaceAll(",.*", "").trim();

            if (null != tmp && !"".equals(tmp)) {

                intent.putExtra(Constant.EXTRA_PROP, Integer.parseInt(tmp));

                prop = tmp;

            }

        }


        // offline asr

        {

            intent.putExtra(Constant.EXTRA_OFFLINE_ASR_BASE_FILE_PATH, "/storage/sdcard1/easr/s_1");

            intent.putExtra(Constant.EXTRA_LICENSE_FILE_PATH, "/storage/sdcard1/easr/temp_license_2016-01-23");

            if (null != prop) {

                int propInt = Integer.parseInt(prop);

                if (propInt == 10060) {

                    intent.putExtra(Constant.EXTRA_OFFLINE_LM_RES_FILE_PATH, "/storage/sdcard1/easr/s_2_Navi");

                } else if (propInt == 20000) {

                    intent.putExtra(Constant.EXTRA_OFFLINE_LM_RES_FILE_PATH, "/storage/sdcard1/easr/s_2_InputMethod");

                }

            }

            intent.putExtra(Constant.EXTRA_OFFLINE_SLOT_DATA, buildTestSlotData());

        }

    }


    private String buildTestSlotData() {

        JSONObject slotData = new JSONObject();

        JSONArray name = new JSONArray().put("李涌泉").put("郭下纶");

        JSONArray song = new JSONArray().put("七里香").put("发如雪");

        JSONArray artist = new JSONArray().put("周杰伦").put("李世龙");

        JSONArray app = new JSONArray().put("手机百度").put("百度地图");

        JSONArray usercommand = new JSONArray().put("关灯").put("开门");

        try {

            slotData.put(Constant.EXTRA_OFFLINE_SLOT_NAME, name);

            slotData.put(Constant.EXTRA_OFFLINE_SLOT_SONG, song);

            slotData.put(Constant.EXTRA_OFFLINE_SLOT_ARTIST, artist);

            slotData.put(Constant.EXTRA_OFFLINE_SLOT_APP, app);

            slotData.put(Constant.EXTRA_OFFLINE_SLOT_USERCOMMAND, usercommand);

        } catch (JSONException e) {


        }

        return slotData.toString();

    }


    private void start() {

        print("点击了“开始”");

        Intent intent = new Intent();

        bindParams(intent);

        intent.putExtra("vad", "search");

        speechRecognizer.startListening(intent);

    }


    private void stop() {

        speechRecognizer.stopListening();

        print("点击了“说完了”");

    }


    private void cancel() {

        speechRecognizer.cancel();

        print("点击了“取消”");

    }


    @Override

    public void onReadyForSpeech(Bundle params) {

        print("准备就绪,可以开始说话");

    }


    @Override

    public void onBeginningOfSpeech() {

        print("检测到用户的已经开始说话");

    }


    @Override

    public void onRmsChanged(float rmsdB) {


    }


    @Override

    public void onBufferReceived(byte[] buffer) {


    }


    @Override

    public void onEndOfSpeech() {

        print("检测到用户的已经停止说话");

    }


    @Override

    public void onError(int error) {

        status = STATUS_None;

        StringBuilder sb = new StringBuilder();

        switch (error) {

            case SpeechRecognizer.ERROR_AUDIO:

                sb.append("音频问题");

                break;

            case SpeechRecognizer.ERROR_SPEECH_TIMEOUT:

                sb.append("没有语音输入");

                break;

            case SpeechRecognizer.ERROR_CLIENT:

                sb.append("其它客户端错误");

                break;

            case SpeechRecognizer.ERROR_INSUFFICIENT_PERMISSIONS:

                sb.append("权限不足");

                break;

            case SpeechRecognizer.ERROR_NETWORK:

                sb.append("网络问题");

                break;

            case SpeechRecognizer.ERROR_NO_MATCH:

                sb.append("没有匹配的识别结果");

                break;

            case SpeechRecognizer.ERROR_RECOGNIZER_BUSY:

                sb.append("引擎忙");

                break;

            case SpeechRecognizer.ERROR_SERVER:

                sb.append("服务端错误");

                break;

            case SpeechRecognizer.ERROR_NETWORK_TIMEOUT:

                sb.append("连接超时");

                break;

        }

        sb.append(":" + error);

        print("识别失败:" + sb.toString());

    }


    @Override

    public void onResults(Bundle results) {

        ArrayList nbest = results.getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION);

        print("识别成功:" + Arrays.toString(nbest.toArray(new String[nbest.size()])));

        String json_res = results.getString("origin_result");

        try {

            print("origin_result=\n" + new JSONObject(json_res).toString(4));

        } catch (Exception e) {

            print("origin_result=[warning: bad json]\n" + json_res);

        }

        start();

    }


    @Override

    public void onPartialResults(Bundle partialResults) {

        ArrayList nbest = partialResults.getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION);

        if (nbest.size() > 0) {

            print("~临时识别结果:" + Arrays.toString(nbest.toArray(new String[0])));

        }

    }


    @Override

    public void onEvent(int eventType, Bundle params) {

        switch (eventType) {

            case EVENT_ERROR:

                String reason = params.get("reason") + "";

                print("EVENT_ERROR, " + reason);

                break;

            case VoiceRecognitionService.EVENT_ENGINE_SWITCH:

                int type = params.getInt("engine_type");

                print("*引擎切换至" + (type == 0 ? "在线" : "离线"));

                break;

        }

    }


    private void print(String msg) {

        Log.d(TAG, "----" + msg);

    }

}


收藏
点赞
0
个赞
共1条回复 最后由用户已被禁言回复于2022-04
#2睿米开发回复于2016-01

将so文件每个包下放一下

0
TOP
切换版块