php-docs-samples icon indicating copy to clipboard operation
php-docs-samples copied to clipboard

DialogFlow - Suggested update to detect_intent_stream.php sample script. Avoiding Exception when using OutputAudioConfig()

Open 00j opened this issue 6 years ago • 1 comments

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

00j avatar Jun 07 '19 22:06 00j

This looks good, although shouldn't it be this instead, since we want the final iteration of it?

$queryResult = $response->getQueryResult() ?: $queryResult

bshaffer avatar Jun 13 '19 17:06 bshaffer