Google Cloud Text to speech di php

Sep 30 2020

Saya mencoba menggunakan text to speech Google di situs web php saya untuk dihosting di Server Cpanel langsung

Saya telah mengaktifkan text to speech API, Membuat API KEY di bagian Kredensial, juga mengunduh file json kredensial dari halaman Buat kunci akun layanan.

Kemudian saya mengunduh file sampel dari Github dan juga menggunakan komposer untuk membangun perpustakaan

Sekarang saya tidak mengerti di mana harus meletakkan kunci saya. Di setiap tempat, perintah tersebut akan menampilkan EKSPOR kunci di Shell, tetapi itu akan berfungsi untuk 1 sesi prompt perintah terbuka dan harus diekspor setiap saat.

Karena saya ingin menjalankan kode ini di hosting berbasis cpanel langsung, jadi menurut saya kode ini tidak dapat diekspor.

Apakah ada tempat di dalam kode di mana saya bisa memasukkan kunci?

Pada artikel url ini di stackoverflow: jawaban pertama mengekspor respons CURL ke synthesize-text.txt tetapi kami memerlukan keluaran mp3

Jawaban lain menyatakan bahwa kita harus menggunakan jq tetapi karena ini adalah server hsoting bersama, saya tidak yakin apakah kita dapat mengatur jq .

Apakah ada jalan keluar untuk masalah ini?


Memperbarui

Mencoba kode berikut setelah mengacu pada jawaban oleh @ 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'];                
} 

Saya mendapatkan audio yang diunduh tetapi jeda / jeda yang saya sebutkan di ssml tidak berfungsi. Saya mencoba meneruskan data ke $ params seperti di bawah ini

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

Tetapi saya mendapatkan kesalahan berikut:

Array ([error] => Array ([code] => 400 [message] => Payload JSON tidak valid diterima. Nama tidak dikenal "": Elemen root harus berupa pesan. [Status] => INVALID_ARGUMENT [details] => Array ( [0] => Larik ([@type] => type.googleapis.com/google.rpc.BadRequest [fieldViolations] => Array ([0] => Array ([description] => Muatan JSON yang tidak valid diterima. Nama tidak dikenal "": Elemen root harus berupa pesan.))))))

Bagaimana cara mengatasi ini?

Jawaban

2 V.Tur Sep 30 2020 at 00:22

Di bawah contoh kerja saya text-to-speech, Anda dapat mengulang untuk kebutuhan Anda:

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

Untuk standar SSML perlu mengubah parameter input:

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

tentang memilih audioEncoding - https://cloud.google.com/speech-to-text/docs/encoding