简体   繁体   English

谷歌语音API - PHP不返回任何内容

[英]Google speech API - php does not return anything

My code is inspired by this php version of full duplex google speech API for speech-to-text : http://mikepultz.com/2013/07/google-speech-api-full-duplex-php-version/ 我的代码的灵感来自这个php版本的全双工谷歌语音API语音到文本: http//mikepultz.com/2013/07/google-speech-api-full-duplex-php-version/

I have few flac files that do work and give the array output as explained on Mike's post. 我有几个flac文件可以正常工作,并按照迈克的帖子解释给出数组输出。 But for few flac files it just doesn't return anything as output. 但对于少数flac文件,它只是不返回任何输出。 For example : http://gavyadhar.com/video/upload/Pantry_Survey.flac , no output is returned. 例如: http//gavyadhar.com/video/upload/Pantry_Survey.flac ,不返回任何输出。

But the same code works for this flac file: http://gavyadhar.com/video/upload/pantry_snack_video.flac and returns the array output as following: 但是相同的代码适用于此flac文件: http//gavyadhar.com/video/upload/pantry_snack_video.flac并返回数组输出,如下所示:

---------response 1 : your face a pantry and one of the main stacks I usually Wesley Rd rasa multigrain crackers and I like them because they're pretty healthy for you and [...] ...and so on 5 responses. ---------回应1:你的脸是食品储藏室和主要的堆栈之一我通常是Wesley Rd rasa杂粮饼干,我喜欢它们,因为它们对你来说非常健康[...] ...等5个回复。

Can anyone tell me, why is it that some flac files don't work? 任何人都可以告诉我,为什么一些flac文件不起作用? Or is there any way to catch the exceptions which are created by google API and display them to troubleshoot? 或者有没有办法捕获谷歌API创建的异常并显示它们进行故障排除?

Thanks. 谢谢。 Attaching my code here of two php files: 在这里附加两个php文件的代码:

 PHP file which passes the API key and the FLAC file with its sample rate. <?php include 'GoogleSpeechToText.php'; ini_set('display_errors',1); ini_set('display_startup_errors',1); error_reporting(-1); // Your API Key goes here. $apiKey = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXX'; // my API server key $speech = new GoogleSpeechToText($apiKey); #var_dump($speech); $file = realpath('upload/Pantry_Survey.flac'); // Full path to the file. echo "<BR><BR>file : ", $file ; #print_r("<br>-------------------"); #print_r($file1); #print_r("<br>-------------------"); $bitRate = 44100; // The bit rate of the file. $result = $speech->process($file, $bitRate, 'en-US'); print_r($result); echo "<BR><BR>-------------"; $responses = $result[0]['alternative']; $i = 0; foreach ($responses as $response) { $i = $i + 1; #echo $response['transcript']; echo "<br><br> ---------response $i : ", $response['transcript']; } ?> 

 GoogleSpeechToText.php <?php /** * Convert FLAC files to Text using the Google Speech API * * Credit due to Mike (mike@mikepultz.com) for his first version of this. * * @version 0.1 * @author Roger Thomas * @see * */ class GoogleSpeechToText { /** * URL of the Speech API * @var string */ const SPEECH_BASE_URL = 'https://www.google.com/speech-api/full-duplex/v1/'; /** * A 'unique' string to use for the requests * * @var string */ private $requestPair; /** * The Google Auth API Key * * @var string */ private $apiKey; /** * CURL Upload Handle * * @var resource */ private $uploadHandle; /** * CURL Download Handle * * @var resource */ private $downloadHandle; /** * Construct giving the Google Auth API Key. * * @param string $apiKey * @throws Exception */ public function __construct($apiKey) { if (empty($apiKey)) { throw new Exception('$apiKey should not be empty.'); } $this->apiKey = $apiKey; $this->requestPair = $this->getPair(); $this->setupCurl(); } /** * Setup CURL requests, both up and down. */ 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 ); #echo "<br>downloadHandle :: ", 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); //----added by asmi shah - 7 jan 2015 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); //---- } /** * Generate a Pair for the request. This identifies the requests later. * * @return string */ private function getPair() { $c = '0123456789'; $s = ''; for ($i=0; $i<16; $i++) { $s .= $c[rand(0, strlen($c) - 1)]; } echo "pair : ",$s; return $s; } /** * Make the request, returning either an array, or boolean false on * failure. * * @param string $file the file name to process * @param integer $rate the bitrate of the flac content (example: 44100) * @param string $language the ISO language code * (en-US has been confirmed as working) * @throws Exception * @return array|boolean false for failure. */ 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); #var_dump($rate); 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); #echo "<br><br>------ data : ", $data; #echo "<br><br>------"; #echo "<BR><BR> URL made up : ", self::SPEECH_BASE_URL . 'up?lang=' .$language . '&lm=dictation&client=chromium&pair=' .$this->requestPair . '&key=' . $this->apiKey; $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); #var_dump($this->downloadHandle); #echo "resource type ::".get_resource_type($this->downloadHandle); $output = array(); $results = explode("\\n", $res); #var_dump($results); #$i = 0; foreach ($results as $result) { #$i = $i + 1; #echo "<BR><BR><BR>--------------- string ||$i|| : ", $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; } /** * Close any outstanding connections in the destruct */ public function __destruct() { curl_close($this->uploadHandle); curl_close($this->downloadHandle); } } ?> 

The audio file you provided uses 2 channels. 您提供的音频文件使用2个频道。 As speech currently only supports single channel audio, you will need to convert it down to a single channel. 由于语音目前仅支持单通道音频,因此您需要将其转换为单通道。 All encodings support only 1 channel (mono) audio. 所有编码仅支持1声道(单声道)音频。 Audio encoding detail of Google speech API Google语音API的音频编码细节

After converting the audio file down to 1 channel I was able to successfully get a response with the provided audio file. 将音频文件转换为1个频道后,我能够成功获得所提供音频文件的响应。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM