Android Studio中文语音识别文本匹配变色异常问题求助
问题解决:语音识别对比后文本始终显示红色
核心错误点
- 调用时机错误:点击麦克风按钮时,你先调用
speak()启动语音识别(这是异步操作,不会立刻返回结果),紧接着就调用checkIfCorrect(),此时语音识别结果还未写入mTextView,比较的是旧数据,必然不匹配。 - 文本获取错误:
checkIfCorrect()中用input.toString()和mTextView.toString()获取的是TextView对象的字符串表示,不是控件上显示的文本内容,应该用getText().toString()。
修改后的代码
public class SpeakingActivity extends AppCompatActivity { private static final int REQUEST_CODE_SPEECH_INPUT = 1000; TextView mTextView; TextView input; ImageButton mImageButton; Button button; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.speakingfromhome); button = findViewById(R.id.nextSpeaking); mTextView = findViewById(R.id.output); mImageButton = findViewById(R.id.image); input = findViewById(R.id.input); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { changeQuestions(); mTextView.setTextColor(Color.BLACK); } }); mImageButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { speak(); // 移除此处的checkIfCorrect()调用,移到语音识别结果返回后执行 } }); } private void checkIfCorrect() { // 改为获取控件的文本内容进行比较 if (input.getText().toString().equals(mTextView.getText().toString())) mTextView.setTextColor(Color.GREEN); else mTextView.setTextColor(Color.RED); } private void changeQuestions() { input.setText("基辅"); } private void speak() { Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH); intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, RecognizerIntent.LANGUAGE_MODEL_FREE_FORM); intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE, Locale.CHINA.toString()); try { startActivityForResult(intent, REQUEST_CODE_SPEECH_INPUT); } catch (Exception ex) { Toast.makeText(this, "" + ex.getMessage(), Toast.LENGTH_SHORT).show(); } } @Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); switch (requestCode) { case REQUEST_CODE_SPEECH_INPUT: { if (resultCode == RESULT_OK && null != data) { ArrayList<String> result = data.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS); mTextView.setText(result.get(0)); // 语音识别结果返回后,再执行对比逻辑 checkIfCorrect(); } break; } } } }
额外优化建议
- 可以给文本添加
trim()处理,避免语音识别返回的文本带首尾空格导致匹配失败。 - 若语音识别返回多个候选结果,可尝试匹配前2-3个结果,提升识别容错率。
内容的提问来源于stack exchange,提问作者Jugjin
相关产品推荐
相关产品推荐

