2016-06-20 9 views
1

Я пытался конвертировать зависание командной строки в php curl. Это служба IBM Speech to Text. Линия была следующим образом:Ошибка преобразования командной строки cURL в PHP cURL

curl -X POST -u "{username}":"{password}" 
--header "Content-Type: audio/flac" 
--data-binary @audio-file.flac 
"https://stream.watsonplatform.net/speech-to-text/api/v1/recognize?timestamps=true&word_alternatives_threshold=0.9" 

Я был попробовать это:

$url = "https://stream.watsonplatform.net/speech-to-text/api/v1/recognize?timestamps=true&word_alternatives_threshold=0.9"; 

$postData = array(
    'upload' => '@D:\Others\xampp2\htdocs\test\test.wav', 
    'Accept' => "application/json", 
); 
foreach($postData as $key=>$value){ 
    $fields_string .= $key.'='.$value.'&'; 
} 
$fields_string = rtrim($fields_string, '&'); 
$ch = curl_init($url); 
curl_setopt($ch, CURLOPT_USERPWD, "MYUSER:MYPASS"); 
curl_setopt($ch, CURLOPT_POST, true); 
curl_setopt($ch, CURLOPT_POSTFIELDS, $fields_string); 
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
    'Content-Type: audio/wav', 
    'continuous: true', 
    )); 
curl_setopt($ch, CURLOPT_BINARYTRANSFER, TRUE); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); 
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); 
curl_setopt($ch,CURLOPT_TIMEOUT,1000); 

$result = curl_exec($ch); 
echo curl_error($ch); 
curl_close($ch); 
var_dump($result); 

Но я получаю это сообщение:

string(129) "{ 
    "code_description": "Bad Request", 
    "code": 400, 
    "error": "Stream was 69 bytes but needs to be at least 100 bytes." 
}" 

Что может быть проблема? Любое предложение будет очень полезно.

Update

$postData = array(
    'upload' => '@D:\Others\xampp2\htdocs\test\test.wav', 
    'Accept' => "application/json", 
); 

$ch = curl_init($url); 
curl_setopt($ch, CURLOPT_USERPWD, "MYUSER:MYPASS"); 
curl_setopt($ch, CURLOPT_POST, true); 
curl_setopt($ch, CURLOPT_POSTFIELDS, $postData); 
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
    'Content-Type: audio/wav', 
    'continuous: true', 
    )); 
curl_setopt($ch, CURLOPT_BINARYTRANSFER, TRUE); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); 
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); 
curl_setopt($ch,CURLOPT_TIMEOUT,1000); 

$result = curl_exec($ch); 
echo curl_error($ch); 
curl_close($ch); 
var_dump($result); 

Теперь получаю эту ошибку:

string(139) "{ 
    "code_description": "Bad Request", 
    "code": 400, 
    "error": "unable to transcode data stream audio/wav -> audio/x-float-array " 
}" 

ответ

0

Вы строите свою собственную строку POST:

$postData = array(
    'upload' => '@D:\Others\xampp2\htdocs\test\test.wav', 
    'Accept' => "application/json", 
); 
foreach($postData as $key=>$value){ 
    $fields_string .= $key.'='.$value.'&'; 
} 

Если вы предоставляете строку, CURL посылает который вычеркивает как есть, без дальнейшей обработки. Это означает, что CURL не будет анализировать предоставленный $fields_string, чтобы увидеть, есть ли какие-либо значения @ -prefixed, указывающие на загрузку файлов, и в итоге вы отправляете на сервер буквальный текст @D:\etc..., а не содержимое файла, который, по вашему мнению, должен идти ,

Не создавайте собственную строку запроса/тело - просто предоставьте исходный массив CURL. Это сделает все остальное:

curl_setopt($ch, CURLOPT_POSTFIELDS, $postData); 
             ^^^^^^^---your original array 
+0

Спасибо за предложение. Но теперь я получаю эту ошибку: string (139) "{ " code_description ":" Bad Request ", " code ": 400, " error ":" невозможно перекодировать поток данных audio/wav -> audio/x -float-array " }" – user3850712

+0

любая причина, по которой ваша версия CLI использует файл flac, а версия php - .wav? .wav является контейнером и может содержать в основном любой вид кодека, который watson не может интерпретировать/понимать. –

+0

Но они поддерживают файл .wav .. – user3850712

Смежные вопросы