В обновлении до Ответ Schahriar SaffarShargh , Google недавно внедрила функцию «злоупотребления Google», что делает невозможным отправку любого обычного старого HTTP GET на URL, такой как:
http://translate.google.com/translate_tts?tl=en&q=Hello%20World
, которая раньше работала просто отлично.Теперь, перейдя по такой ссылке, вы получите CAPTCHA.Это также влияет на запросы HTTP GET вне браузера (например, с помощью cURL), поскольку использование этого URL дает перенаправление на страницу защиты от злоупотреблений (CAPTCHA).
Для начала необходимо добавить запросПараметр client
на URL запроса:
http://translate.google.com/translate_tts?tl=en&q=Hello%20World&client=t
Переводчик Google отправляет &client=t
, так что вы тоже должны.
Перед выполнением этого запроса HTTP сделайтеубедитесь, что вы установили заголовок Referer
:
Referer: http://translate.google.com/
Очевидно, заголовок User-Agent
также необходим, но, что интересно, он может быть пустым:
User-Agent:
Редактировать : NOTE - на некоторых пользовательских агентах, таких как Android 4.X, custom *Заголовок 1038 * User-Agent
равен не отправлено , что означает, что Google не будет обслуживать запрос.Чтобы решить эту проблему, я просто установил User-Agent
на правильный, такой как stagefright/1.2 (Linux;Android 5.0)
.Используйте Wireshark для отладки запросов (как я сделал), если серверы Google не отвечают, и убедитесь, что эти заголовки установлены правильно в GET
!В случае сбоя запроса Google ответит 503 Service Unavailable
, после чего будет перенаправлено на страницу CAPTCHA.
Это решение немного хрупкое;Вполне возможно, что Google в будущем изменит способ обработки этих запросов, поэтому в конце я бы предложил попросить Google создать конечную точку API real (бесплатную или платную), которую мы могли бы использовать, не чувствуягрязный из-за фальсификации заголовков HTTP.
Edit 2 : Для тех, кому интересно, эта команда cURL должна прекрасно работать для загрузки mp3 Hello на английском языке:
curl 'http://translate.google.com/translate_tts?ie=UTF-8&q=Hello&tl=en&client=t' -H 'Referer: http://translate.google.com/' -H 'User-Agent: stagefright/1.2 (Linux;Android 5.0)' > google_tts.mp3
Как вы можете заметить, в запросе я установил заголовки Referer
и User-Agent
, а также добавил параметр client=t
в строку запроса.Вы можете использовать https
вместо http
, ваш выбор!
Редактировать 3 : Google теперь требует токен для каждого запроса GET (отмечен tk
вСтрока запроса).Ниже приведена исправленная команда cURL, которая будет правильно загружать TTS mp3:
curl 'https://translate.google.com/translate_tts?ie=UTF-8&q=hello&tl=en&tk=995126.592330&client=t' -H 'user-agent: stagefright/1.2 (Linux;Android 5.0)' -H 'referer: https://translate.google.com/' > google_tts.mp3
Обратите внимание на & tk = 995126.592330 в строке запроса;это новый токен.Я получил этот токен, нажав значок динамика на translate.google.com
и посмотрев запрос GET.Я просто добавил этот параметр строки запроса к предыдущей команде cURL, и он работает.
NOTE : очевидно, что это решение очень слабое и нарушает прихотьархитекторы Google, которые представляют новые вещи, такие как токены, необходимые для запросов.Этот токен может не сработать завтра (хотя я проверю и сообщу) ... дело в том, что не стоит полагаться на этот метод;вместо этого следует обратиться к коммерческому решению TTS, особенно если вы используете TTS в производстве.
Для получения дополнительной информации о генерации токенов и возможных действиях см. Ответ Боуде .
Если это решение не работает в любое время, пожалуйста, оставьте комментарий к этому ответу, чтобы мы могли попытаться найти исправление для него!