php-docs-samples
php-docs-samples copied to clipboard
DialogFlow - Suggested update to detect_intent_stream.php sample script. Avoiding Exception when using OutputAudioConfig()
Hello, Please can I suggest a change?
In this example script:
https://github.com/GoogleCloudPlatform/php-docs-samples/blob/master/dialogflow/src/detect_intent_stream.php
we have the following extract:
foreach ($stream->closeWriteAndReadAll() as $response) {
$recognitionResult = $response->getRecognitionResult();
if ($recognitionResult) {
$transcript = $recognitionResult->getTranscript();
printf('Intermediate transcript: %s' . PHP_EOL, $transcript);
}
}
// get final response and relevant info
if ($response) {
print(str_repeat("=", 20) . PHP_EOL);
$queryResult = $response->getQueryResult();
$queryText = $queryResult->getQueryText();
$intent = $queryResult->getIntent();
$displayName = $intent->getDisplayName();
$confidence = $queryResult->getIntentDetectionConfidence();
$fulfilmentText = $queryResult->getFulfillmentText();
// output relevant info
printf('Query text: %s' . PHP_EOL, $queryText);
printf('Detected intent: %s (confidence: %f)' . PHP_EOL, $displayName,
$confidence);
print(PHP_EOL);
printf('Fulfilment text: %s' . PHP_EOL, $fulfilmentText);
}
Which relies on using $response that is set from the last iteration of the loop and might not always be available.
Suggestion:
$queryResult = null;
foreach ($stream->closeWriteAndReadAll() as $response) {
$recognitionResult = $response->getRecognitionResult();
if ($recognitionResult) {
$transcript = $recognitionResult->getTranscript();
printf('Intermediate transcript: %s' . PHP_EOL, $transcript);
}
$queryResult = !$queryResult && $response->getQueryResult()
? $response->getQueryResult()
: $queryResult;
}
// get final response and relevant info
if ($queryResult) {
print(str_repeat("=", 20) . PHP_EOL);
$queryText = $queryResult->getQueryText();
$intent = $queryResult->getIntent();
$displayName = $intent->getDisplayName();
$confidence = $queryResult->getIntentDetectionConfidence();
$fulfilmentText = $queryResult->getFulfillmentText();
// output relevant info
printf('Query text: %s' . PHP_EOL, $queryText);
printf('Detected intent: %s (confidence: %f)' . PHP_EOL, $displayName,
$confidence);
print(PHP_EOL);
printf('Fulfilment text: %s' . PHP_EOL, $fulfilmentText);
}
In this example setting $queryResult has been moved into the foreach ($stream->closeWriteAndReadAll() as $response) loop because getQueryResult() isn't always available on the final iteration of the loop.
For example when utilising OutputAudioConfig() it is set on the penultimate iteration. Which would throw an exception in the current example and result in the loss of results.
Related issue: https://github.com/googleapis/google-cloud-php/issues/2026
This looks good, although shouldn't it be this instead, since we want the final iteration of it?
$queryResult = $response->getQueryResult() ?: $queryResult