Использование Google Text-To-Speech API для сохранения звука речи

Я пытаюсь реализовать методы, обсуждаемые в этом вопросе, чтобы написать php функция, которая загружает аудиофайл для заданной строки, но я не могу обойти защиту от злоупотреблений Google. Результаты спорадические, иногда я получаю аудиофайл, а иногда это пустой mp3 размером 2 КБ из-за ответа «Наши системы обнаружили необычный трафик из вашей компьютерной сети». Вот что я получил до сих пор (обратите внимание, что файл $ есть в моем коде, но для целей этого я его опустил):

function downloadMP3( $url, $file ){    
    $curl = curl_init();

    curl_setopt( $curl, CURLOPT_URL, $url );
    curl_setopt( $curl, CURLOPT_RETURNTRANSFER, true );
    curl_setopt( $curl, CURLOPT_REFERER, 'http://translate.google.com/' );
    curl_setopt( $curl, CURLOPT_USERAGENT, 'stagefright/1.2 (Linux;Android 5.0)' );

    $output = curl_exec( $curl );    

    curl_close( $curl );

    if( $output === false ) { 
        return false;
    }

    $fp = fopen( $file, 'wb' );
    fwrite( $fp, $output );
    fclose( $fp );

    return true;
}

$word = "Test";

$file  = md5( $word ) . '.mp3';

if ( !file_exists( $file ) ) {
    $url = 'http://translate.google.com/translate_tts?q=' . $word . '&tl=en&client=t';
    downloadMP3( $url, $file );
}

person juliusbangert    schedule 07.12.2015    source источник
comment
Привет, Юлий, я посмотрю на это в ближайшие пару часов. На первый взгляд, это должно работать, хотя в строке запроса отсутствует ie=UTF-8. Попробуйте добавить это, но я в любом случае вернусь через несколько часов.   -  person Chris Cirefice    schedule 07.12.2015
comment
Я попробовал это, и это, кажется, не имеет значения. Это кажется спорадическим в том, что он иногда работает, а затем перестает работать. Любые идеи?   -  person juliusbangert    schedule 07.12.2015
comment
Я только что протестировал команду curl на OSX в своем университете, и она отлично работает. Это заставляет меня думать, что что-то не так с вашим PHP-кодом или у вас проблемы с сетью (может быть, вы находитесь в месте, которое может много спамить Google?). К сожалению, у меня нет знаний о PHP и о том, как запускать скрипты на OSX или Ubuntu, поэтому я не могу помочь отладить ваш код... переменные типа string должны быть в < /b> символы вместо ' ? После быстрого поиска в Google вам может понадобиться CURLOPT_BINARYTRANSFER, как показано здесь.   -  person Chris Cirefice    schedule 08.12.2015
comment
В ваших тестах, как вы вызываете команду curl, если не с php? У вас он работает неопределенно долго или вы отключаетесь примерно после пяти запросов? Я пробовал CURLOPT_BINARYTRANSFER, но после php 5.1.3 это не действует. Я в тупике и могу только предположить, что это просто не сработает.   -  person juliusbangert    schedule 08.12.2015
comment
Проверьте команду curl в моем предыдущем ответе. Он будет работать на любом терминале nix (OSX, дистрибутивах Linux и т. д.) или установить CURL для Windows. Это однострочная команда: 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. Если команда не работает для вас, это определенно проблема с сетью. Однако, если он *действительно работает, ваш PHP-код нуждается в некоторой доработке. Вероятно, отсутствующий/неправильно настроенный заголовок.   -  person Chris Cirefice    schedule 08.12.2015
comment
На самом деле кажется, что использование curl в PHP на самом деле является плохим вариантом. В PHP есть функция http_get. Это определенно лучшее решение, чем использование curl. Вы также можете установить заголовки HTTP с помощью этой функции. Я бы попробовал это!   -  person Chris Cirefice    schedule 08.12.2015
comment
Спасибо за ваши усилия, Крис. Но я попробовал несколько локальных тестов командной строки в терминале и получил те же результаты, он справляется с одним или двумя, но затем терпит неудачу и просто сохраняет сообщение об ошибке в невоспроизводимый mp3. По сути, я хочу убедиться, что это будет работать без точки отсечки, поскольку я планирую использовать его на веб-сайте, где я не могу предсказать объем трафика. Когда вы попробуете это, сможете ли вы постоянно получать разные mp3, когда вы постоянно делаете серию последовательных запросов?   -  person juliusbangert    schedule 08.12.2015
comment
Джулиус, да, у меня есть аналогичный код, работающий в рабочем приложении для Android, которым пользуются сотни тысяч обычных пользователей. Мне кажется, что у вас тут какая-то проблема с сетью. Возможно, ваши запросы исходят из региона, который часто спамит сервисами Google. Я не могу сказать наверняка... у вас есть опыт использования Wireshark? Было бы полезно зафиксировать ваши запросы и ответы, чтобы увидеть, что именно происходит.   -  person Chris Cirefice    schedule 08.12.2015
comment
У меня такая же проблема. Удалось ли вам найти решение для этого? Когда я пытаюсь использовать curl из командной строки с параметром client=t, он загружает mp3-файл, но не воспроизводит его. Если я не использую параметр client=t, он все равно загружает файл, но на этот раз размер файла равен 0. В любом случае файл не воспроизводится. Я делаю это на окнах. Интересно, как они это делают здесь: soundoftext.com   -  person user1448031    schedule 21.12.2015
comment
@ChrisCirefice у меня тоже не работает ваша команда curl, я проверил ее на 5 серверах в 3 разных центрах обработки данных.   -  person user2693017    schedule 26.12.2015
comment
В настоящее время вам нужно отправить токен (проверьте Google Translate, затем говорите и смотрите сетевой запрос). Я пытаюсь найти способ исправить это.   -  person Rob    schedule 30.12.2015
comment
Как отметил @RobQuist, Google теперь требует токен (параметр tk в строке запроса). Однако, если вы проверите запрос GET с помощью translate.google.com, он сгенерирует действительный запрос, который затем можно будет использовать в команде cURL. См. мое редактирование моего ответа в другом сообщении, в котором работает cURL. Вы можете добавить параметр tk в свой PHP-код, и он должен работать. Теперь ваш $url должен выглядеть так: $url = 'http://translate.google.com/translate_tts?q=' . $word . '&tl=en&tk=995126.592330&client=t';   -  person Chris Cirefice    schedule 31.12.2015


Ответы (1)


Попробуйте другой сервис, я только что нашел тот, который работает даже лучше, чем Google Translate; Google Text-To-Speech API

person Rob    schedule 30.12.2015