共计 3786 个字符,预计需要花费 10 分钟才能阅读完成。
背景痛点
当我们在 Android Studio 中集成百度语音识别 AIP 时,经常会遇到 Key 获取失败的问题。Logcat 中常见的错误信息包括:

- “KEY 认证失败 ”
- “282004: auth check failed”
- “ 获取 token 失败 ”
这个问题会导致语音识别功能完全无法使用,严重影响开发进度和产品上线时间。很多开发者花费大量时间反复检查代码却找不到原因,这主要是因为没有系统性地理解百度语音 SDK 的密钥验证机制。
技术分析
1. 百度语音 SDK 密钥验证机制
百度语音 SDK 采用双重验证机制:
- 首先验证应用的包名和签名是否与百度开放平台注册的一致
- 然后验证 API Key(AK) 和 Secret Key(SK) 的正确性
这两个验证环节任何一个出错都会导致 ”KEY 认证失败 ” 的错误。
2. Android Manifest 配置要求
完整的配置需要包含以下内容:
<manifest>
<!-- 必要权限 -->
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<application>
<!-- 百度语音 API Key 配置 -->
<meta-data
android:name="com.baidu.speech.APP_ID"
android:value="你的 APP_ID" />
<meta-data
android:name="com.baidu.speech.API_KEY"
android:value="你的 API_KEY" />
<meta-data
android:name="com.baidu.speech.SECRET_KEY"
android:value="你的 SECRET_KEY" />
</application>
</manifest>
3. 网络连接安全性
从 Android 9(Pie) 开始,默认禁止 HTTP 明文传输。如果您的应用需要兼容 HTTP,需要在 res/xml/network_security_config.xml 中添加配置:
<network-security-config>
<domain-config cleartextTrafficPermitted="true">
<domain includeSubdomains="true">baidu.com</domain>
</domain-config>
</network-security-config>
然后在 AndroidManifest.xml 中引用此配置:
<application
android:networkSecurityConfig="@xml/network_security_config"
...>
解决方案
1. 正确的 AK/SK 配置方式
Java 版本初始化代码
import com.baidu.aip.speech.AipSpeech;
public class BaiduSpeechHelper {
private static final String APP_ID = "你的 APP_ID";
private static final String API_KEY = "你的 API_KEY";
private static final String SECRET_KEY = "你的 SECRET_KEY";
private static AipSpeech client;
public static AipSpeech getClient() {if (client == null) {synchronized (BaiduSpeechHelper.class) {if (client == null) {client = new AipSpeech(APP_ID, API_KEY, SECRET_KEY);
// 可选:设置网络连接参数
client.setConnectionTimeoutInMillis(5000);
client.setSocketTimeoutInMillis(60000);
}
}
}
return client;
}
}
Kotlin 版本初始化代码
import com.baidu.aip.speech.AipSpeech
object BaiduSpeechHelper {
private const val APP_ID = "你的 APP_ID"
private const val API_KEY = "你的 API_KEY"
private const val SECRET_KEY = "你的 SECRET_KEY"
private var client: AipSpeech? = null
fun getClient(): AipSpeech {return client ?: synchronized(this) {client ?: AipSpeech(APP_ID, API_KEY, SECRET_KEY).apply {
// 可选:设置网络连接参数
setConnectionTimeoutInMillis(5000)
setSocketTimeoutInMillis(60000)
client = this
}
}
}
}
2. 关键日志调试方法
在初始化代码后添加调试日志:
// 设置调试日志
client.setDebugLog(true);
// 或者手动打印 auth 信息
Map<String, Object> authInfo = client.auth();
Log.d("BaiduSpeech", "Auth Info:" + authInfo.toString());
避坑指南
1. 混淆规则配置
在 proguard-rules.pro 中添加:
-keep class com.baidu.aip.** {*;}
-keep class com.baidu.speech.** {*;}
2. 多 Flavor 构建配置
如果你的项目有多个 productFlavor,需要确保每个 flavor 的包名和签名都与百度开放平台注册的一致。可以在 build.gradle 中动态配置:
android {
productFlavors {
dev {
manifestPlaceholders = [
BAIDU_APP_ID: "dev_app_id",
BAIDU_API_KEY: "dev_api_key",
BAIDU_SECRET_KEY: "dev_secret_key"
]
}
prod {
manifestPlaceholders = [
BAIDU_APP_ID: "prod_app_id",
BAIDU_API_KEY: "prod_api_key",
BAIDU_SECRET_KEY: "prod_secret_key"
]
}
}
}
然后在 AndroidManifest.xml 中使用:
<meta-data
android:name="com.baidu.speech.APP_ID"
android:value="${BAIDU_APP_ID}" />
3. 服务端 IP 白名单
在百度开放平台控制台中,确保已添加你的服务器 IP 到白名单。如果是本地调试,可以暂时将验证关闭(不推荐生产环境使用)。
验证环节
1. 单元测试代码
@Test
public void testBaiduSpeechAuth() {AipSpeech client = BaiduSpeechHelper.getClient();
Map<String, Object> result = client.asr("test.pcm", "pcm", 16000, null);
assertFalse(result.containsKey("error_code"));
assertTrue(result.containsKey("result"));
}
2. 成功日志示例
D/BaiduSpeech: Auth successful
D/BaiduSpeech: Token: 24.6c5e1ff54af3a8a3c0f7e7b6f8d5e7a.2592000.1234567890
D/BaiduSpeech: ASR result: {"result":["你好百度"],"sn":"123456789"}
常见错误码对照表
| 错误码 | 含义 | 解决方案 |
|---|---|---|
| 282004 | auth check failed | 检查 AK/SK 配置和网络连接 |
| 282005 | auth check failed, invalid params | 检查请求参数是否完整 |
| 282006 | auth check failed, invalid key | 重新生成 API Key |
| 282007 | auth check failed, invalid token | 重新获取 token |
自查清单
遇到 Key 获取失败问题时,请按以下步骤检查:
- 检查 AndroidManifest.xml 中的 meta-data 配置是否正确
- 确认包名和签名与百度开放平台注册的一致
- 检查网络连接是否正常,特别是 HTTPS 配置
- 查看 Logcat 完整日志,定位具体错误
- 在百度开放平台检查配额是否用完
- 确认服务器 IP 是否在白名单中
- 检查混淆规则是否正确配置
通过以上系统性的排查,应该能够解决绝大多数 Key 获取失败的问题。如果仍然遇到问题,建议在百度语音开发者社区提问,附上完整日志和配置信息。
正文完
