Google Cloud Speech API с использованием php

Я пытаюсь вызвать Google Cloud Speech API с помощью PHP, и у меня возникла проблема.

$stturl = "https://speech.googleapis.com/v1beta1/speech:syncrecognize?key=xxxxxxxxxxxx";
$upload = file_get_contents("1.wav");
$upload = base64_encode($upload);

$data = array(
    "config"    =>  array(
        "encoding"      =>  "LINEAR16",
        "sampleRate"    =>  16000,
        "languageCode"  =>  "en-US"
    ),
    "audio"     =>  array(
        "Content"       =>  $upload,
    )
);

$jsonData = json_encode($data);

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $stturl);
curl_setopt($ch, CURLOPT_HTTPHEADER, array("Content-Type: application/json"));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $jsonData);

$result = curl_exec($ch);

Результат говорит, что это НЕДЕЙСТВИТЕЛЬНАЯ ЗАГРУЗКА JSON.

{"error": {"code": 400, "message": "Получены недопустимые данные JSON. Неизвестное имя \" content \ "в 'audio': поле не найдено.», «status»: «INVALID_ARGUMENT», «подробности ": [{" @type ":" type.googleapis.com/google.rpc.BadRequest "," fieldViolations ": [{" field ":" audio "," description ":" Получена недопустимая полезная нагрузка JSON. Неизвестное имя \ "content \" at 'audio': поле не найдено. " }]}]}} "

Я думаю, это потому, что $ upload неправильно настроен. Согласно Google Cloud Speech API, это должна быть «строка в кодировке base64». https://cloud.google.com/speech/reference/rest/v1beta1/RecognitionAudio

Вот почему я использовал функцию base64_encode, но похоже, что JSON неправильно обрабатывает это значение. Есть предположения?


person Alex    schedule 08.09.2016    source источник
comment
Вам следует base64_encode($upload) и также изменить Content на content. Должно работать нормально.   -  person BadHorsie    schedule 14.09.2016


Ответы (2)


Вам нужно создать правильно отформатированный ввод как массив, а затем json закодировать его. Например, чтобы отправить файл, base64 закодирует его как «контент» и отправит в API, как показано:

$data = array(
    "config" => array(
        "encoding" => "LINEAR16",
        "sample_rate" => $bitRate,
        "language_code" => "en-IN"
    ),
   "audio" => array(
        "content" => base64_encode($filedata)
    )
);

$data_string = json_encode($data);                                                              

$ch = curl_init($googlespeechURL);                                                                      
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");                                                                     
curl_setopt($ch, CURLOPT_POSTFIELDS, $data_string);                                                                  
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);                                                                      
curl_setopt($ch, CURLOPT_HTTPHEADER, array(                                                                          
   'Content-Type: application/json',                                                                                
   'Content-Length: ' . strlen($data_string))                                                                       
);                                                                                                                   

$result = curl_exec($ch);
$result_array = json_decode($result, true);
person Matt    schedule 14.09.2016

пожалуйста, сделайте "контент" вместо "Контент"

строчная буква "с"

это работа для меня.

person Kaushik    schedule 14.09.2016