I don't know Python but if it works like other languages then when an event comes in the input callback is called:
def input_callback(session, what, obj):
if (what == "dtmf"):
consoleLog("info", what + " from callback " + obj.digit + "\n")
return
elif (what == "event" and session.getVariable('avmd_detect') == "TRUE"):
consoleLog("info", "Voicemail Detected\n")
The "what" tells you the type of input. In this case you test for what=="dtmf" (for when the user presses a dtmf key) and for what=="event" for when an event comes in. In your specific case you check for an event and to see if the variable avmd_detect is true. If so then you are assuming that this is the mod_avmd event that it's detected a beep. (This is not the optimal method because you can actually check the event headers to make sure it's the correct event. I'll leave that as a research project for you.)
Again, I'm not a Python guy so if someone else could verify my logic/syntax that would be good. Under the elif you have a consoleLog function call. After that line you could put all your code for handling the voicemail. Keep in mind that avmd is non-block, i.e. you aren't forced to sleep while detecting the beep. You could be playing a message or whatnot. As soon as the avmd detects a beep it will send the event and the inputcallback will be called and in your case the elif block will get executed. In that block of code you could stop the playback of your sound file and then initiate a new playback. (I'm assuming that you want to play a message after the beep?) Something like this:
def input_callback(session, what, obj):
if (what == "dtmf"):
consoleLog("info", what + " from callback " + obj.digit + "\n")
return
elif (what == "event" and session.getVariable('avmd_detect') == "TRUE"):
session.execute("avmd", "stop")
consoleLog("info", "Voicemail Detected\n")
session.execute("speak", "flite|kal|'Hi this is '")
return "TRUE"
def handler(session, args):
session.answer()
# session.setVariable("hangup_after_bridge", "false")
callback = session.setInputCallback("input_callback")
session.execute("avmd", "start")
consoleLog("info", "AVMD start\n")
session.execute("sleep", "18000") # this could be a playback
consoleLog("info", "AVMD status %s\n" % session.getVariable('avmd_detect'))
session.execute("avmd", "stop") consoleLog("info", "AVMD stop\n")
session.setHangupHook(hangup_hook)
session.hangup() #hangup the call
I don't think it's any more complicated than that.