Здравствуйте.
Мой вопрос
ниже. Сначала короткое введение.
Сейчас я учу Java (использую Эклипс) и наткнулся на следующий учебный пример — который представляет собой вариацию программы text-to-speech (TTS) на Java. Собственно сама программа лежит тут
Lesson01_Speech.zip.
Суть программы (она состоит из 2 классов и подключаемой библиотеки) сводится к следующему:
Связать проект с библиотекой JLayer (jl1.0.1.jar) для воспроизведения mp3 с java
Создать экземпляр класса:
GoogleTextToSpeech gtts = new GoogleTextToSpeech()
Использовать метод:
gtts.say("Hello everybody", "en")
Первый аргумент фраза для произнесения, второй — язык.
Я добавил в прогу свои комментарии (на английском) и закомментировал явно лишнею строчку, теперь прога выглядит так (
Main class):
package com.example.TTS; // package of class Main
import com.example.TTS.GoogleTextToSpeech; // import class GoogleTextToSpeech
public class Main {
public static void main(String[] args) {
GoogleTextToSpeech gtts = new GoogleTextToSpeech(); // make instance gtts
gtts.say("Hello dear friends", "en"); // use method say
// gtts.say("Bonjour mon amis!", "fr");
}
}
GoogleTextToSpeech class:
package com.example.TTS; // package of class GoogleTextToSpeech
import java.io.InputStream; // import classes from Java library
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLConnection;
import java.net.URLEncoder;
import javazoom.jl.player.Player; // import class from jl1.0.1.jar
public class GoogleTextToSpeech {
private static String ENCODING = "UTF-8"; //make constants and assign values to them
private static String URL_BEGINNING = "http://translate.google.com/translate_tts?ie=";
private static String URL_QUERY = "&q=";
private static String URL_TL = "&tl=";
private static String USER_AGENT_LITERAL = "User-Agent";
private static String USER_AGENT = "Mozilla/4.7";
public void say( String phrase, String lang ) {
try {
//Make full URL
phrase=URLEncoder.encode(phrase, ENCODING); //assign value to variable with name 'phrase' by use method encode from class URLEncoder
String sURL = URL_BEGINNING + ENCODING + URL_TL + lang + URL_QUERY + phrase; //assign value to variable sURL
URL url = new URL(sURL); // make instance url with constructor
//Create connection
URLConnection urlConn = url.openConnection(); //assign value to variable urlConn
HttpURLConnection httpUrlConn = (HttpURLConnection) urlConn; //Declaring httpUrlConn var of type HttpURLConnection, assigning it value to var urlConn (reduce to HttpURLConnection)
httpUrlConn.addRequestProperty(USER_AGENT_LITERAL, USER_AGENT);// use method
//Create stream
InputStream mp3WebStream = urlConn.getInputStream();//create instance and assign it a value
//Play stream
Player plr = new Player(mp3WebStream); //create instance plr with constructor
plr.play(); //use method
}
//use exception with name ex
catch (Exception ex) {
ex.printStackTrace(); //use method
}
}
}
Стартую программу путем выбора
Run as -> Java Application на Main.java.
И имею следующий вывод ( в эклипс консоли):
java.io.IOException: Server returned HTTP response code: 503 for URL:http://ipv4.google.com/sorry/index?continue=http://translate.google.com/translate_tts%3Fie%3DUTF-8%26tl%3Den%26q%3DHello%2Bdear%2Bfriends&q=EgRbegWvGJ3FldEFIhkA8aeDS952qU94sbK8DAgP55pH8cbMicZdMgFy
at sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1894)
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1492)
at com.example.TTS.GoogleTextToSpeech.say(GoogleTextToSpeech.java:32)
at com.example.TTS.Main.main(Main.java:9)
Все, что я понял на данный момент, это то, что: в моем случае ошибка в строках:
at com.example.TTS.GoogleTextToSpeech.say (GoogleTextToSpeech.java:32)
at com.example.TTS.Main.main (Main.java:9)
затем вызывается код библиотеки
MP3 Decoder / player / converter,
который открывает соединение с
translate.google.com, который:
1. перенаправляет на страницу с CAPTCHA
2. возвращает статус 503 Услуга недоступна
Мои вопросы:
1. Я не совсем понимаю, как работает эта программа и зачем ей нужна библиотека jl1.0.1.jar. Может быть можно обойтись без библиотеки и работать напрямую с API?
2. Что делать, чтобы программа работала правильно? Может быть, мне нужно пройти регистрацию Google, чтобы я мог использовать этот API без капчи?
Здравствуйте, sasvak, Вы писали:
S>Мои вопросы:
S>1. Я не совсем понимаю, как работает эта программа и зачем ей нужна библиотека jl1.0.1.jar. Может быть можно обойтись без библиотеки и работать напрямую с API?
После строчки "//Play stream" используется для воспроизведения потока (видимо, аудио), полученного в качестве ответа на запрос к сервису tts.
S>2. Что делать, чтобы программа работала правильно? Может быть, мне нужно пройти регистрацию Google, чтобы я мог использовать этот API без капчи?
Да, добавили captchа из-за этого поломалось, немного поискав можно найти, что нужно добавить еще один аргумент (client=tw-ob) в запрос:
http://translate.google.com/translate_tts?ie=UTF-8&q=test&tl=en&client=tw-ob
Остальные аргументы у вас есть, приведите свой URL к такому виду и должно заработать (но может быть при частом обращении к tts просто будут отвечать отказом).
Здравствуйте, UDI, Вы писали:
UDI>Здравствуйте, sasvak, Вы писали:
S>>Мои вопросы:
S>>1. Я не совсем понимаю, как работает эта программа и зачем ей нужна библиотека jl1.0.1.jar. Может быть можно обойтись без библиотеки и работать напрямую с API?
UDI>После строчки "//Play stream" используется для воспроизведения потока (видимо, аудио), полученного в качестве ответа на запрос к сервису tts.
S>>2. Что делать, чтобы программа работала правильно? Может быть, мне нужно пройти регистрацию Google, чтобы я мог использовать этот API без капчи?
UDI>Да, добавили captchа из-за этого поломалось, немного поискав можно найти, что нужно добавить еще один аргумент (client=tw-ob) в запрос:
UDI>UDI>http://translate.google.com/translate_tts?ie=UTF-8&q=test&tl=en&client=tw-ob
UDI>Остальные аргументы у вас есть, приведите свой URL к такому виду и должно заработать (но может быть при частом обращении к tts просто будут отвечать отказом).
Буду проверять, скажите, плиз, я вроде поставил вам "спасибо", но хотел бы, чтобы другие участники также дали свои ответы. То есть: Что мне
НЕЛЬЗЯ нажимать (кубки разных видов, палец вверх и тд), чтобы остальные форумчане видели этот вопрос еще не получившим окончательного ответа?