Search code examples
pythongoogle-cloud-platformdialogflow-esmicrophone

Unknown: None Exception iterating requests! When trying to detect intent in Dialogflow


I am trying to use Dialogflow to take in microphone input to get an intent from the user, however whenever I try and run it, I am not getting a prompt for audio and I get an error stating 'None Exception iterating requests!'. Here's the full error I get

---------------------------------------------------------------------------
_MultiThreadedRendezvous                  Traceback (most recent call last)
c:\users\abala\appdata\local\programs\python\python38\lib\site-packages\google\api_core\grpc_helpers.py in error_remapped_callable(*args, **kwargs)
    149             prefetch_first = getattr(callable_, "_prefetch_first_result_", True)
--> 150             return _StreamingResponseIterator(result, prefetch_first_result=prefetch_first)
    151         except grpc.RpcError as exc:

c:\users\abala\appdata\local\programs\python\python38\lib\site-packages\google\api_core\grpc_helpers.py in __init__(self, wrapped, prefetch_first_result)
     72             if prefetch_first_result:
---> 73                 self._stored_first_result = six.next(self._wrapped)
     74         except TypeError:

c:\users\abala\appdata\local\programs\python\python38\lib\site-packages\grpc\_channel.py in __next__(self)
    415     def __next__(self):
--> 416         return self._next()
    417 

c:\users\abala\appdata\local\programs\python\python38\lib\site-packages\grpc\_channel.py in _next(self)
    705                 elif self._state.code is not None:
--> 706                     raise self
    707 

_MultiThreadedRendezvous: <_MultiThreadedRendezvous of RPC that terminated with:
    status = StatusCode.UNKNOWN
    details = "Exception iterating requests!"
    debug_error_string = "None"
>

The above exception was the direct cause of the following exception:

Unknown                                   Traceback (most recent call last)
<ipython-input-43-08553cb9dc4e> in <module>
----> 1 prods = getResponseStream()

<ipython-input-42-54a2ce08e87f> in getResponseStream()
      5     sess_id = '123456789'
      6     lang = 'en-US'
----> 7     response = detect_intent_stream(p_id,sess_id,lang)
      8 
      9     related_prods = []

<ipython-input-41-84442e760865> in detect_intent_stream(project_id, session_id, language_code)
     41 
     42     requests = request_generator(audio_config)
---> 43     responses = session_client.streaming_detect_intent(requests)
     44 
     45     print('=' * 20)

c:\users\abala\appdata\local\programs\python\python38\lib\site-packages\dialogflow_v2\gapic\sessions_client.py in streaming_detect_intent(self, requests, retry, timeout, metadata)
    402             )
    403 
--> 404         return self._inner_api_calls["streaming_detect_intent"](
    405             requests, retry=retry, timeout=timeout, metadata=metadata
    406         )

c:\users\abala\appdata\local\programs\python\python38\lib\site-packages\google\api_core\gapic_v1\method.py in __call__(self, *args, **kwargs)
    143             kwargs["metadata"] = metadata
    144 
--> 145         return wrapped_func(*args, **kwargs)
    146 
    147 

c:\users\abala\appdata\local\programs\python\python38\lib\site-packages\google\api_core\retry.py in retry_wrapped_func(*args, **kwargs)
    279                 self._initial, self._maximum, multiplier=self._multiplier
    280             )
--> 281             return retry_target(
    282                 target,
    283                 self._predicate,

c:\users\abala\appdata\local\programs\python\python38\lib\site-packages\google\api_core\retry.py in retry_target(target, predicate, sleep_generator, deadline, on_error)
    182     for sleep in sleep_generator:
    183         try:
--> 184             return target()
    185 
    186         # pylint: disable=broad-except

c:\users\abala\appdata\local\programs\python\python38\lib\site-packages\google\api_core\timeout.py in func_with_timeout(*args, **kwargs)
    212             """Wrapped function that adds timeout."""
    213             kwargs["timeout"] = next(timeouts)
--> 214             return func(*args, **kwargs)
    215 
    216         return func_with_timeout

c:\users\abala\appdata\local\programs\python\python38\lib\site-packages\google\api_core\grpc_helpers.py in error_remapped_callable(*args, **kwargs)
    150             return _StreamingResponseIterator(result, prefetch_first_result=prefetch_first)
    151         except grpc.RpcError as exc:
--> 152             six.raise_from(exceptions.from_grpc_error(exc), exc)
    153 
    154     return error_remapped_callable

c:\users\abala\appdata\local\programs\python\python38\lib\site-packages\six.py in raise_from(value, from_value)

Unknown: None Exception iterating requests!

Here's the function I use to call the dialogflow api

def detect_intent_stream(project_id, session_id,
                         language_code):
    """Returns the result of detect intent with streaming audio as input.

    Using the same `session_id` between requests allows continuation
    of the conversation."""
    import dialogflow_v2 as dialogflow
    session_client = dialogflow.SessionsClient()

    # Note: hard coding audio_encoding and sample_rate_hertz for simplicity.
    audio_encoding = dialogflow.enums.AudioEncoding.AUDIO_ENCODING_LINEAR_16
    sample_rate_hertz = 16000

    session_path = session_client.session_path(project_id, session_id)
    print('Session path: {}\n'.format(session_path))

    def request_generator(audio_config):
        query_input = dialogflow.types.QueryInput(audio_config=audio_config)

        # The first request contains the configuration.
        yield dialogflow.types.StreamingDetectIntentRequest(
            session=session_path, query_input=query_input)

        # Here we are reading small chunks of audio data from a local
        # audio file.  In practice these chunks should come from
        # an audio input device.
        r = sr.Recognizer()
        speech = sr.Microphone(device_index=1)
        with speech as source:
            while True:
                chunk = audio_file.read(4096)
                if not chunk:
                    break
                # The later requests contains audio data.
                yield dialogflow.types.StreamingDetectIntentRequest(
                    input_audio=chunk)

    audio_config = dialogflow.types.InputAudioConfig(
        audio_encoding=audio_encoding, language_code=language_code,
        sample_rate_hertz=sample_rate_hertz)

    requests = request_generator(audio_config)
    responses = session_client.streaming_detect_intent(requests)

    print('=' * 20)
    for response in responses:
        print('Intermediate transcript: "{}".'.format(
                response.recognition_result.transcript))

    # Note: The result from the last response is the final transcript along
    # with the detected content.
    query_result = response.query_result

    print('=' * 20)
    print('Query text: {}'.format(query_result.query_text))
    print('Detected intent: {} (confidence: {})\n'.format(
        query_result.intent.display_name,
        query_result.intent_detection_confidence))
    print('Fulfillment text: {}\n'.format(
        query_result.fulfillment_text))

Solution

  • It looks like that the error comes from request_generator function because in the example provided by dialog-flow, this function manage two parameters audio_config and audio_file_path.

    If you notice, in this part is required the audio data from a local audio file to be read by small chunks.

    ...
    r = sr.Recognizer()
    speech = sr.Microphone(device_index=1)
    
    # Here we are reading small chunks of audio data from a local
    # audio file.  In practice these chunks should come from
    # an audio input device.
    with speech as source:
        while True:
            chunk = audio_file.read(4096)
    ...
    

    And you are passing the Microphone instance, which represents a physical microphone on the computer. Maybe this is the reason why chunk = audio_file.read(4096) could be causin this error (As well as you have undefined the audio_file variable), check the response of this post.

    Additionally, if you are using the Microphone library you can create the output audio file by using the record method of the Microphone library. See the following posts for a better approach.