如何解决未知:无迭代请求异常!尝试在Dialogflow中检测意图时
我正在尝试使用Dialogflow接受麦克风输入,以从用户那里获得意图,但是,每当尝试运行它时,都不会收到音频提示,并且会显示一条错误消息,指出“无异常迭代请求! '。 这是我得到的全部错误
---------------------------------------------------------------------------
_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!
这是我用来调用dialogflow api的函数
def detect_intent_stream(project_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_config
和audio_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,它代表计算机上的物理麦克风。也许这就是chunk = audio_file.read(4096)
可能导致此错误的原因(以及您未定义audio_file变量),请检查this post的响应。
此外,如果您使用的是麦克风库,则可以使用Microphone library的录音方法来创建输出音频文件。有关更好的方法,请参见以下帖子。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。