You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 11:08:17