有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

wav Microsoft CognitiveSpeaker使用Java识别BadRequst

我只是在和认知说话者玩认知游戏,试图注册一个新用户。为此,我遵循了Microsoft API Reference的示例。遗憾的是,我得到了一个错误响应:

{
  "error": {
    "code": "BadRequest",
    "message": "Invalid Audio Format: Not a WAVE file - no RIFF header"
  }
}

我花了很多时间在谷歌上搜索这个问题,在githubStackOverflow上找到了一些相关的东西。不幸的是,我无法适应github的答案(他们通过一个较长的音频示例解决了这个问题,我尝试了,但仍然得到了错误响应)。有人能找出我做错了什么吗?感谢阅读:)这是我的代码:

 public static void main(String[] args) {
        HttpClient httpclient = HttpClients.createDefault();

        try {
            URIBuilder builder = new URIBuilder("https://api.projectoxford.ai/spid/v1.0/identificationProfiles/{PROFIL}/enroll");

            URI uri = builder.build();
            HttpPost request = new HttpPost(uri);
            request.setHeader("Content-Type", "multipart/form-data");
            request.setHeader("Ocp-Apim-Subscription-Key", "API_KEY");

            FileInputStream someStream = new FileInputStream(new File("test.wav"));
            ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
            int bytesRead;
            byte[] bytes = new byte[1024];
            while ((bytesRead = someStream.read(bytes)) > 0) {
                byteArrayOutputStream.write(bytes, 0, bytesRead);
            }
            byte[] data = byteArrayOutputStream.toByteArray();

            MultipartEntityBuilder entityBuilder = MultipartEntityBuilder.create();
            entityBuilder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);
            entityBuilder.setStrictMode();
            entityBuilder.addBinaryBody("enrollmentData", data, ContentType.MULTIPART_FORM_DATA, "test.wav");
            request.setEntity(entityBuilder.build());

            HttpResponse response = httpclient.execute(request);
            HttpEntity entity = response.getEntity();

            if (entity != null) {
                System.out.println(EntityUtils.toString(entity));
            }
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
    }

编辑:您可以在这里下载文件test.wav


共 (1) 个答案

  1. # 1 楼答案

    我认为这个服务的多部分表单数据处理是非标准的,这可能是一个缺陷。无论哪种方式,由于您只有一种有效负载类型,您应该只执行以下操作:

    request.setEntity(
        new FileEntity(new File("test.wav"), ContentType.APPLICATION_OCTET_STREAM));
    

    添加完整的Java,反映更新的端点:

    import org.apache.http.HttpEntity;
    import org.apache.http.HttpResponse;
    import org.apache.http.client.HttpClient;
    import org.apache.http.client.methods.HttpPost;
    import org.apache.http.client.utils.URIBuilder;
    import org.apache.http.entity.ContentType;
    import org.apache.http.entity.FileEntity;
    import org.apache.http.impl.client.HttpClients;
    import java.io.File;
    import java.net.URI;
    
    public class EnrollSpeaker {
        static String API_KEY = "YOUR-KEY";
        static String PROFILE_ID = "YOUR-PROFILE-ID";
        static String LOCATION = "westus"; // Check, might be different in the future 
    
        public static void main(String[] args) {
            HttpClient httpclient = HttpClients.createDefault();
    
            try {
                URIBuilder builder = new URIBuilder(
                    String.format("https://%s.api.cognitive.microsoft.com/spid/v1.0/identificationProfiles/%s/enroll", LOCATION, PROFILE_ID));
                URI uri = builder.build();
                HttpPost request = new HttpPost(uri);
                request.setHeader("Ocp-Apim-Subscription-Key", API_KEY);
                request.setEntity(new FileEntity(new File("test.wav"), ContentType.APPLICATION_OCTET_STREAM));
    
                HttpResponse response = httpclient.execute(request);
                HttpEntity entity = response.getEntity();
    
                // Response is empty on success; the following will contain the URI where you can check the status
                System.out.println(response.getHeaders("Operation-Location")[0].getValue());
            } catch (Exception e) {
                System.out.println(e.getMessage());
            }
        }
    }