Android Studio集成百度语音识别API全流程指南

一、集成前的准备工作

1.1 百度AI开放平台注册与认证

开发者需首先在百度AI开放平台完成注册,并通过实名认证。认证通过后进入”语音技术”板块,创建”语音识别”应用,获取API Key和Secret Key。这两个密钥是后续鉴权的核心凭证,需妥善保管。

1.2 Android项目基础配置

在Android Studio中创建或打开现有项目,确保minSdkVersion≥16(API 16对应Android 4.1)。在build.gradle(Module)中添加网络权限依赖:

  1. dependencies {
  2. implementation 'com.squareup.okhttp3:okhttp:4.9.1' // 网络请求库
  3. implementation 'org.json:json:20231013' // JSON解析库
  4. }

同步Gradle后,在AndroidManifest.xml中添加必要权限:

  1. <uses-permission android:name="android.permission.INTERNET" />
  2. <uses-permission android:name="android.permission.RECORD_AUDIO" />
  3. <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

二、核心集成步骤

2.1 鉴权参数生成

百度语音识别API采用AK/SK鉴权机制,需通过以下代码生成访问令牌:

  1. public class AuthUtil {
  2. private static final String API_KEY = "your_api_key";
  3. private static final String SECRET_KEY = "your_secret_key";
  4. public static String getAccessToken() throws Exception {
  5. OkHttpClient client = new OkHttpClient();
  6. Request request = new Request.Builder()
  7. .url("https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials" +
  8. "&client_id=" + API_KEY +
  9. "&client_secret=" + SECRET_KEY)
  10. .build();
  11. try (Response response = client.newCall(request).execute()) {
  12. JSONObject json = new JSONObject(response.body().string());
  13. return json.getString("access_token");
  14. }
  15. }
  16. }

建议将此方法封装为异步任务,避免阻塞主线程。

2.2 语音数据采集

使用MediaRecorderAudioRecord实现录音功能,推荐采用PCM格式:

  1. public class AudioRecorder {
  2. private static final int SAMPLE_RATE = 16000; // 百度推荐采样率
  3. private static final int CHANNEL_CONFIG = AudioFormat.CHANNEL_IN_MONO;
  4. private static final int AUDIO_FORMAT = AudioFormat.ENCODING_PCM_16BIT;
  5. private AudioRecord recorder;
  6. private boolean isRecording = false;
  7. public void startRecording(File outputFile) throws IOException {
  8. int bufferSize = AudioRecord.getMinBufferSize(
  9. SAMPLE_RATE, CHANNEL_CONFIG, AUDIO_FORMAT);
  10. recorder = new AudioRecord(
  11. MediaRecorder.AudioSource.MIC,
  12. SAMPLE_RATE,
  13. CHANNEL_CONFIG,
  14. AUDIO_FORMAT,
  15. bufferSize);
  16. recorder.startRecording();
  17. isRecording = true;
  18. new Thread(() -> {
  19. byte[] buffer = new byte[bufferSize];
  20. try (FileOutputStream fos = new FileOutputStream(outputFile)) {
  21. while (isRecording) {
  22. int read = recorder.read(buffer, 0, bufferSize);
  23. if (read > 0) fos.write(buffer, 0, read);
  24. }
  25. } catch (IOException e) {
  26. e.printStackTrace();
  27. }
  28. }).start();
  29. }
  30. public void stopRecording() {
  31. if (recorder != null) {
  32. isRecording = false;
  33. recorder.stop();
  34. recorder.release();
  35. recorder = null;
  36. }
  37. }
  38. }

2.3 API调用实现

