PHP|Débutant :: Forums

Advertisement

Besoin d'aide ? N'hésitez pas, mais respectez les règles

Vous n'êtes pas identifié(e).

#1 02-09-2015 13:50:24

stany
Membre
Inscription : 02-09-2015
Messages : 7

[RESOLU] file_get_contents et user_agent

Bonjour,

je suis débutant-autodidacte pour essayer de résoudre ce propblème:
Mon objectif initial est de récupérer un mp3 créé en ligne pour faire du TTS (text to speech).
La solution d'origine était celle de Google (http://translate.google.com/translate_t … jour&tl=fr)


  protected function TTSToMp3($words,$lang)
  {
    // Directory
    $folder = "audio/".$lang;

    // Replace the non-alphanumeric characters
    // The spaces in the sentence are replaced with the Plus symbol
    $words = urlencode($words);

    // Name of the MP3 file generated using the MD5 hash
    $file = md5($words);

    // If folder doesn't exists, create it
    if (!file_exists($folder))
      mkdir($folder, 0755, true);

    // Save the MP3 file in this folder with the .mp3 extension
    $file = $folder."/TTS-".$file.".mp3";

    // If the MP3 file exists, do not create a new request
    if (!file_exists($file))
    {
      // Google Translate API cannot handle strings > 100 characters
      $words = $this->CutString($words,100);

      ini_set('user_agent', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:21.0) Gecko/20100101 Firefox/21.0');
      $mp3 = "";
      for ($i = 0; $i < count($words); $i++)
        $mp3[$i] = file_get_contents('http://translate.google.com/translate_tts?q='.$words[$i].'&tl='.$lang);

      file_put_contents($file, $mp3);
    }
    return $file;
  }
 

Depuis peu, Google demande un Captcha pour cette fonction, devenant inexploitable ... je pense.

J'ai recherché une alternative (semblable et gratuite) et j'ai trouvé: http://text2speech.us/
En fouillant un peu, j'ai trouvé qu'en tapant "http://text2speech.us/mp3.php?t=bonjour&lf=fr" dans la barre d'adresse, j'obtiens un mp3.
J'en déduit que j'ai trouvé l'alternative à Google Translate.

J'ai modifié le code ci-dessus


// $mp3[$i] = file_get_contents('http://translate.google.com/translate_tts?q='.$words[$i].'&tl='.$lang);
    $mp3[$i] = file_get_contents('http://text2speech.us/mp3.php?t='.$words[$i].'&lf='.$lang);
 

Cela ne marche pas.

Je me suis aperçu que si je tape dans la barre d'adresse "http://text2speech.us/mp3.php?t=bonjour&lf=fr" juste après l'ouverture de mon navigateur, le site me renvoi l'erreur:
Notice: Undefined index: UserId in /home/text2speech/public_html/mp3.php on line 44
Warning: Cannot modify header information - headers already sent by (output started at /home/text2speech/public_html/mp3.php:44) in /home/text2speech/public_html/mp3.php on line 96

Maintenant, si j'ouvre mon navigateur, que je vais sur le site "http://text2speech.us" alors ensuite "http://text2speech.us/mp3.php?t=bonjour&lf=fr" fonctionne très bien.

Je suppose que le problème vient du "user_agent" ou quelque chose du genre qui m'identifie sur le site.

Mais là, ça dépasse largement mes compétences.

Pouvez-vous m'aider?

Merci

Dernière modification par stany (18-09-2015 15:25:39)

Hors ligne

#2 02-09-2015 13:57:53

tof73
Membre
Inscription : 21-12-2014
Messages : 156
Site Web

Re : [RESOLU] file_get_contents et user_agent

