¿Cómo usar el servicio Text-to-Speech de Google para los caracteres chinos en Android?
Estoy tratando de extraer un archivo de audio de la función de texto a voz de google. Básicamente, lanzar en el enlace y luego concat lo que quieras que se habla al final de la misma. He conseguido el código abajo para trabajar apenas muy bien para el inglés, así que pienso que el problema debe ser cómo los caracteres chinos están consiguiendo codificados en la petición. Esto es lo que tengo:
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;
Cuando intento esto con caracteres chinos, sin embargo, devuelve algo que no puedo conseguir para jugar en el mediaplayer (sospecho que no es un archivo de audio adecuado como la gran mayoría de bytes son '85'). Así que he probado ambos
- ¿Qué es un filtro de intenciones que solo mostraría una aplicación en el menú compartido al compartir una URL?
- webview abre navegador predeterminado, no sé dónde poner código
- Android FileNotFoundException obtener arrojado de URL.openStream ()
- ¿Cómo establecer un hipervínculo en textview clicable? Android Java
- ¿Cómo puedo obtener una vista previa de una página URL en Android?
String chText = "你好"; URL url = new URL(AUDIO_CHINESE + URLEncoder.encode(chText, "UTF-8));
y
URL url = new URL(AUDIO_CHINESE + Uri.encode(chText, "UTF-8"));
Y luego agregando
urlConnection.setRequestProperty("content-type", "application/x-www-form-urlencoded; charset=UTF-8");
Al encabezado de la solicitud. Esto sólo lo hizo peor, sin embargo, porque ahora ni siquiera devolver un código de 200, en lugar de indicar "FileNotFound" en logcat.
Así que por un capricho, volví y probé la codificación URL / Uri con el texto en inglés, y ahora el inglés no devolverá un resultado válido tampoco. No estoy seguro de lo que está pasando aquí: la url cruda en el depurador funciona bien si copio y pego en Chrome, pero por alguna razón el urlConnection simplemente no funciona. Siento que me falta algo obvio.
EDITAR
Jugando con él un poco más ha revelado ninguna respuesta, sólo más confusión (y exasperación). Por alguna razón, cuando se envía por httpurlconnection, la máquina de Google tts lee el texto utf-8 por ciento-codificado como utf-16, por lo menos hasta donde puedo decir. Por ejemplo, el carácter "維" (wei2) es %E7%B6%AD
, pero si lo pasa a través de la conexión, obtendrá un archivo que pronuncia "see" ("ç", para ser exactos).
Ç, como resulta, es 0x00E7
en UTF-16 (su utf-8 por ciento de codificación de la versión es %C3%A7
). No tengo ni idea de por qué hace eso en Java, porque poner el% apropiado al final del enlace en cualquier navegador funcionará correctamente. Hasta ahora, he intentado varias combinaciones de intentar conseguir los tts para leer la totalidad de %E7%B6%AD
sin mucho éxito.
EDIT2
Solución a mi problema encontrado! Vea a continuación la respuesta. El problema no estaba en la codificación, sino en el análisis al final de Google. Ha editado el título en consecuencia. ¡Aclamaciones!
- Android cómo crear un esquema de URL personalizado con el formato dado myapp: // http: //
- ¿Cómo extender la clase de URL para soportar otros protocolos en java (android)?
- Enviar URL a través de NFC para ser abierto por el navegador
- Descargar un archivo sin extensión desde un servidor
- Obtener el URI de una imagen almacenada en drawable
- Android: ¿Cómo buscar o obtener la imagen específica de cualquier URl o LINK como Facebook?
- ¿Cómo hago una solicitud http usando cookies en Android?
- Bloquear determinadas URL de seguridad en la vista web de Android
Así que, como resulta, el problema al final no era la codificación en absoluto; Era el proceso en el extremo de Google. Para que el servicio reconozca correctamente UTF-8, debe utilizar este enlace http://www.translate.google.com/translate_tts?ie=utf-8&tl=zh-cn&q=
lugar del anterior. Observe el ie=utf-8
añadido al parámetro. Así que puedes simplemente URLEncoder.encode("你好嗎", "UTF-8")
, añadirlo al enlace y enviarlo como de costumbre. ¡Uf!
- IllegalStateException utilizando la biblioteca de efectos Ripple en dispositivos Android M
- Introduce datos en la base de datos desde la aplicación de Android a través del servicio web.