Google Cloud Text zu Sprache in PHP

Sep 30 2020

Ich versuche, Googles Text zum Sprechen auf meiner PHP-Website zu verwenden, um ihn auf einem Live-Cpanel-Server zu hosten

Ich habe die Text-zu-Sprache-API, API-SCHLÜSSEL im Abschnitt Anmeldeinformationen erstellt, aktiviert und auch die JSON-Datei mit Anmeldeinformationen von der Seite "Dienstkontoschlüssel erstellen" heruntergeladen.

Dann habe ich die Beispieldateien von Github heruntergeladen und auch Composer verwendet, um die Bibliothek zu erstellen

Jetzt verstehe ich nicht, wo ich meine Schlüssel ablegen soll. An jedem Ort wird der Schlüssel in Shell EXPORTIERT, dies funktioniert jedoch für eine offene Eingabeaufforderungssitzung und muss jedes Mal exportiert werden.

Da ich diesen Code auf einem Live-Hosting auf Cpanel-Basis ausführen möchte, ist es meines Erachtens nicht möglich, ihn zu exportieren.

Gibt es eine Stelle in den Codes, an der ich den Schlüssel übergeben kann?

Zu diesem URL- Artikel bei stackoverflow: Die erste Antwort exportiert die Antwort von CURL in synthetize-text.txt, aber wir benötigen eine MP3-Ausgabe

Eine andere Antwort besagt, dass wir jq verwenden sollten, aber da es sich um einen gemeinsam genutzten hsoting-Server handelt, bin ich mir nicht sicher, ob wir jq arrangieren können .

Gibt es einen Ausweg zu diesem Problem?


Aktualisieren

Versuchte den folgenden Code, nachdem auf die Antwort von @ V.Tur verwiesen wurde

$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'];                
} 

Ich bekomme das Audio heruntergeladen, aber die Pausen / Pausen, die ich in ssml erwähnt habe, haben nicht funktioniert. Ich habe versucht, Daten wie unten angegeben an $ params zu übergeben

$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'
    }
}";

Aber ich bekomme folgenden Fehler:

Array ([Fehler] => Array ([Code] => 400 [Nachricht] => Ungültige JSON-Nutzdaten empfangen. Unbekannter Name "": Root-Element muss eine Nachricht sein. [Status] => INVALID_ARGUMENT [Details] => Array ( [0] => Array ([@type] => type.googleapis.com/google.rpc.BadRequest [fieldViolations] => Array ([0] => Array ([description] => Ungültige JSON-Nutzdaten empfangen. Unbekannter Name "": Root-Element muss eine Nachricht sein.))))))

Wie kann man das lösen?

Antworten

2 V.Tur Sep 30 2020 at 00:22

Unter meinem Arbeitsbeispiel Text-to-Speech können Sie für Ihre Anforderungen wiederholen:

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;
   }

Für den SSML-Standard müssen die Eingabeparameter geändert werden:

$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"
            ]
         ];

über AudioEncoding wählen - https://cloud.google.com/speech-to-text/docs/encoding