ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2019-07-03 01:16:12  阅读:331  来源: 互联网

标签:php google-api speech-to-text flac webspeech-api


我的代码的灵感来自这个php版本的全双工谷歌语音API语音到文本:http://mikepultz.com/2013/07/google-speech-api-full-duplex-php-version/

我有几个flac文件可以正常工作,并按照迈克的帖子解释给出数组输出.但对于少数flac文件,它只是不返回任何输出.例如:http://gavyadhar.com/video/upload/Pantry_Survey.flac,不返回任何输出.

但是相同的代码适用于此flac文件:http://gavyadhar.com/video/upload/pantry_snack_video.flac并返回数组输出,如下所示:

———回应1:你的脸是一个食品储藏室和一个主要的堆栈我通常是Wesley Rd rasa杂粮饼干,我喜欢它们,因为它们对你来说非常健康和[…]
……等等5个回复.

任何人都可以告诉我,为什么一些flac文件不起作用?或者有没有办法捕获谷歌API创建的异常并显示它们进行故障排除?

谢谢.在这里附加两个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);
    }
}

?>

解决方法:

您提供的音频文件使用2个频道.由于语音目前仅支持单通道音频,因此您需要将其转换为单通道.
所有编码仅支持1声道(单声道)音频.
Audio encoding detail of Google speech API

将音频文件转换为1个频道后,我能够成功获得所提供音频文件的响应.

标签:php,google-api,speech-to-text,flac,webspeech-api
来源: https://codeday.me/bug/20190703/1361751.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有