2017-01-15 7 views
1

Я пытаюсь получить API-речевой указатель V1, работающий с моим java-клиентом, но я думаю, что у меня что-то не хватает, поскольку я не могу получить ответ от AVS для моего запроса POST , Ниже приведен фрагмент кода.Ответ Alexa Voice Service возвращает 0 байт для API-речевого распознавателя V1

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

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

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; 
} 
} 

И это многосекционный класс запроса:

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(); 
} 
} 
} 

ответ

0

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

 Смежные вопросы

  • Нет связанных вопросов^_^