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