2014-12-15 3 views
0

Я хочу использовать сервис Google Text-To-Speech в Twilio.Как интегрировать Google Text-To-Speech в Twilio (или URL с '&' в теге XML)

Я создал URL с несколькими параметрами, разделенными амперсандами (&).
Для примера: http://translate.google.com/translate_tts?ie=UTF-8&q=Hello%20World&tl=en-us

Проблема: когда я пытаюсь поставить этот URL в TwiML тег, у меня есть исключение, написанное ниже:

Ошибка в строке 1 документа: Ссылка на сущность «д «должно закончиться»; разделитель. Убедитесь, что тело ответа является действительным XML-документом.

Это TwiML:

<Response> 
    <Play>http://translate.google.com/translate_tts?ie=UTF-8&q=Hello%20World&tl=en-us</Play> 
</Response> 

Solutions, что я уже пробовал:

1) Заменить & с &amp;
Это не помогло мне. В этом случае я получил другое исключение: вернул код статуса HTTP 404. Посмотрите, как Twilio не декодирует &amp; назад &.

2) Сохраните вывод Google в файл на сервере и поместите прямую ссылку на этот файл (без каких-либо &). Он должен работать, но он выглядит как грязный hack =)

ответ

1

Хорошо, я решил эту проблему по третьему пути:

Я сделал «прокси» сервлет для сокрытия всех параметров, что необходимое для Google TTS Engine, внутри этого сервлета. Проще демонстрировать код:

Я поместил URL-адрес моего сервлета-прокси (вместо URL-адреса Google TTS Engine) в TwiML. Для этого сервлета требуется только один параметр: сообщение, которое будет воспроизводиться. В этом случае я избегаю символа амперсанда в TwiML.

... 
String url = Constants.APPLICATION_URL + "/tts/" +"?" + Constants.ParamName.GREETINGS + "=" + greetings; 
Play play = new Play(url); 
... 

Это прокси-сервлет (он отображается на/tts/path). сделать запрос на Google TTS Engine и отправить обратно ответ от него:

... 
this.greetings = request.getParameter(Constants.ParamName.GREETINGS); 
InputStream input = null; 
HttpURLConnection con = null; 
OutputStream output = null; 
try { 
    URL obj = new URL("http://translate.google.com/translate_tts?ie=UTF-8&q=" + URLEncoder.encode(greetings, "UTF-8") + "&tl=en-us")); 
    con = (HttpURLConnection) obj.openConnection(); 
    con.setConnectTimeout(5000); 
    con.setRequestMethod("GET"); 
    con.setRequestProperty("User-Agent", "Mozilla/5.0"); 
    con.setRequestProperty("Content-Type", "audio/mpeg"); 
    input = con.getInputStream(); 
    response.setContentType("audio/mpeg"); 
    output = response.getOutputStream(); 
    byte[] buffer = new byte[10240]; 
    for (int length = 0; (length = input.read(buffer)) > 0;) { 
     output.write(buffer, 0, length); 
    } 
} 
... 

Конечно, это выглядит как грязный хак, но я думаю, что это лучше, чем сохранить временный файл на сервере.

0
<Response> 
    <Play>http://translate.google.com/translate_tts?ie=UTF-8&q=Hello%20World&tl=en-us</Play> 
</Response> 

является синтаксически недействительным XML. Это все в порядке:

<Response> 
    <Play>http://translate.google.com/translate_tts?ie=UTF-8&amp;q=Hello%20World&amp;tl=en-us</Play> 
</Response> 

Если Twilio не может обработать это, вы должны указать на них ошибку.