GoogleSpeechToText.php
<?php
class GoogleSpeechToText
{
const SPEECH_BASE_URL = 'https://www.google.com/speech-api/full-duplex/v1/';
private $requestPair;
private $apiKey;
private $uploadHandle;
private $downloadHandle;
public function __construct($apiKey)
{
if (empty($apiKey)) {
throw new Exception('$apiKey should not be empty.');
}
$this->apiKey = $apiKey;
$this->requestPair = $this->getPair();
$this->setupCurl();
}
private function setupCurl()
{
$this->uploadHandle = curl_init();
$this->downloadHandle = curl_init();
curl_setopt($this->downloadHandle, CURLOPT_URL, self::SPEECH_BASE_URL . 'down?pair=' . $this->requestPair );
curl_setopt($this->downloadHandle, CURLOPT_RETURNTRANSFER, true);
curl_setopt($this->uploadHandle,CURLOPT_RETURNTRANSFER,true);
curl_setopt($this->uploadHandle,CURLOPT_POST,true);
curl_setopt($this->uploadHandle, CURLOPT_MAX_SEND_SPEED_LARGE, 30000);
curl_setopt($this->uploadHandle, CURLOPT_LOW_SPEED_TIME, 9999);
curl_setopt($this->downloadHandle, CURLOPT_LOW_SPEED_TIME, 9999);
}
private function getPair()
{
$c = '0123456789';
$s = '';
for ($i=0; $i<16; $i++) {
$s .= $c[rand(0, strlen($c) - 1)];
}
echo "pair : ",$s;
return $s;
}
public function process($file, $rate, $language = 'en-US')
{
if (!$file || !file_exists($file) || !is_readable($file)) {
throw new Exception(
'$file must be specified and be a valid location.'
);
}
else { echo "<br>file exists"; }
$data = file_get_contents($file);
if (!$data) {
throw new Exception('Unable to read ' . $file);
}
else { echo "<br>file is readable"; }
$upload_data = array(
"Content_Type" => "audio/x-flac; rate=". $rate,
"Content" => $data,
);
if (empty($rate) || !is_integer($rate)) {
throw new Exception('$rate must be specified and be an integer');
}
else { echo "<br>sample rate is received :" . $rate ; }
curl_setopt($this->uploadHandle,CURLOPT_URL,self::SPEECH_BASE_URL . 'up?lang=' .$language . '&lm=dictation&timeout=20&client=chromium&pair=' .$this->requestPair . '&key=' . $this->apiKey);
curl_setopt($this->uploadHandle,CURLOPT_HTTPHEADER,array('Transfer-Encoding: chunked','Content-Type: audio/x-flac; rate=' . $rate));
curl_setopt($this->uploadHandle,CURLOPT_POSTFIELDS,$upload_data);
$curlMulti = curl_multi_init();
curl_multi_add_handle($curlMulti, $this->downloadHandle);
curl_multi_add_handle($curlMulti, $this->uploadHandle);
$active = null;
do {
curl_multi_exec($curlMulti, $active);
} while ($active > 0);
$res = curl_multi_getcontent($this->downloadHandle);
$output = array();
$results = explode("\n", $res);
foreach ($results as $result) {
$object = json_decode($result, true);
if (
(isset($object['result']) == true) &&
(count($object['result']) > 0)
) {
foreach ($object['result'] as $obj) {
$output[] = $obj;
}
}
}
curl_multi_remove_handle($curlMulti, $this->downloadHandle);
curl_multi_remove_handle($curlMulti, $this->uploadHandle);
curl_multi_close($curlMulti);
if (empty($output)) {
echo "<BR><br>output is empty<BR>";
return false;
}
echo "<BR><BR>";
return $output;
}
public function __destruct()
{
curl_close($this->uploadHandle);
curl_close($this->downloadHandle);
}
}
?>