def _generator(self): """Generator function that continuously yields audio chunks from the buffer. Used to stream data to the Google Speech API Asynchronously. :return A streaming request with the audio data. First request carries config data per Dialogflow docs. :rtype: Iterator[:class:`StreamingDetectIntentRequest`] """ # First message contains session, query_input, and params query_input = QueryInput(audio_config=self._audio_config) contexts = utils.converters.contexts_msg_to_struct(self.last_contexts) params = QueryParameters(contexts=contexts) req = StreamingDetectIntentRequest( session=self._session, query_input=query_input, query_params=params, single_utterance=True, output_audio_config=self._output_audio_config ) yield req if self.USE_AUDIO_SERVER: with AudioServerStream() as stream: audio_generator = stream.generator() for content in audio_generator: yield StreamingDetectIntentRequest(input_audio=content) else: with MicrophoneStream() as stream: audio_generator = stream.generator() for content in audio_generator: yield StreamingDetectIntentRequest(input_audio=content)
def event_intent(self, event): """Send an event message to Dialogflow :param event: The ROS event message :type event: DialogflowEvent :return: The result from dialogflow as a ROS msg :rtype: DialogflowResult """ # Convert if needed if type(event) is DialogflowEvent: event_input = utils.converters.events_msg_to_struct(event) else: event_input = event query_input = QueryInput(event=event_input) params = utils.converters.create_query_parameters( contexts=self.last_contexts ) response = self._session_cli.detect_intent( session=self._session, query_input=query_input, query_params=params, output_audio_config=self._output_audio_config ) df_msg = utils.converters.result_struct_to_msg(response.query_result) if self.PLAY_AUDIO: self._play_stream(response.output_audio) return df_msg
def detect_intent_text(self, msg): """Use the Dialogflow API to detect a user's intent. Goto the Dialogflow console to define intents and params. :param msg: DialogflowRequest msg :return query_result: Dialogflow's query_result with action parameters :rtype: DialogflowResult """ # Create the Query Input text_input = TextInput(text=msg.query_text, language_code=self._language_code) query_input = QueryInput(text=text_input) # Create QueryParameters user_contexts = utils.converters.contexts_msg_to_struct(msg.contexts) self.last_contexts = utils.converters.contexts_msg_to_struct( self.last_contexts) contexts = self.last_contexts + user_contexts params = QueryParameters(contexts=contexts) try: self.contaChiamateApi += 1 #incremento il contatore chiamate Api response = self._session_cli.detect_intent( session=self._session, query_input=query_input, query_params=params, output_audio_config=self._output_audio_config) except google.api_core.exceptions.ServiceUnavailable: rospy.logwarn( "DF_CLIENT: Deadline exceeded exception caught. The response " "took too long or you aren't connected to the internet!") else: # Store context for future use self.last_contexts = utils.converters.contexts_struct_to_msg( response.query_result.output_contexts) df_msg = utils.converters.result_struct_to_msg( response.query_result) # stampo i risultati #rospy.loginfo(utils.output.print_result(response.query_result)) rospy.loginfo(utils.output.print_result(response.query_result)) # Play audio if self.PLAY_LOCAL_AUDIO: self._results_pub.publish(df_msg) if self.PLAY_GOOGLE_AUDIO: self._play_stream(response.output_audio) return df_msg