2014-12-15 1 views
0

Twilio에서 Google TTS (텍스트 음성 변환) 서비스를 사용하고 싶습니다.Twilio에서 Google 텍스트 음성 변환을 통합하는 방법 (또는 XML 태그에 '&'가있는 URL)

여러 매개 변수가있는 URL을 앰퍼샌드 (&)로 구분하여 생성했습니다. 예를 들어
는 : http://translate.google.com/translate_tts?ie=UTF-8&q=Hello%20World&tl=en-us

문제는 : 문서의 라인 1에

오류 : 나는 TwiML 태그에이 URL을 넣어하려고 할 때, 나는 아래 서면 예외가 실체 "Q에 대한 참조를 "끝내야한다 '; 구분 기호. 응답 본문이 유효한 XML 문서인지 확인하십시오. 이미 시도한 것으로,

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

솔루션 :

은 TwiML입니다

1) 나를 위해 도움이되지 &amp;
&를 교체합니다. 이 경우에는 또 다른 예외가 있습니다. 은 HTTP 상태 코드 404을 반환했습니다. Twilio가 &amp;&으로 디코딩하지 않은 것 같습니다.

2) Google 출력을 서버의 파일에 저장하고이 파일에 대한 직접 링크 (& 제외)를 태그에 추가하십시오. 작동해야하지만 더러운 해킹처럼 보입니다.)

답변

1

좋아, 나는 세 번째 방법에서이 문제를 해결했다. 코드로 설명하기가 더 쉽습니다.

Google 프록시 서블릿 (Google TTS 엔진에 대한 URL) 대신 TwiML에 URL을 넣습니다. 이 서블릿에는 재생할 매개 변수 하나만 필요했습니다. 이 경우 나는 TwiML에서 앰퍼샌드 기호를 사용하지 않는다.

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

프록시 서블릿 (/ tts/path에 매핑 됨)입니다. 구글 TTS 엔진에 요청을하고 그것으로부터 응답을 다시 보내 : 물론

... 
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가 처리 할 수없는 경우에는 버그를 신고해야합니다. 모든 매개 변수를 숨기는

내가 만든

"프록시"서블릿이 서블릿 내부, 구글 TTS 엔진에 필요한 :

관련 문제