2015-01-27 3 views
6

Google의 TTS (text-to-speech) 기능에서 오디오 파일을 가져 오려고합니다. 기본적으로, 당신은 링크에 던지기를하고 그 끝에 말하고 싶은 것을 연결하십시오. 아래 코드는 영어로 잘 작동하기 때문에 요청시 중국어 문자가 어떻게 인코딩되는지 문제가 있다고 생각합니다. 나는 한자로이 때Android에서 한자에 대한 Google의 TTS (Text-to-Speech) 서비스를 사용하는 방법은 무엇입니까?

String text = "text to be spoken"; 
public static final String AUDIO_CHINESE= "http://www.translate.google.com/translate_tts?tl=zh&q="; 
public static final String AUDIO_ENGLISH = "http://www.translate.google.com/translate_tts?tl=en&q="; 

URL url = new URL(AUDIO_ENGLISH + text); 

urlConnection = (HttpURLConnection) url.openConnection(); 
urlConnection.setRequestMethod("GET"); 
urlConnection.setRequestProperty("Accept-Charset", Variables.UTF_8); 

if (urlConnection.getResponseCode() ==200) { 
    //get byte array in response 
    in = new DataInputStream(urlConnection.getInputStream()); 
} else { 
    in = new DataInputStream(urlConnection.getErrorStream()); 
} 
//use commons io 
byte[] bytes = IOUtils.toByteArray(in); 

in.close(); 
urlConnection.disconnect(); 

return bytes; 

는하지만, 그것은 내가 MediaPlayer를에서 플레이를 할 수없는 무언가를 (나는 그것이 광대와 같은 적절한 오디오 파일이 아닌 용의자 반환 : 여기있어 무엇 대부분의 바이트는 '85'임). 그래서 모두

String chText = "你好"; 
URL url = new URL(AUDIO_CHINESE + URLEncoder.encode(chText, "UTF-8)); 

URL url = new URL(AUDIO_CHINESE + Uri.encode(chText, "UTF-8")); 

후 요청 헤더에

urlConnection.setRequestProperty("content-type", "application/x-www-form-urlencoded; charset=UTF-8"); 

추가를 시도했습니다. 하지만 이제는 logcat에서 "FileNotFound"라고 말하는 대신 200 개의 코드를 반환하지 않기 때문에 더 악화되었습니다.

그래서 나는 놀랍게도 영어 텍스트를 사용하여 URL/Uri 인코딩을 시도했지만 이제 영어는 유효한 결과를 반환하지 않습니다. 여기서 무슨 일이 벌어지는 지 모르겠다. 복사하여 Chrome에 붙여 넣으면 디버거의 원시 URL이 제대로 작동하지만 urlConnection이 작동하지 않는 이유가있다. 내가 명백한 것을 놓치고있는 것처럼 느껴져. 그것은 조작하기

편집

좀 더 아무 대답, 단지 더 혼란 (와 격분을) 공개하지 않았다. 어떤 이유로 httpurlconnection을 통해 전송 될 때 Google tts 컴퓨터는 최소한 utf-8로 인코딩 된 텍스트를 utf-16으로 읽습니다. 예를 들어 문자 "維"(wei2)는 %E7%B6%AD이지만 연결을 통해 전달하면 "보게"("ç", 정확하게 말하면) 발음하는 파일이 표시됩니다.

ç는 UTF-16 (utf-8 퍼센트 인코딩 된 버전은 %C3%A7)으로 0x00E7입니다. 자바에서 왜 그렇게하는지 모르겠다. 브라우저의 링크 끝 부분에 적절한 %를 넣으면 제대로 작동하기 때문이다. 지금까지, 나는 많은 성공없이 %E7%B6%AD의 전체를 읽을 tts를 얻으려고 노력의 다양한 조합을 시도했다. 내 문제

EDIT2

솔루션은 발견! 답변은 아래를 참조하십시오. 인코딩에 문제가 없었으므로 Google 측에서 파싱했습니다. 그에 따라 제목을 편집했습니다. 건배!

+0

응답 코드 검사에서 'else'부분을 입력하지 않으시겠습니까? 어쩌면 오류 메시지의 내용을 재생하려고하는 것일 수 있습니다. 실제 응답 헤더와 본문을 보려면 일부 로깅을 추가하십시오. 또한 각각의 시도에 대한 URL을 구성한 후'URL.toString()'을 로깅하여 브라우저에 붙여 넣어 무슨 일이 일어나는지보십시오. –

+0

또한 응답 유형이'audio/mpeg'인지 확인해야합니다. –

+0

방금 ​​확인한 모든 응답 유형은 오디오/mpeg입니다. 중국 문자열이있는 맨 위 코드 만 200 코드 섹션으로 들어가고 URL/Uri 인코딩 물건은 나를 오류 섹션으로 가져옵니다. un-encoded 텍스트로 url.toString()을 시도하고 그 결과 URL http://www.translate.google.com/translate_tts?tl=zh&q= 抽象 事物은 잘 동작합니다. –

답변

4

결과적으로 결국 문제는 인코딩이 아니 었습니다. Google 측의 처리였습니다. 서비스가 UTF-8을 올바르게 인식하게하려면 위의 링크 대신 http://www.translate.google.com/translate_tts?ie=utf-8&tl=zh-cn&q= 링크를 사용해야합니다. 매개 변수에 ie=utf-8이 추가되었습니다. 그래서 당신은 단지 URLEncoder.encode("你好嗎", "UTF-8") 일 수 있고, 그것을 링크에 덧붙이고 평소와 같이 그것을 보냅니다. 아휴!

+0

좋은 답변 감사합니다! 나는 그런 특정한 문제를 가진 세계에있는 1 명의 다른 사람조차있을 것이라는 점을 생각하지 않았다 : 관심사에서, 당신은 당신의 해결책에 어떻게 도착 했습니까? – Alveoli

+2

많은 고통, 눈물, 인터넷 검색, 시행 착오, 의식 희생 등 : P 문서화되지 않은 API의 수명입니다. –

관련 문제