Hi.
Version Protobuf: v3.17.3
Language: PHP.
The web portal is developed on the basis of the YII2 framework.
I have downloaded the PHP SDK for Cloud Speech-to-Text for converting 
recorded audio (mp3) speech to text.
This extension uses Protobuf to work with audio streams.

With this request, I send an audio file for transcription:
https://cloud.google.com/speech-to-text/docs/samples/speech-transcribe-async#speech_transcribe_async-php

In my controller it looks like this:
"
$audioFile = $_SERVER['DOCUMENT_ROOT'] . 
'/frontend/web/audiofiles/380633470210_2021-05-13 115637.mp3';

                // change these variables if necessary
                $encoding = AudioEncoding::MP3;
                $sampleRateHertz = 44100;       
                       
                $languageCode = 'uk-UA';
// get contents of a file into a string
                $content = file_get_contents($audioFile);

                // set string as audio content
                $audio = (new RecognitionAudio())
                    ->setContent($content);

                // set config
                $config = (new RecognitionConfig())
                    ->setEncoding($encoding)
                    ->setSampleRateHertz($sampleRateHertz)
                    ->setLanguageCode($languageCode);   

                // create the speech client
                $client = new SpeechClient();
                
                // create the asyncronous recognize operation
                $operation = $client->longRunningRecognize($config, $audio);
                $operation->pollUntilComplete();
if ($operation->operationSucceeded()) {
                    $response = $operation->getResult();

                    $comment = '';

                    // each result is for a consecutive portion of the 
audio. iterate
                    // through them to get the transcripts for the entire 
audio file.
                    foreach ($response->getResults() as $result) {
                        $alternatives = $result->getAlternatives();
                        $mostLikely = $alternatives[0];
                        $transcript = $mostLikely->getTranscript();
                        $confidence = $mostLikely->getConfidence();

                        $comment .= '(' . $confidence . '): ' . 
$transcript  . PHP_EOL;
                    }
                }
$client->close();
"

On the local version of the site (Openserver, PHP 7.1.32, Apache API 
20120211) everything works - I get lines of transcribed text in the 
$comment variable.

On hosting (PHP 7.3.15-3 + ubuntu16.04.1 + deb.sury.org, Apache/2.4.41) I 
get an error:

"Google\Protobuf\Internal\GPBDecodeException: Error occurred during 
parsing: Fail to push limit. in 
/var/www/4servicetp_ru/bat/vendor/google/protobuf/src/Google/Protobuf/Internal/CodedInputStream.php:367
Stack trace:
#0 
/var/www/4servicetp_ru/bat/vendor/google/protobuf/src/Google/Protobuf/Internal/CodedInputStream.php(390):
 
Google\Protobuf\Internal\CodedInputStream->pushLimit(917)
#1 
/var/www/4servicetp_ru/bat/vendor/google/protobuf/src/Google/Protobuf/Internal/GPBWire.php(286):
 
Google\Protobuf\Internal\CodedInputStream->incrementRecursionDepthAndPushLimit(917,
 
0, 0)
#2 
/var/www/4servicetp_ru/bat/vendor/google/protobuf/src/Google/Protobuf/Internal/Message.php(437):
 
Google\Protobuf\Internal\GPBWire::readMessage(Object(Google\Protobuf\Internal\CodedInputStream),
 
Object(Google\Protobuf\Internal\FileDescriptorProto))
#3 
/var/www/4servicetp_ru/bat/vendor/google/protobuf/src/Google/Protobuf/Internal/Message.php(527):
 
Google\Protobuf\Internal\Message::parseFieldFromStreamNoTag(Object(Google\Protobuf\Internal\CodedInputStream),
 
Object(Google\Protobuf\Internal\FieldDescriptor), 
Object(Google\Protobuf\Internal\FileDescriptorProto))
#4 
/var/www/4servicetp_ru/bat/vendor/google/protobuf/src/Google/Protobuf/Internal/Message.php(823):
 