百度语音识别支持多种方式,推荐使用WebSocket长连接实现实时识别:

  1. public class SpeechRecognizer {
  2. private static final String WEBSOCKET_URL = "wss://vop.baidu.com/ws_speech?token=";
  3. public interface RecognitionListener {
  4. void onResult(String text);
  5. void onError(int code, String message);
  6. }
  7. public void recognize(File audioFile, RecognitionListener listener) {
  8. new Thread(() -> {
  9. try {
  10. String token = AuthUtil.getAccessToken();
  11. OkHttpClient client = new OkHttpClient.Builder()
  12. .pingInterval(30, TimeUnit.SECONDS)
  13. .build();
  14. Request request = new Request.Builder()
  15. .url(WEBSOCKET_URL + token)
  16. .build();
  17. WebSocket webSocket = client.newWebSocket(request, new WebSocketListener() {
  18. @Override
  19. public void onOpen(WebSocket webSocket, Response response) {
  20. // 发送配置信息
  21. String config = "{\"format\":\"pcm\",\"rate\":16000,\"channel\":1,\"cuid\":\"android_device\"}";
  22. webSocket.send(config);
  23. // 发送音频数据
  24. try (FileInputStream fis = new FileInputStream(audioFile)) {
  25. byte[] buffer = new byte[1024];
  26. int bytesRead;
  27. while ((bytesRead = fis.read(buffer)) != -1) {
  28. webSocket.send(Base64.encodeToString(buffer, 0, bytesRead, Base64.NO_WRAP));
  29. }
  30. webSocket.send(new byte[0]); // 结束标记
  31. } catch (IOException e) {
  32. listener.onError(500, "Audio send failed");
  33. }
  34. }
  35. @Override
  36. public void onMessage(WebSocket webSocket, String text) {
  37. try {
  38. JSONObject json = new JSONObject(text);
  39. if (json.has("result")) {
  40. String result = json.getJSONArray("result").getString(0);
  41. listener.onResult(result);
  42. }
  43. } catch (JSONException e) {
  44. e.printStackTrace();
  45. }
  46. }
  47. @Override
  48. public void onFailure(WebSocket webSocket, Throwable t, Response response) {
  49. listener.onError(400, t.getMessage());
  50. }
  51. });
  52. } catch (Exception e) {
  53. listener.onError(500, e.getMessage());
  54. }
  55. }).start();
  56. }
  57. }

三、优化与调试技巧

3.1 性能优化策略

  1. 音频预处理:使用AudioTrack进行降噪处理,提升识别准确率
  2. 网络优化:设置合理的超时时间(建议15秒),添加重试机制
  3. 内存管理:采用流式传输避免大文件内存溢出

3.2 常见问题解决方案

问题现象 可能原因 解决方案
401未授权 无效token 检查API Key/Secret Key是否正确
413请求体过大 音频过长 限制单次识别时长(建议≤60秒)
504网关超时 网络不稳定 检查网络连接,增加重试次数
无识别结果 音频质量差 确保采样率16kHz,16位单声道

3.3 高级功能扩展

  1. 离线命令词识别:下载离线引擎包,支持本地识别
  2. 实时转写:通过WebSocket实现边录音边识别
  3. 多语言支持:在请求头中添加"language":"zh-CN"等参数

四、最佳实践建议

  1. 权限动态申请:Android 6.0+需动态申请录音权限
  2. 错误处理机制:建立完善的错误码映射表
  3. 日志记录:记录关键节点日志便于问题排查
  4. 资源释放:确保WebSocket、AudioRecord等资源及时释放

五、完整调用示例

  1. // 1. 初始化录音
  2. AudioRecorder recorder = new AudioRecorder();
  3. File audioFile = new File(getExternalCacheDir(), "temp.pcm");
  4. // 2. 开始录音
  5. recorder.startRecording(audioFile);
  6. // 3. 延迟3秒后停止(模拟用户说话)
  7. new Handler(Looper.getMainLooper()).postDelayed(() -> {
  8. recorder.stopRecording();
  9. // 4. 调用语音识别
  10. SpeechRecognizer recognizer = new SpeechRecognizer();
  11. recognizer.recognize(audioFile, new SpeechRecognizer.RecognitionListener() {
  12. @Override
  13. public void onResult(String text) {
  14. runOnUiThread(() -> tvResult.setText("识别结果:" + text));
  15. }
  16. @Override
  17. public void onError(int code, String message) {
  18. runOnUiThread(() -> tvResult.setText("错误:" + code + " - " + message));
  19. }
  20. });
  21. }, 3000);

通过以上步骤,开发者可以在Android Studio中完整实现百度语音识别API的集成。实际开发中需根据具体场景调整参数配置,并做好异常处理和资源管理。建议参考百度语音识别官方文档获取最新技术信息。