2015-01-27 14 views
6

Sto provando a estrarre un file audio dalla funzione text-to-speech di google. Fondamentalmente, si getta il link e poi concatri tutto ciò che vuoi essere parlato alla fine di esso. Ho ottenuto il codice seguente per funzionare correttamente per l'inglese, quindi penso che il problema debba essere il modo in cui i caratteri cinesi vengono codificati nella richiesta. Ecco quello che ho:Come utilizzare il servizio di sintesi vocale di Google per i caratteri cinesi su Android?

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; 

Quando provo questo con caratteri cinesi, però, restituisce qualcosa che non posso arrivare a giocare nel mediaplayer (ho il sospetto che non è un file audio corretta come la stragrande la maggior parte dei byte è '85'). Così ho provato sia

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

e

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

e quindi aggiungendo

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

per l'intestazione della richiesta. Questo ha solo peggiorato, però, perché ora non restituisce nemmeno un codice di 200, ma afferma "FileNotFound" in logcat.

Quindi, per un capriccio, sono tornato indietro e ho provato la codifica URL/Uri con il testo inglese, e ora anche l'inglese non restituirà un risultato valido. Non sono sicuro di cosa sta succedendo qui: l'url non elaborato nel debugger funziona bene se copio e incolli in Chrome, ma per qualche motivo urlConnection non funziona. Mi sento come se mi mancasse qualcosa di ovvio.

EDIT

giocherellare con ancora un po 'ha rivelato nessuna risposta, solo più confusione (e l'esasperazione). Per qualche motivo, quando viene inviato tramite httpurlconnection, la tts machine di Google legge il testo con codifica utf-8 percento come utf-16, almeno per quanto posso dire. Ad esempio, il carattere "維" (wei2) è %E7%B6%AD, ma se lo si passa attraverso la connessione, si otterrà un file che pronuncia "vedere" ("ç", per essere precisi).

ç, come risulta, è 0x00E7 in UTF-16 (la sua versione codificata utf-8 per cento è %C3%A7). Non ho idea del perché lo faccia in Java, perché mettere la percentuale appropriata alla fine del link in qualsiasi browser funzionerà correttamente. Finora, ho provato varie combinazioni di cercare di far leggere ai lettori la totalità di %E7%B6%AD senza molto successo.

EDIT2

soluzione al mio problema trovato! Vedi sotto per la risposta. Il problema non era nella codifica, era nell'analisi sulla fine di Google. Ho modificato il titolo di conseguenza. Saluti!

+0

Sei sicuro di non inserire la parte 'else' del controllo del codice di risposta? Forse stai cercando di riprodurre il contenuto di un messaggio di errore. Prova ad aggiungere alcune registrazioni per vedere le intestazioni e il corpo della risposta effettiva. Inoltre, prova a registrare 'URL.toString()' dopo aver costruito l'URL per ciascuno dei tuoi tentativi e incollarlo in un browser per vedere cosa succede. –

+0

Dovresti anche verificare che il tipo di risposta sia 'audio/mpeg'. –

+0

Appena controllato: tutti i tipi di risposta sono audio/mpeg. Il codice superiore da solo con una stringa cinese entra nella sezione di codice 200, mentre la roba di codifica URL/Uri mi getta nelle sezioni di errore. Ho provato url.toString() con testo non codificato e l'url risultante http://www.translate.google.com/translate_tts?tl=zh&q= 由 代表 物體, 抽象 事物 funziona perfettamente. –

risposta

4

Quindi, come si è scoperto, il problema alla fine non era affatto la codifica; era l'elaborazione alla fine di Google. Per ottenere il servizio per riconoscere correttamente UTF-8, è necessario utilizzare questo link http://www.translate.google.com/translate_tts?ie=utf-8&tl=zh-cn&q= anziché quello sopra. Nota il ie=utf-8 aggiunto al parametro. Quindi puoi solo URLEncoder.encode("你好嗎", "UTF-8"), aggiungerlo al link e inviarlo come al solito. Meno male!

+0

Ottima risposta, grazie! Non pensavo che ci fosse anche un'altra persona al mondo con un problema così specifico :) Per quanto ti interessa, come sei arrivato alla tua soluzione? – Alveoli

+2

Un sacco di dolore, lacrime, google, prove ed errori, sacrifici rituali, ecc.: P Tale è la vita di un'API non documentata. –

Problemi correlati