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:
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()"
"
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.