Google Cloud Text zu Sprache in PHP
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
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