Преобразование текста в речь Google Cloud на php
Я пытаюсь использовать преобразование текста Google в речь на моем веб-сайте php, который будет размещен на живом сервере Cpanel.
Я включил API преобразования текста в речь, Created API KEY в разделе Credentials, а также загрузил json-файл учетных данных со страницы Create service account key.
Затем я загрузил образцы файлов с Github, а также использовал композитор для создания библиотеки.
Теперь я не понимаю, куда девать ключи. Везде он требует ЭКСПОРТИРОВАТЬ ключ в Shell, но это будет работать для 1 открытого сеанса командной строки, и его придется экспортировать каждый раз.
Поскольку я хочу запустить этот код на живом хостинге на основе cpanel, я думаю, что его нельзя будет экспортировать.
Есть ли в коде место, куда я могу передать ключ?
В этой статье с URL-адресом в stackoverflow: первый ответ экспортирует ответ CURL в synthesize-text.txt, но нам требуется вывод в формате mp3
В другом ответе говорится, что мы должны использовать jq, но, поскольку это общий сервер hsoting, я не уверен, можем ли мы организовать jq .
Есть ли выход из этой проблемы?
Обновлять
Пробовал следующий код после обращения к ответу @ 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'];
}
Я скачал аудио, но паузы / перерывы, которые я упомянул в ssml, не сработали. Я попытался передать данные в $ params, как показано ниже
$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'
}
}";
Но я получаю следующую ошибку:
Array ([error] => Array ([code] => 400 [message] => Получена недопустимая полезная нагрузка JSON. Неизвестное имя "": корневой элемент должен быть сообщением. [Status] => INVALID_ARGUMENT [подробности] => Array ( [0] => Array ([@type] => type.googleapis.com/google.rpc.BadRequest [fieldViolations] => Array ([0] => Array ([description] => Получены недопустимые полезные данные JSON. Неизвестное имя "": Корневым элементом должно быть сообщение.))))))
Как это решить?
Ответы
Ниже моего рабочего примера преобразования текста в речь вы можете переделать для своих нужд:
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;
}
Для стандарта SSML необходимо изменить входные параметры:
$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"
]
];
о выборе audioEncoding - https://cloud.google.com/speech-to-text/docs/encoding