2014-01-07 58 views
0

我在PHP CLI中爲我的樹莓派製作了一個使用google語音識別api的程序,並且我想優化它,在我們說話時發送數據(現在它記錄我們所說的感謝sox,然後發送它)。如何使用套接字發佈未知長度的內容?

因此,我想在發送音頻文件的同時使用套接字寫入谷歌,但我必須在發送之前通過Content-Lenght給出長度。

是否有可能做其他事情?不給長度/給一個更大的最大長度?謝謝。這裏是我的代碼:

<?php 
header('Content-Type: text/html'); 

$name = 'www.google.com'; 
$dir = '/speech-api/v1/recognize?xjerr=1&client=chromium&lang=fr-FR&maxresults=10&pfilter=0'; 

$data = file_get_contents("/smart/voix.flac") ; 

$envoi = "POST ".$dir." HTTP/1.1\r\n"; 
$envoi .= "Host: ".$name."\r\n"; 
$envoi .= "Connection: Close\r\n"; 
$envoi .= "Content-Type:audio/x-flac;rate=44100\r\n"; 
$envoi .= "Content-Length: 100\r\n\r\n"; 

$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); 
if($socket < 0){ 
     die('FATAL ERROR: socket_create() : " '.socket_strerror($socket).' "'); 
} 

if (socket_connect($socket,gethostbyname($name),80) < 0){ 
     die('FATAL ERROR: socket_connect()'); 
} 

if(($int = socket_write($socket, $envoi, strlen($envoi))) === false){ //I send the first part 
     die('FATAL ERROR: socket_write() failed, '.$int.' characters written'); 
} 
    if(($int = socket_write($socket, $data."\r\n", strlen($data."\r\n"))) === false){//then the file 
     die('FATAL ERROR: socket_write() failed, '.$int.' characters written'); 
} 

$reception = ''; 
while($buff = socket_read($socket, 2000)){ 
$reception.=$buff; 
} 
echo $reception; 

socket_close($socket); 
?> 
+0

出於興趣,你爲什麼要在音頻數據的末尾添加'\ r \ n'? –

+0

請點擊這裏:http://mikepultz.com/2013/07/google-speech-api-full-duplex-php-version/ –

+0

@squeamishossifrage我不知道,我在某處看到它,所以我只是做了同樣的事情,但也許這不是強制性的。 – MrPointVirgule

回答

0

你已經做:

$data = file_get_contents("/smart/voix.flac") ; 

所以在這一點上,你必須有一組文件。所以只是:

$filesize = filesize("/smart/voix.flac"); 

並將其用於Content-Length。

+0

但是他仍然需要發送實際數據。如果$ data的內容和給定的內容長度不同,那麼事情可能會出錯。 –

+0

這是我的觀點。一旦你獲得了內容並把它們放在$ data中,它們就不會改變。 –

+0

事實上,我想用文件內容的其餘部分更新$數據,而用戶創建它。因此,發送數據的第一部分,然後另一個..不知道什麼時候會結束。 – MrPointVirgule

相關問題