# -*- coding: utf-8 -*- """ A simple application that answers an inbound call, speaks some TTS, detects some speech and plays back the speech that was detected. Actions: - check the channel state - ring and answer - play some tts - detect a spoken response - play what was detected - hang up The speech detection grammar used is pre-defined. """ from prosody.uas import Hangup, Error import time __uas_version__ = "0.0.1" __uas_identify__ = "application" def main(channel, application_instance_id, file_man, my_log, application_parameters): return_code = 0 try: # check the incoming channel state state = channel.state() if state == channel.State.CALL_INCOMING: state = channel.ring() # this can raise a Hangup exception if state == channel.State.RING_INCOMING: state = channel.answer() # this can raise a Hangup exception else: raise Hangup('No inbound call, state is {0}'.format(state)) if state != channel.State.ANSWERED: raise Hangup('Failed to answer inbound call, state is {0}'.format(state)) my_log.info("Answered an inbound call") # log at info level channel.FileRecorder.start("speech_test_{0}.wav".format(application_instance_id)) # prepare the speech detector, speech detection will begin as soon # as the prompt has finished playing my_grammar = channel.SpeechDetector.Grammar() my_grammar.create_from_predefined('SixteenToNinetyNine') if channel.SpeechDetector.prime(my_grammar, channel.SpeechDetector.SpeechDetectorTrigger.ONPLAYEND) is False: raise Error("Speech detector failed to start") # Say the TTS prompt, the text will ask the caller their age, a value from sixteen to ninety nine. cause = channel.FilePlayer.say("How old are you?") if cause != channel.FilePlayer.Cause.NORMAL: raise Error("Say prompt failed: cause is {0}".format(cause)) # Now get the recognised speech, can be words or DTMF digits response = channel.SpeechDetector.get_recognised_speech() if channel.SpeechDetector.cause() == channel.SpeechDetector.Cause.BARGEIN: # age is 16 to 99, so we want two digits age = channel.DTMFDetector.get_digits(count=2) else: age = response.get_recognised_words_as_string() if not age: to_say = "Sorry, I did not hear that." else: to_say = "Your age is {0}.".format(age) # Say the recognised speech. cause = channel.FilePlayer.say("{0}".format(to_say)) if cause != channel.FilePlayer.Cause.NORMAL: raise Error("TTS player returned {0}: expected {1}".format(cause, channel.FilePlayer.Cause.NORMAL)) # Bye bye. cause = channel.FilePlayer.say("Bye bye.") if cause != channel.FilePlayer.Cause.NORMAL: raise Error("Say bye bye failed: cause is {0}".format(cause)) except Hangup as exc: my_log.info("Hangup exception reports: {0}".format(exc)) # in this app a hangup is not an error, return a positive value return_code = -100 except Error as exc: # for error conditions return a negative value my_log.error("Error exception reports: {0}".format(exc)) return_code = -101 except Exception as exc: # an unexpected exception, return a negative value my_log.exception("Unexpected exception reports: {0}".format(exc)) return_code = -102 finally: channel.FileRecorder.stop() if channel.state() != channel.State.IDLE: channel.hang_up() return return_code