共计 3246 个字符,预计需要花费 9 分钟才能阅读完成。
背景痛点
语音识别在移动端的应用越来越广泛,比如语音输入、智能家居控制、语音搜索等。相比系统原生的语音识别 API,百度语音识别 SDK 有以下优势:

- 支持离线唤醒功能,即使没有网络也能使用
- 支持多种方言识别,覆盖更广泛的用户群体
- 识别准确率高,响应速度快
- 提供完善的错误码和回调机制,便于开发者处理各种异常情况
环境准备
1. 百度开发者账号创建与语音服务开通
- 访问百度 AI 开放平台(https://ai.baidu.com/)并注册账号
- 进入控制台,选择 ” 语音技术 ”-“ 语音识别 ”
- 创建应用,获取 API Key 和 Secret Key
2. Android Studio 配置
在 app/build.gradle 中添加依赖:
dependencies {
implementation 'com.baidu.aip:java-sdk:4.16.11'
// 最低支持 API Level 16
implementation 'com.squareup.okhttp3:okhttp:4.9.0' // 推荐使用 OkHttp
}
核心实现
1. AndroidManifest.xml 配置
<manifest>
<!-- 必须的权限 -->
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<!-- 如果需要使用离线功能 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
</manifest>
2. 动态权限请求
private fun checkPermissions() {
val permissions = arrayOf(
Manifest.permission.RECORD_AUDIO,
Manifest.permission.INTERNET,
Manifest.permission.ACCESS_NETWORK_STATE
)
ActivityCompat.requestPermissions(
this,
permissions.filter {ContextCompat.checkSelfPermission(this, it) != PackageManager.PERMISSION_GRANTED }.toTypedArray(),
PERMISSION_REQUEST_CODE
)
}
3. 初始化语音识别
public class SpeechRecognizerHelper {
private SpeechRecognizer mSpeechRecognizer;
public void init(Context context) {
// 1. 初始化配置
SpeechRecognitionConfig config = new SpeechRecognitionConfig()
.setApiKey("你的 API_KEY")
.setSecretKey("你的 SECRET_KEY")
.setAppId("你的 APP_ID")
.setSampleRate(SpeechRecognitionConfig.SAMPLE_RATE_16K); // 推荐 16K 采样率
// 2. 创建识别器
mSpeechRecognizer = SpeechRecognizer.createInstance(context, config);
// 3. 设置回调
mSpeechRecognizer.setEventListener(new SpeechEventListener() {
@Override
public void onEvent(String name, String params) {
// 处理识别结果
if (SpeechConstant.CALLBACK_EVENT_ASR_READY.equals(name)) {// 识别器准备就绪} else if (SpeechConstant.CALLBACK_EVENT_ASR_FINISH.equals(name)) {// 识别完成} else if (SpeechConstant.CALLBACK_EVENT_ASR_PARTIAL.equals(name)) {
// 部分识别结果
JSONObject json = new JSONObject(params);
String result = json.optString("best_result");
Log.d("SpeechResult", result);
}
}
@Override
public void onError(int errorCode, String errorMessage) {
// 处理错误
Log.e("SpeechError", "Code:" + errorCode + ", Message:" + errorMessage);
}
});
}
public void startListening() {if (mSpeechRecognizer != null) {mSpeechRecognizer.start();
}
}
public void stopListening() {if (mSpeechRecognizer != null) {mSpeechRecognizer.stop();
}
}
public void release() {if (mSpeechRecognizer != null) {mSpeechRecognizer.release();
}
}
}
避坑指南
1. 常见鉴权失败排查
- 确保 API Key、Secret Key 和 App ID 正确
- 检查网络连接是否正常
- 确认包名与百度控制台注册的一致
- 检查系统时间是否正确(误差不能超过 10 分钟)
2. 避免内存泄漏
- 在 Activity/Fragment 的 onDestroy 中调用 release()方法
- 不要长时间持有 SpeechRecognizer 实例
- 使用弱引用或 ViewModel 管理生命周期
3. 采样率选择
- 8K 采样率:文件小,适合网络条件差的情况,但识别准确率较低
- 16K 采样率:推荐使用,平衡了文件大小和识别准确率
性能优化
1. 使用 OkHttp 替换默认网络库
// 在初始化时设置
SpeechRecognitionConfig config = new SpeechRecognitionConfig()
.setNetworkLibrary(new OkHttpNetworkLibrary());
2. 静音检测 (VAD) 实现
// 在配置中启用 VAD
config.enableVAD(true)
.setVadEndWaitTime(800); // 静音 800ms 后自动停止
延伸思考
可以尝试结合 Jetpack Compose 实现更现代的语音交互 UI:
@Composable
fun VoiceButton(isListening: Boolean, onClick: () -> Unit) {
Button(
onClick = onClick,
colors = ButtonDefaults.buttonColors(backgroundColor = if (isListening) Color.Red else Color.Blue
)
) {Text(if (isListening) "停止" else "开始")
}
}
参考资源
- 百度语音识别官方文档:https://ai.baidu.com/ai-doc/SPEECH/Bk5difx01
- 最新 SDK 版本:4.16.11(2023 年更新)
- 百度语音控制台:https://console.bce.baidu.com/ai/
正文完