Google\Protobuf\Internal\Message->parseFieldFromStream(10, 
Object(Google\Protobuf\Internal\CodedInputStream), 
Object(Google\Protobuf\Internal\FieldDescriptor))
#5 
/var/www/4servicetp_ru/bat/vendor/google/protobuf/src/Google/Protobuf/Internal/Message.php(787):
 
Google\Protobuf\Internal\Message->parseFromStream(Object(Google\Protobuf\Internal\CodedInputStream))
#6 
/var/www/4servicetp_ru/bat/vendor/google/protobuf/src/Google/Protobuf/Internal/DescriptorPool.php(61):
 
Google\Protobuf\Internal\Message->mergeFromString('\n\x95\x07\n,google/clo...')
#7 
/var/www/4servicetp_ru/bat/vendor/google/cloud-speech/metadata/V1P1Beta1/Resource.php(42):
 
Google\Protobuf\Internal\DescriptorPool->internalAddGeneratedFile('\n\x95\x07\n,google/clo...',
 
true)
#8 
/var/www/4servicetp_ru/bat/vendor/google/cloud-speech/metadata/V1P1Beta1/CloudSpeech.php(21):
 
GPBMetadata\Google\Cloud\Speech\V1P1Beta1\Resource::initOnce()
#9 
/var/www/4servicetp_ru/bat/vendor/google/cloud-speech/src/V1p1beta1/SpeechContext.php(79):
 
GPBMetadata\Google\Cloud\Speech\V1P1Beta1\CloudSpeech::initOnce()
#10 
/var/www/4servicetp_ru/bat/backend/controllers/AnketaController.php(748): 
Google\Cloud\Speech\V1p1beta1\SpeechContext->__construct()
#11 [internal function]: 
backend\controllers\AnketaController->actionTranscribe('9')
#12 
/var/www/4servicetp_ru/bat/vendor/yiisoft/yii2/base/InlineAction.php(57): 
call_user_func_array(Array, Array)
#13 
/var/www/4servicetp_ru/bat/vendor/yiisoft/yii2/base/Controller.php(181): 
yii\base\InlineAction->runWithParams(Array)
#14 /var/www/4servicetp_ru/bat/vendor/yiisoft/yii2/base/Module.php(534): 
yii\base\Controller->runAction('transcribe', Array)
#15 
/var/www/4servicetp_ru/bat/vendor/yiisoft/yii2/web/Application.php(104): 
yii\base\Module->runAction('anketa/transcri...', Array)
#16 
/var/www/4servicetp_ru/bat/vendor/yiisoft/yii2/base/Application.php(392): 
yii\web\Application->handleRequest(Object(yii\web\Request))
#17 /var/www/4servicetp_ru/bat/backend/web/index.php(17): 
yii\base\Application->run()"

The error itself occurs directly in the application code 
(https://github.com/protocolbuffers/protobuf/blob/master/php/src/Google/Protobuf/Internal/CodedInputStream.php):
"
public function pushLimit($byte_limit)
    {
        // Current position relative to the beginning of the stream.
        $current_position = $this->current();
        $old_limit = $this->current_limit;

        // security: byte_limit is possibly evil, so check for negative 
values
        // and overflow.
        if ($byte_limit >= 0 &&
            $byte_limit <= PHP_INT_MAX - $current_position &&
            $byte_limit <= $this->current_limit - $current_position) {
            $this->current_limit = $current_position + $byte_limit;
            $this->recomputeBufferLimits();

        } else {

            throw new GPBDecodeException("Fail to push limit.");
        }

        return $old_limit;
    }
"

I talked about this issue in a chat with a Google specialist and he 
directed me here, because in his opinion the problem is precisely in the 
work of Protobuf.
I would be grateful for opinions and tips on what could be the cause of 
this error.


-- 
You received this message because you are subscribed to the Google Groups 
"Protocol Buffers" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to protobuf+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/protobuf/d6fa3499-ef38-4791-9634-242f255756b9n%40googlegroups.com.

Reply via email to