Google Cloud Text to speech in php

Sep 30 2020

Tôi đang cố gắng sử dụng văn bản thành giọng nói của google trong trang web php của mình để được lưu trữ trên Máy chủ Cpanel trực tiếp

Tôi đã bật API văn bản thành giọng nói, Đã tạo API KEY trong phần Thông tin đăng nhập, cũng đã tải xuống tệp json của thông tin đăng nhập từ trang Tạo khóa tài khoản dịch vụ.

Sau đó, tôi tải xuống các tệp mẫu từ Github và cũng sử dụng trình soạn nhạc để xây dựng thư viện

Bây giờ tôi không hiểu để đặt chìa khóa của tôi ở đâu. Ở mọi nơi, nó sẽ hiển thị để XUẤT khóa trong Shell, nhưng điều đó sẽ hoạt động cho 1 phiên nhắc lệnh đang mở và sẽ phải được xuất mỗi lần.

Vì tôi muốn chạy mã này trên một máy chủ lưu trữ dựa trên cpanel trực tiếp, vì vậy tôi nghĩ rằng nó sẽ không thể xuất được.

Có chỗ nào trong các mã mà tôi có thể chuyển chìa khóa không?

Trên bài viết url này tại stackoverflow: câu trả lời đầu tiên xuất phản hồi của CURL sang tổng hợp-text.txt nhưng chúng tôi yêu cầu đầu ra mp3

Một câu trả lời khác nói rằng chúng ta nên sử dụng jq nhưng vì nó là một máy chủ hsoting được chia sẻ, tôi không chắc liệu chúng ta có thể sắp xếp jq hay không .

Có cách nào để giải quyết vấn đề này không?


Cập nhật

Đã thử đoạn mã sau sau khi tham khảo câu trả lời của @ 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'];                
} 

Tôi tải xuống âm thanh nhưng những lần tạm dừng / ngắt quãng mà tôi đã đề cập trong ssml không hoạt động. Tôi đã thử chuyển dữ liệu đến $ params như bên dưới

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

Nhưng tôi gặp lỗi sau:

Array ([error] => Array ([code] => 400 [message] => Đã nhận tải trọng JSON không hợp lệ. Tên không xác định "": Phần tử gốc phải là một thông báo. [Status] => INVALID_ARGUMENT [details] => Array ( [0] => Array ([@type] => type.googleapis.com/google.rpc.BadRequest [fieldViolations] => Array ([0] => Array ([description] => Đã nhận tải trọng JSON không hợp lệ. Tên không xác định) "": Phần tử gốc phải là một thông báo.))))))

Làm thế nào để giải quyết điều này?

Trả lời

2 V.Tur Sep 30 2020 at 00:22

Bên dưới ví dụ về tính năng chuyển văn bản thành giọng nói của tôi, bạn có thể thực hiện lại theo nhu cầu của mình:

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

Đối với bản chuẩn SSML cần thay đổi các thông số đầu vào:

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

về chọn audioEncoding - https://cloud.google.com/speech-to-text/docs/encoding