Ответ голосовой службы Alexa возвращает 0 байтов для API распознавания речи V1

Я пытаюсь заставить работать API распознавания речи V1 с моим клиентом java, но мне кажется, что я что-то упустил, так как не могу получить ответ от AVS на мой запрос POST. Весь фрагмент кода показан ниже.

Надеясь, кто-то может указать на мою ошибку.

Вот основная функция для моего приложения:

public class App 
{
    private static String requestURL = "https://access-alexa-na.amazon.com/v1/avs/speechrecognizer/recognize";

public static void main( String[] args )
{
    try {

    MultipartUtility mpu = new MultipartUtility(requestURL, "UTF-8", AvsRequest.getToken(), AvsRequest.getBoundary());
        mpu.addRequestStart();
        mpu.addData("tts_hello_how_are_you_doing_today.wav");
        mpu.addRequestEnd();
        mpu.finish();
    } catch (IOException e) {
        e.printStackTrace();
    }
}
}

Это служебный метод для тела запроса:

public class AvsRequest {
private static final String BOUNDARY = "BOUNDARY1234";
private static final String BOUNDARY_DASHES = "--";
private static final String NEWLINE = "\r\n";
private static final String METADATA_CONTENT_DISPOSITION = "Content-Disposition: form-data; name=\"metadata\"";
private static final String METADATA_CONTENT_TYPE="Content-Type: application/json; charset=UTF-8";
private static final String AUDIO_CONTENT_TYPE="Content-Type: audio/L16; rate=16000; channels=1";
private static final String AUDIO_CONTENT_DISPOSITION="Content-Disposition: form-data; name=\"audio\"";

private static final String METADATA="{\"messageHeader\": {\"deviceContext\":[{\"name\":\"playbackState\", \"namespace\":\"AudioPlayer\", \"payload\":{\"streamId\":\"\", \"offsetInMilliseconds\":\"0\", \"playerActivity\":\"IDLE\"}}]},\"messageBody\": {\"profile\": \"alexa-close-talk\",\"locale\": \"en-us\",\"format\": \"audio/L16; rate=16000; channels=1\"}}";

private static final String TOKEN = "Atza|I....";

public static String getRequestStart(){

    StringBuilder str = new StringBuilder();
    str.append(BOUNDARY_DASHES);
    str.append(BOUNDARY);
    str.append(NEWLINE);
    str.append(METADATA_CONTENT_DISPOSITION);
    str.append(NEWLINE);
    str.append(METADATA_CONTENT_TYPE);
    str.append(NEWLINE);
    str.append(NEWLINE);
    str.append(METADATA);
    str.append(NEWLINE);
    str.append(NEWLINE);
    str.append(BOUNDARY_DASHES);
    str.append(BOUNDARY);
    str.append(NEWLINE);
    str.append(AUDIO_CONTENT_DISPOSITION);
    str.append(NEWLINE);
    str.append(AUDIO_CONTENT_TYPE);
    str.append(NEWLINE);

    return str.toString();
}

public static String getRequestEnd(){

    StringBuilder str = new StringBuilder();
    str.append(NEWLINE);
    str.append(NEWLINE);
    str.append(BOUNDARY_DASHES);
    str.append(BOUNDARY);
    str.append(BOUNDARY_DASHES);
    str.append(NEWLINE);

    return str.toString();
}

public static String getBoundary() {
    return BOUNDARY;
}

public static String getToken() {
    return TOKEN;
}
}

И это класс запроса Multipart:

public class MultipartUtility {

private HttpURLConnection httpConn;
private String charset;
private OutputStream outputStream;
private PrintWriter writer;
private String oauth2Token;
private URL url;


public MultipartUtility(String requestURL, String charset, String token, String boundary) throws IOException {


    this.charset = charset;
    this.oauth2Token = token;
    this.url = new URL(requestURL);

    httpConn = (HttpURLConnection) url.openConnection();
    httpConn.setDoOutput(true);
    httpConn.setRequestProperty("Authorization", "Bearer " +token);
    httpConn.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + boundary);

    outputStream = httpConn.getOutputStream();
    writer = new PrintWriter(new OutputStreamWriter(outputStream, charset),false);

}

public void addRequestStart(){
writer.append(AvsRequest.getRequestStart());
writer.append("Content-Transfer-Encoding: binary").append("\r\n");
    System.out.println("POST REQUEST START: \n" + AvsRequest.getRequestStart());

}    

public void addData(String fileName) throws IOException{
    FileInputStream inputStream = new FileInputStream(fileName);
    byte[] buffer = new byte[4096];
    int bytesRead = -1;
    while ((bytesRead = inputStream.read(buffer)) != -1) {
        writer.write(buffer.toString());
    }
    writer.flush();
    inputStream.close();
}



public void addRequestEnd(){

writer.append(AvsRequest.getRequestEnd());
System.out.println("POST REQUEST END: " +AvsRequest.getRequestEnd());
writer.flush();
writer.close();
}

public void finish1() throws IOException {
    InputStream response = null;
    try {
    writer.close();
    response = httpConn.getInputStream();
    System.out.println("Response Size:\n"+ response.available());
    OutputStream fos = new FileOutputStream(new File("response.txt"));
    BufferedReader reader = new BufferedReader(new InputStreamReader(response));
    String line = null;
            while ((line = reader.readLine()) != null) {
            fos.write(line.getBytes());
            fos.flush();
        }
        reader.close();
        fos.close();
        httpConn.disconnect();

} catch (IOException e) {
    e.printStackTrace();
}
}
}

1 ответ

Я получил аналогичный результат при отправке аудиоформата, который не подходит для сервиса голосовой почты Alexa. При тестировании аудиофайла, отправляемого на https, я использовал Audacity для форматирования и тестирования аудио в моно и 16000 Гц, которые затем вернули правильный ответ. Отправка аудио в стерео, похоже, возвращает нулевой результат.

Другие вопросы по тегам