Преобразование текста в речь Google Cloud на php

Sep 30 2020

Я пытаюсь использовать преобразование текста 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. Неизвестное имя "": Корневым элементом должно быть сообщение.))))))

Как это решить?

Ответы

2 V.Tur Sep 30 2020 at 00:22

Ниже моего рабочего примера преобразования текста в речь вы можете переделать для своих нужд:

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