1

I am able to dial one digit with DTMF by calling into Voximplant who is connected with DialogFlow. I have followed this scenario, but as the code states in line 147, // ToDo: aggregate multiple DTMF keys that are pressed in succession and send as a single string.

Have anyone been able to dial inn more than one digit or could guide me to the correct example of doing this?

1 Answers1

0

I have made a more comprehensive example for Voximplant that handles multiple DTMF entry. This requires a few extra parameters to control how many digits and when to stop collecting DTMF before reporting it back:

// Configurable via custom payload
let interToneTime = 3000               // Default time to wait for the next DTMF digit after one is pressed
let maxToneDigits = 12                 // Default number of DTMF digits to look for after one is pressed
let dtmfMode = "event"                 // Send DTMF key presses as events or as "text"
let stopTones = []                     // DTMF tones used to indicate end of digit entry

I then expanded on the original onTone function in the DTMF example from cogint.ai you linked to:

function onTone(e) {
  Logger.write("DEBUG: onTone called: " + e.tone) // on iteration #" + cnt)

  if (stopTones.includes(e.tone)){
    Logger.write("DEBUG: stopTone entered: " + e.tone);
    toneTimerCallback()
    return
  }

  noInputTimer.stop()
  toneCount++;
  tones.push(e.tone)

  if (toneCount >= maxToneDigits){
    Logger.write("DEBUG: maximum number of specified tones reached: " + toneCount) // on iteration #" + cnt)
    toneTimerCallback()
  }
  else
    toneTimer.start()

}

This essentially pushes the tone into an array and calls the toneTimerCallback function if a stop tone is pressed (i.e. this is usually # or *) or if maxToneDigits is exceeded.

The toneTimerCallback just converts the digits to a string and sends them to Dialogflow:

function toneTimerCallback() {
  let toneString = tones.join('').toString()  // bug requires adding an extra .toString()
  
  if (toneString == '') {
    Logger.write("DEBUG: toneTimerCallback - invalid toneString: " + toneString)
    return
  }

  Logger.write("DEBUG: sending DTMF in " + dtmfMode + "mode : " + toneString)
  if (dtmfMode == "event")
    dialogflow.sendQuery({ event: { name: "DTMF", language_code: "en", parameters: { dtmf_digits: toneString } } })
  else if (dtmfMode == "text")
     dialogflow.sendQuery({ text: { text: toneString.toString(),  language_code: "en" }}) // bug requires adding an extra .toString()

  toneCount = 0
  tones = []
}

This shows how to send the digits as a text input or as an event.

Other related parts in the gist show how to set these parameters on a per-intent basis using custom payloads. This for example, could let you specify a max of 5 digits for a ZIP code in one intent and set 10 for another that asks for a phone number.

isherwood
  • 58,414
  • 16
  • 114
  • 157
Chad
  • 183
  • 6