2015-01-27 8 views
6

Ich versuche, eine Audiodatei aus der Text-zu-Sprache-Funktion von Google zu ziehen. Im Grunde genommen, werfen Sie den Link und dann concat was immer Sie am Ende gesprochen werden möchten. Ich habe den folgenden Code bekommen, um gut für Englisch zu funktionieren, also denke ich, dass das Problem sein muss, wie die chinesischen Zeichen in der Anfrage verschlüsselt werden. Hier ist, was ich habe:Wie funktioniert der Text-zu-Sprache-Dienst von Google für chinesische Schriftzeichen auf 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; 

Wenn ich versuche, dies mit chinesischen Schriftzeichen, aber es gibt etwas, das ich nicht in dem Mediaplayer bekommen zu spielen (ich vermute, es ist nicht eine richtige Audiodatei als die großen Mehrheit der Bytes sind '85'). Also habe ich versucht, sowohl

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

und

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

und dann Zugabe

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

auf die Request-Header. Dies machte es jedoch nur noch schlimmer, weil es jetzt nicht einmal einen 200-Code zurückgibt, sondern stattdessen "FileNotFound" in logcat angibt.

Also aus einer Laune heraus, ich ging zurück und versuchte die URL/Uri-Codierung mit dem englischen Text, und jetzt wird die englische auch kein gültiges Ergebnis zurückgeben. Ich bin mir nicht sicher, was hier vor sich geht: Die rohe URL im Debugger funktioniert einwandfrei, wenn ich in Chrome kopiere und einfüge, aber aus irgendeinem Grund funktioniert die URL-Verbindung nicht. Fühle mich, als würde ich etwas Offensichtliches vermissen.

EDIT

mit ihm einige mehr Hantieren hat keine Antwort ergab, nur mehr Verwirrung (und Erbitterung). Aus irgendeinem Grund liest die Google tts-Maschine, wenn sie über httpurlconnection gesendet wird, den utf-8-Prozent-codierten Text als utf-16, zumindest soweit ich das beurteilen kann. Zum Beispiel ist das Zeichen "維" (wei2) %E7%B6%AD, aber wenn Sie es über die Verbindung übergeben, erhalten Sie eine Datei, die "sehen" ("ç", um genau zu sein) ausspricht.

ç, wie sich herausstellt, ist 0x00E7 in UTF-16 (seine utf-8 Prozent-codierte Version ist %C3%A7). Ich habe keine Ahnung, warum es das in Java macht, weil das richtige% am Ende des Links in jedem Browser funktioniert. Bis jetzt habe ich verschiedene Kombinationen versucht, um die TTS zu erhalten, um die Gesamtheit von %E7%B6%AD ohne viel Erfolg zu lesen.

EDIT2

Lösung für mein Problem gefunden! Siehe unten für die Antwort. Das Problem lag nicht in der Codierung, sondern in der Analyse am Ende von Google. Habe den Titel entsprechend bearbeitet. Prost!

+0

Sind Sie sicher, dass Sie den "else" -Teil Ihres Antwortcode-Checks nicht eingeben? Vielleicht versuchen Sie, den Inhalt einer Fehlermeldung abzuspielen. Versuchen Sie, eine Protokollierung hinzuzufügen, um die tatsächlichen Antwortheader und den Haupttext anzuzeigen. Versuchen Sie außerdem, 'URL.toString()' zu protokollieren, nachdem Sie die URL für jeden Ihrer Versuche erstellt und in einen Browser eingefügt haben, um zu sehen, was passiert. –

+0

Sie sollten auch überprüfen, dass der Antworttyp "audio/mpeg" ist. –

+0

Nur überprüft: Alle Antworttypen sind Audio/MPEG. Der oberste Code allein mit einer chinesischen Zeichenkette tritt in den 200-Code-Abschnitt ein, während der URL/Uri-Codierungs-Inhalt mich in die Fehlerabschnitte wirft. Versuchte url.toString() mit uncodiertem Text, und die resultierende URL http://www.translate.google.com/translate_tts?tl=zh&q= 由 代表 物體, 事物 事物 funktioniert gut. –

Antwort

4

Also, wie sich herausstellt, war das Problem am Ende überhaupt nicht die Kodierung; Es war die Verarbeitung am Ende von Google. Damit der Dienst UTF-8 korrekt erkennen kann, müssen Sie diesen Link http://www.translate.google.com/translate_tts?ie=utf-8&tl=zh-cn&q= anstelle des obigen verwenden. Beachten Sie, dass der Parameter ie=utf-8 hinzugefügt wird. So können Sie einfach URLEncoder.encode("你好嗎", "UTF-8"), hängen Sie es an den Link, und senden Sie es wie üblich. Wütend!

+0

Große Antwort Danke! Ich hätte nicht gedacht, dass es noch eine andere Person auf der Welt gibt, die ein so spezifisches Problem hat :) Wie sind Sie aus Interesse an Ihrer Lösung angekommen? – Alveoli

+2

Eine Menge Schmerz, Tränen, Googeln, Versuch und Irrtum, rituelle Opfer, etc.: P So ist das Leben einer undokumentierten API. –

Verwandte Themen