essaie un
file_get_contents('http://text2speech.us");
avant ta boucle

Hors ligne

#3 02-09-2015 15:25:18

stany
Membre
Inscription : 02-09-2015
Messages : 7

Re : [RESOLU] file_get_contents et user_agent

Ca ne marche pas.
Je dirais même que c'est pire.
Car sans cette ligne, je reçois un fichier mp3 mais qui fait 0 ko (tout comme avec l'instruction Google).
Et en faisant votre modif, je reçois plus rien en retour.

Même résultat

J'ai corrigé car j'avais fait une erreur de syntaxe.


Idem avec 

$mp3 = fopen("http://text2speech.us", "r");

Idem avec


$opts = array(
  'http'=>array(
  'method'=>"GET",
  'header'=>"Accept-language: en\r\n" .
        "Cookie: foo=bar\r\n"
  )
);
$context = stream_context_create($opts);
// ...
$mp3[$i] = file_get_contents('http://text2speech.us/mp3.php?t=Bonjour&lf=fr', false, $context);
 

Dernière modification par stany (02-09-2015 18:41:55)

Hors ligne

#4 02-09-2015 19:13:11

tof73
Membre
Inscription : 21-12-2014
Messages : 156
Site Web

Re : [RESOLU] file_get_contents et user_agent

jamais fait un équivalent, mais c'est possible qu'en récupérant le cookie renvoyé lors de la connexion à http://text2speech.us puis en l'ajoutant à la demande de http://text2speech.us/mp3.php, cela fonctionne.

Hors ligne

#5 02-09-2015 20:49:12

stany
Membre
Inscription : 02-09-2015
Messages : 7

Re : [RESOLU] file_get_contents et user_agent

Je comprends le principe mais pas du tout comment faire.
Sous chrome j'ai 6 cookies:

Nom :    PHPSESSID
Contenu :    cda53bc3c0f93dfc73390fb6429faca0
Domaine :    text2speech.us
Chemin :    /
Envoyer pour :    Toutes sortes de connexions
Accessible aux scripts :    Oui

Nom :    __utma
Contenu :    169556132.150862348.1441220442.1441220442.1441220442.1
Domaine :    .text2speech.us
Chemin :    /
Envoyer pour :    Toutes sortes de connexions
Accessible aux scripts :    Oui

Nom :    __utmb
Contenu :    169556132.1.10.1441220441
Domaine :    .text2speech.us
Chemin :    /
Envoyer pour :    Toutes sortes de connexions
Accessible aux scripts :    Oui

Nom :    __utmc
Contenu :    169556132
Domaine :    .text2speech.us
Chemin :    /
Envoyer pour :    Toutes sortes de connexions
Accessible aux scripts :    Oui

Nom :    __utmt
Contenu :    1
Domaine :    .text2speech.us
Chemin :    /
Envoyer pour :    Toutes sortes de connexions
Accessible aux scripts :    Oui

Nom :    __utmz
Contenu :    169556132.1441220441.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none)
Domaine :    .text2speech.us
Chemin :    /
Envoyer pour :    Toutes sortes de connexions
Accessible aux scripts :    Oui

Hors ligne

#6 03-09-2015 20:20:55

stany
Membre
Inscription : 02-09-2015
Messages : 7

Re : [RESOLU] file_get_contents et user_agent

J'ai avancé mais dans une autre direction.
Le code qui fonctionnait est qui proposait de télécharger un mp3 était:

$mp3[$i] = file_get_contents('http://translate.google.com/translate_tts?q=bonjour&tl=fr');

Comme expliqué précédemment, un captcha bloque le code.
Au détour d'un autre forum sur le TTS, il y a une parade en ajoutant "client=t" dans le code, soit:

http://translate.google.com/translate_tts?client=t&q=bonjour&tl=fr

En tapant ce lien dans une barre d'adresse, la lecture du fichier est automatique et ne propose pas de l'enregistrer.
Et en faisant la modif dans le code Php, ça ne marche pas non plus. La commande "file_get_contents" ne doit pas être la bonne?

Comment puis-je, récupérer et enregistrer le fichier ainsi lu?

Dernière modification par stany (03-09-2015 20:25:24)

Hors ligne

#7 08-09-2015 13:29:49

stany
Membre
Inscription : 02-09-2015
Messages : 7

Re : [RESOLU] file_get_contents et user_agent

J'avance encore un peu.... enfin je crois.
D'après mes trouvailles, une commande cURL fonctionnerait:

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

Donc il y a une histoire de User-Agent et de Referer.

Comment réaliser ceci en Php?

Merci

Dernière modification par stany (08-09-2015 13:30:09)

Hors ligne

#8 18-09-2015 15:24:48

stany
Membre
Inscription : 02-09-2015
Messages : 7

Re : [RESOLU] file_get_contents et user_agent

Pour résoudre mon problème, je l'ai contourné en créant les mp3.
Je perds la flexibilité du TTS en ligne mais ça marche.

Cordialement

Dernière modification par stany (18-09-2015 15:25:11)

Hors ligne

Pied de page des forums