Google Cloud Text to speech en PHP

Sep 30 2020

J'essaie d'utiliser la synthèse vocale de Google dans mon site Web php pour être hébergé sur un serveur Cpanel en direct

J'ai activé l'API de synthèse vocale, créé la clé API dans la section Informations d'identification, également téléchargé le fichier json d'informations d'identification à partir de la page Créer une clé de compte de service.

Ensuite, j'ai téléchargé les fichiers d'exemple à partir de Github et j'ai également utilisé composer pour créer la bibliothèque

Maintenant, je ne comprends pas où mettre mes clés. À chaque endroit, il est nécessaire d'exporter la clé dans Shell, mais cela fonctionnerait pour 1 session d'invite de commande ouverte et devra être exportée à chaque fois.

Comme je veux exécuter ce code sur un hébergement basé sur cpanel en direct, je pense qu'il ne sera pas possible d'exporter.

Y a-t-il un endroit dans les codes où je peux passer la clé?

Sur cet article url à stackoverflow: la première réponse exporte la réponse de CURL vers synthesize-text.txt mais nous avons besoin d'une sortie mp3

Une autre réponse indique que nous devrions utiliser jq mais comme il s'agit d'un serveur partagé, je ne suis pas sûr que nous puissions organiser jq .

Y a-t-il un moyen de résoudre ce problème?


Mettre à jour

J'ai essayé le code suivant après avoir consulté la réponse de @ V.Tur

$params = [ "audioConfig"=>[ "audioEncoding"=>"MP3", "pitch"=> "1", "speakingRate"=> "1", "effectsProfileId"=> [ "medium-bluetooth-speaker-class-device" ] ], "input"=>[ "ssml"=>'<speak>The <say-as interpret-as=\"characters\">SSML</say-as> standard <break time=\"1s\"/>is defined by the <sub alias=\"World Wide Web Consortium\">W3C</sub>.</speak>' ], "voice"=>[ "languageCode"=> "hi-IN", "name" =>"hi-IN-Wavenet-B", 'ssmlGender'=>'MALE' ] ]; $data_string = json_encode($params); $speech_api_key = "My_Key_Here";
$url = 'https://texttospeech.googleapis.com/v1/text:synthesize?fields=audioContent&key=' . $speech_api_key;
$handle = curl_init($url);

curl_setopt($handle, CURLOPT_CUSTOMREQUEST, "POST"); curl_setopt($handle, CURLOPT_POSTFIELDS, $data_string); curl_setopt($handle, CURLOPT_RETURNTRANSFER, true);
curl_setopt($handle, CURLOPT_HTTPHEADER, [ 'Content-Type: application/json', 'Content-Length: ' . strlen($data_string)
    ]                                                                       
);
$response = curl_exec($handle);              
$responseDecoded = json_decode($response, true);  
curl_close($handle); if($responseDecoded['audioContent']){
    return $responseDecoded['audioContent'];                
} 

Je télécharge l'audio mais les pauses / pauses que j'ai mentionnées dans ssml n'ont pas fonctionné. J'ai essayé de transmettre des données à $ params comme ci-dessous

$params = "{
    'input':{
     'ssml':'<speak>The <say-as interpret-as=\"characters\">SSML</say-as>
          standard <break time=\"1s\"/>is defined by the
          <sub alias=\"World Wide Web Consortium\">W3C</sub>.</speak>'
    },
    'voice':{
      'languageCode':'en-us',
      'name':'en-US-Standard-B',
      'ssmlGender':'MALE'
    },
    'audioConfig':{
      'audioEncoding':'MP3'
    }
}";

Mais j'obtiens l'erreur suivante:

Array ([error] => Array ([code] => 400 [message] => Charge utile JSON non valide reçue. Nom inconnu "": L'élément racine doit être un message. [Status] => INVALID_ARGUMENT [details] => Array ( [0] => Array ([@type] => type.googleapis.com/google.rpc.BadRequest [fieldViolations] => Array ([0] => Array ([description] => Charge utile JSON non valide reçue. Nom inconnu "": L'élément racine doit être un message.))))))

Comment résoudre ça?

Réponses

2 V.Tur Sep 30 2020 at 00:22

Ci-dessous mon exemple de travail de synthèse vocale, vous pouvez refaire pour vos besoins:

public static function getSound($text) { $text = trim($text); if($text == '') return false;
            
            $params = [ "audioConfig"=>[ "audioEncoding"=>"LINEAR16", "pitch"=> "1", "speakingRate"=> "1", "effectsProfileId"=> [ "medium-bluetooth-speaker-class-device" ] ], "input"=>[ "text"=>$text
                ],
                "voice"=>[
                    "languageCode"=> "en-US",
                    "name" =>"en-US-Wavenet-F"
                ]
            ];

            $data_string = json_encode($params);

            $url = 'https://texttospeech.googleapis.com/v1/text:synthesize?fields=audioContent&key=' . $speech_api_key;
            $handle = curl_init($url);
            
            curl_setopt($handle, CURLOPT_CUSTOMREQUEST, "POST"); curl_setopt($handle, CURLOPT_POSTFIELDS, $data_string); curl_setopt($handle, CURLOPT_RETURNTRANSFER, true);
            curl_setopt($handle, CURLOPT_HTTPHEADER, [ 'Content-Type: application/json', 'Content-Length: ' . strlen($data_string)
                ]                                                                       
            );
            $response = curl_exec($handle);              
            $responseDecoded = json_decode($response, true);  
            curl_close($handle); if($responseDecoded['audioContent']){
                return $responseDecoded['audioContent']; } return false; } using: public static function saveSound($text)
   {
      $speech_data = SpeechAPI::getSound($text);//see method upper

      if($speech_data) { $file_name = strtolower(md5(uniqid($text)) . '.mp3'); $path = FileUpload::getFolder();//just return directory path
         if(file_put_contents($path.$file_name, base64_decode($speech_data))){ return $file_name;
             }
         }

        return null;
   }

Pour le standard SSML, vous devez modifier les paramètres d'entrée:

$text = "<speak>The <say-as interpret-as=\"characters\">SSML</say-as> standard <break time=\"1s\"/>is defined by the <sub alias=\"World Wide Web Consortium\">W3C</sub>.</speak>"; $params = [
    "audioConfig"=>[
    "audioEncoding"=>"LINEAR16",
    "pitch"=> "1",
    "speakingRate"=> "1",
    "effectsProfileId"=> [
        "medium-bluetooth-speaker-class-device"
       ]
     ],
     "input"=>[
         //"text"=>$text "ssml" => $text
          ],
          "voice"=>[
              "languageCode"=> "en-US",
              "name" =>"en-US-Wavenet-F"
            ]
         ];

à propos de choisir audioEncoding - https://cloud.google.com/speech-to-text/docs/encoding