点击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);
}
}
将so文件每个包下放一下