未知:None 异常迭代请求!尝试在 Dialogflow 中检测意图时

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

我正在尝试使用 Dialogflow 接收麦克风输入以获取用户的意图,但是每当我尝试 运行 它时,我都没有收到音频提示并且我收到一条错误消息'None Exception iterating requests!'。 这是我得到的完整错误

---------------------------------------------------------------------------
_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!

这是我用来调用对话流的函数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))

看起来错误来自 request_generator 函数,因为在 dialog-flow 提供的示例中,此函数管理两个参数 audio_configaudio_file_path

如果您注意到,这部分要求本地音频文件中的音频数据被小块读取。

...
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)
...

并且您正在通过 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

此外,如果您使用的是麦克风库,则可以使用 Microphone library 的记录方法创建输出音频文件。请参阅以下帖子以获得更好的方法。