共计 1901 个字符,预计需要花费 5 分钟才能阅读完成。
背景与痛点
语音交互已经成为移动应用的重要功能之一,尤其是在输入不便的场景下(如驾驶、双手占用等)。对于 Android 开发者来说,实现语音识别功能需要解决几个关键问题:

- 权限管理:需要动态申请录音和网络权限
- 事件监听:长按按钮的事件处理需要特别注意时间阈值
- 异步回调:语音识别结果需要通过回调处理,容易造成线程阻塞
技术选型
百度语音 SDK 相比其他方案(如讯飞)有以下优势:
- 接入简单:官方文档详细,集成步骤清晰
- 识别准确率:中文识别准确率高达 98%
- 延迟表现:平均响应时间在 800ms 左右
核心实现
长按事件监听器
button.setOnLongClickListener(v -> {
// 启动语音识别
startVoiceRecognition();
return true; // 返回 true 表示消费该事件
});
百度语音 SDK 初始化
建议将 API Key 存储在 gradle.properties 中,通过 BuildConfig 读取:
SpeechRecognizer recognizer = SpeechRecognizer.createRecognizer(
context,
new MyInitListener());
recognizer.setParameter(SpeechConstant.APP_ID, BuildConfig.BAIDU_APP_ID);
回调处理
private class MyRecognitionListener implements EventListener {
@Override
public void onEvent(String name, String params, byte[] data, int offset, int length) {// 处理识别结果}
}
完整代码示例
public class VoiceActivity extends AppCompatActivity {
private SpeechRecognizer mRecognizer;
@Override
protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button button = findViewById(R.id.btn_voice);
button.setOnLongClickListener(v -> {startVoiceRecognition();
return true;
});
}
private void startVoiceRecognition() {if (!checkPermission()) {return;}
mRecognizer = SpeechRecognizer.createRecognizer(
this,
new InitListener() {
@Override
public void onInit(int code) {if (code == ErrorCode.SUCCESS) {mRecognizer.startListening(new MyRecognitionListener());
}
}
}
);
}
}
性能优化
- 使用 AsyncTask 处理耗时操作
- 设置超时自动取消:
recognizer.setParameter(SpeechConstant.VAD, "4000"); // 4 秒无输入自动停止
避坑指南
6.1 权限申请
private boolean checkPermission() {
if (ContextCompat.checkSelfPermission(this,
Manifest.permission.RECORD_AUDIO) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this,
new String[]{Manifest.permission.RECORD_AUDIO},
REQUEST_CODE);
return false;
}
return true;
}
6.2 单例模式
建议将 SpeechRecognizer 封装为单例,避免重复创建。
6.3 离线语音包
精简离线语音包可以显著提升启动速度。
延伸思考
可以尝试实现实时语音转文字显示功能,需要修改识别模式为实时流式识别。
recognizer.setParameter(SpeechConstant.ACCEPT_AUDIO_VOLUME, "true");
通过本文的介绍,相信开发者可以快速实现长按按钮调用语音识别的功能,并避免常见的性能问题和权限陷阱。
正文完
