如何在Android SDK 26中将录制的音频发送至微软说话人识别API?
解决Android SDK 26下调用微软说话人识别API的问题
我懂你现在的困扰——试了一堆方案要么过时失效,要么在Android SDK 26环境下跑不起来。先看你贴的示例代码,它是基于Java SE的HttpClient实现,但Android SDK 26开始已经弃用了Apache的HttpClient,改用HttpURLConnection或者更推荐的OkHttp这类第三方库,这大概率是你卡壳的核心原因。
下面给你几个适配SDK 26的可行方案:
方案1:用Android原生HttpURLConnection
这是系统内置的网络工具类,不用额外加依赖,适配性拉满。给你一个简化的识别请求示例:
import java.io.OutputStream; import java.net.HttpURLConnection; import java.net.URL; public class SpeakerRecognitionHelper { private static final String API_KEY = "你的API密钥"; private static final String PROFILE_ID = "你的识别配置文件ID"; private static final String API_URL = "https://westus.api.cognitive.microsoft.com/spid/v1.0/identificationProfiles/" + PROFILE_ID + "/identify"; public void callSpeakerRecognitionAPI(byte[] audioData) { // 网络请求不能放主线程,这里用子线程处理 new Thread(() -> { try { URL url = new URL(API_URL); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setRequestMethod("POST"); // 必须携带的API密钥头 conn.setRequestProperty("Ocp-Apim-Subscription-Key", API_KEY); // 音频格式要和你上传的文件匹配,这里是16kHz的PCM编码WAV conn.setRequestProperty("Content-Type", "audio/wav; codecs=audio/pcm; samplerate=16000"); conn.setDoOutput(true); OutputStream os = conn.getOutputStream(); os.write(audioData); os.flush(); os.close(); int responseCode = conn.getResponseCode(); // 这里可以读取输入流解析返回的识别结果 // ... conn.disconnect(); } catch (Exception e) { e.printStackTrace(); } }).start(); } }
方案2:用OkHttp库(更推荐)
OkHttp是Square推出的高效网络库,比HttpURLConnection更易用,性能也更好。首先在Module级别的build.gradle里加依赖:
dependencies { // 选一个适配SDK 26的版本,这里用4.12.0做示例 implementation 'com.squareup.okhttp3:okhttp:4.12.0' }
然后写调用代码:
import okhttp3.MediaType; import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.RequestBody; import okhttp3.Response; import java.io.IOException; public class SpeakerRecognitionOkHttpHelper { private static final String API_KEY = "你的API密钥"; private static final String PROFILE_ID = "你的识别配置文件ID"; private static final String API_URL = "https://westus.api.cognitive.microsoft.com/spid/v1.0/identificationProfiles/" + PROFILE_ID + "/identify"; private static final MediaType AUDIO_WAV = MediaType.parse("audio/wav; codecs=audio/pcm; samplerate=16000"); private OkHttpClient client = new OkHttpClient(); public void callAPI(byte[] audioData) { RequestBody body = RequestBody.create(audioData, AUDIO_WAV); Request request = new Request.Builder() .url(API_URL) .post(body) .addHeader("Ocp-Apim-Subscription-Key", API_KEY) .build(); // OkHttp自带异步回调,不用自己开线程 client.newCall(request).enqueue(new okhttp3.Callback() { @Override public void onFailure(okhttp3.Call call, IOException e) { e.printStackTrace(); } @Override public void onResponse(okhttp3.Call call, Response response) throws IOException { if (response.isSuccessful()) { String responseBody = response.body().string(); // 解析识别结果 // ... } response.close(); } }); } }
几个关键注意点
- 权限配置:一定要在
AndroidManifest.xml里加网络权限:<uses-permission android:name="android.permission.INTERNET" /> - 音频格式匹配:微软API对
Content-Type要求很严,必须和你上传的音频采样率、编码格式完全对应,不然会直接返回错误。 - 异步处理:Android绝对不允许在主线程发网络请求,不管用哪种方案都要确保请求在子线程或者异步回调里执行,避免ANR。
如果还有具体的错误日志或者细节问题,随时补充就行~
内容的提问来源于stack exchange,提问作者Vijayendra Mishra
相关产品推荐
相关产品推荐

