Viaje de voz

En esta guía, usted implementará el siguiente escenario de centro de contacto:

  • El usuario llama a tu número de Vonage,
  • Se lee el saludo inicial y el usuario elige una opción del menú que se le propone,
  • El usuario está conectado a un agente,
  • Una vez que el agente cierra la llamada, el usuario es transferido a una encuesta de satisfacción del cliente.

Para comprender mejor el proceso, consulta Flujo de llamadas.

Requisitos previos

Para completar esta guía, necesitas:

  • A Account de Vonage,
  • El CLI de Vonage instalado y configurado,
  • ngrok - para que los servidores de Vonage puedan acceder a tu servidor web de desarrollo a través de Internet,
  • Node.JS instalado,
  • dos dispositivos de llamada telefónica con números de la red pública (PSTN) asignados —el «teléfono del usuario» y el «teléfono del agente»—, por ejemplo, dos teléfonos móviles o una aplicación con capacidad para realizar llamadas como Vonage Business app.

Instala las dependencias

Instala el express marco de aplicaciones web y body-parser paquetes:

npm install express body-parser

Crear una aplicación de voz

Utilice la CLI para crear una aplicación Voice API con el comando webhooks que se encargará de contestar una llamada a tu número de Vonage (/webhooks/voice/answer) y el registro de eventos de llamadas (/webhooks/voice/event), respectivamente.

Estos webhooks deben ser accesibles por los servidores de Vonage, por lo que en esta guía utilizarás ngrok para exponer su entorno de desarrollo local a la Internet pública. Este artículo explica cómo instalar y ejecutar ngrok y configura Vonage para enviar solicitudes.

Si no tienes una aplicación, puedes crear una mediante la CLI

vonage apps create 'Your application'

✅ Creating Application
Saving private key ... Done!
Application created

Name: Your application
Application ID: 00000000-0000-0000-0000-000000000000
Improve AI: Off
Private/Public Key: Set

Capabilities:
  None Enabled
vonage apps create 'Your application'

✅ Creating Application
Saving private key ... Done!
Application created

Name: Your application
Application ID: 00000000-0000-0000-0000-000000000000
Improve AI: Off
Private/Public Key: Set

Capabilities:
  None Enabled
vonage apps create 'Your application' ✅ Creating Application Saving private key ... Done! Application created Name: Your application Application ID: 00000000-0000-0000-0000-000000000000 Improve AI: Off Private/Public Key: Set Capabilities: None Enabled

El comando devuelve un ID de aplicación (que debes anotar) y la información de tu clave privada (que puedes ignorar sin problema a efectos de esta guía).

Correr ngrok utilizando el siguiente comando:

ngrok http 3000

Anote el nombre de host temporal que ngrok y utilizarlo en lugar de example.com en el siguiente comando:

vonage apps capabilities update 00000000-0000-0000-0000-000000000000 voice `
  --voice-answer-url='https://example.com/webhooks/voice/answer' `
  --voice-event-url='https://example.com/webhooks/voice/event' `
  --voice-fallback-url='https://example.com/webhooks/voice/fallback'
  
✅ Fetching Application
✅ Adding voice capability to application 00000000-0000-0000-0000-000000000000

Name: Your application
Application ID: 00000000-0000-0000-0000-000000000000
Improve AI: Off
Private/Public Key: Set

Capabilities:
 VOICE:
    Uses Signed callbacks: On
    Conversation TTL: 41 hours
    Leg Persistence Time: 6 days
    Event URL: [POST] https://example.com/webhooks/voice/event
    Answer URL: [POST] https://example.com/webhooks/voice/answer
    Fallback URL: [POST] https://example.com/webhooks/voice/fallback
vonage apps capabilities update 00000000-0000-0000-0000-000000000000 voice ^
  --voice-answer-url='https://example.com/webhooks/voice/answer' ^
  --voice-event-url='https://example.com/webhooks/voice/event' ^
  --voice-fallback-url='https://example.com/webhooks/voice/fallback'
  
✅ Fetching Application
✅ Adding voice capability to application 00000000-0000-0000-0000-000000000000

Name: Your application
Application ID: 00000000-0000-0000-0000-000000000000
Improve AI: Off
Private/Public Key: Set

Capabilities:
 VOICE:
    Uses Signed callbacks: On
    Conversation TTL: 41 hours
    Leg Persistence Time: 6 days
    Event URL: [POST] https://example.com/webhooks/voice/event
    Answer URL: [POST] https://example.com/webhooks/voice/answer
    Fallback URL: [POST] https://example.com/webhooks/voice/fallback
vonage apps capabilities update 00000000-0000-0000-0000-000000000000 voice \ --voice-answer-url='https://example.com/webhooks/voice/answer' \ --voice-event-url='https://example.com/webhooks/voice/event' \ --voice-fallback-url='https://example.com/webhooks/voice/fallback' ✅ Fetching Application ✅ Adding voice capability to application 00000000-0000-0000-0000-000000000000 Name: Your application Application ID: 00000000-0000-0000-0000-000000000000 Improve AI: Off Private/Public Key: Set Capabilities: VOICE: Uses Signed callbacks: On Conversation TTL: 41 hours Leg Persistence Time: 6 days Event URL: [POST] https://example.com/webhooks/voice/event Answer URL: [POST] https://example.com/webhooks/voice/answer Fallback URL: [POST] https://example.com/webhooks/voice/fallback

Comprar un número de teléfono

Para gestionar las llamadas entrantes a tu aplicación, necesitas un número de Vonage. Si ya dispones de un número, pasa a la siguiente sección para asociar ese número a tu aplicación.

Puedes utilizar el CLI de Vonage para comprar el número de teléfono:

Buscar un número

Puedes comprar un número mediante la CLI de Vonage. El siguiente comando busca un número para comprarlo (especifica un código de país alternativo de dos caracteres comprar un número en otro país).

vonage numbers search US

✅ Searching for numbers

There is 1 number available for purchase in United States

Number       Type    Features         Monthly Cost  Setup Cost
-----------  ------  ---------------  ------------  ----------
16127779311  Mobile  MMS, SMS, VOICE  €0.900.00

Use vonage numbers buy to purchase.
vonage numbers search US

✅ Searching for numbers

There is 1 number available for purchase in United States

Number       Type    Features         Monthly Cost  Setup Cost
-----------  ------  ---------------  ------------  ----------
16127779311  Mobile  MMS, SMS, VOICE0.900.00

Use vonage numbers buy to purchase.
vonage numbers search US ✅ Searching for numbers There is 1 number available for purchase in United States Number Type Features Monthly Cost Setup Cost ----------- ------ --------------- ------------ ---------- 16127779311 Mobile MMS, SMS, VOICE €0.90 €0.00 Use vonage numbers buy to purchase.

Comprar un número

Una vez que haya encontrado un número que le satisfaga, puede comprarlo utilizando el botón vonage numbers buy comando:

vonage numbers buy US 16127779311 
✅ Searching for numbers
Are you sure you want to purchase the number 16127779311 for0.90? [y/n] y

✅ Purchasing number
Number 16127779311 purchased

Number: 16127779311 
Country: 🇺🇸 United States
Type: Mobile
Features: MMS, SMS, VOICE
Monthly Cost: €0.90
Setup Cost: €0.00
Linked Application ID: Not linked to any application
Voice Callback: Not Set
Voice Callback Value: Not Set
Voice Status Callback: Not Set
vonage numbers buy US 16127779311 
✅ Searching for numbers
Are you sure you want to purchase the number 16127779311 for0.90? [y/n] y

✅ Purchasing number
Number 16127779311 purchased

Number: 16127779311 
Country: 🇺🇸 United States
Type: Mobile
Features: MMS, SMS, VOICE
Monthly Cost: €0.90
Setup Cost: €0.00
Linked Application ID: Not linked to any application
Voice Callback: Not Set
Voice Callback Value: Not Set
Voice Status Callback: Not Set
vonage numbers buy US 16127779311 ✅ Searching for numbers Are you sure you want to purchase the number 16127779311 for €0.90? [y/n] y ✅ Purchasing number Number 16127779311 purchased Number: 16127779311 Country: 🇺🇸 United States Type: Mobile Features: MMS, SMS, VOICE Monthly Cost: €0.90 Setup Cost: €0.00 Linked Application ID: Not linked to any application Voice Callback: Not Set Voice Callback Value: Not Set Voice Status Callback: Not Set

Ya está listo para escribir el código de su aplicación.

Escribe tu webhook de respuesta

Cuando Vonage reciba una llamada entrante en tu número virtual, realizará una solicitud a tus /webhooks/answer ruta. Esta ruta debe aceptar una dirección HTTP GET y devuelve un Objeto de control de llamadas de Nexmo (NCCO) que indica a Vonage cómo gestionar la llamada.

Su OCN debe utilizar el talk para saludar a la persona que llama, y la acción input acción para obtener usuario Entrada DTMF (tecla pulsada):

app.get('/webhooks/voice/answer', (request, response) => {
  console.log('answer: ', request.query)

  const ncco = [{
    action: 'talk',
    text: 'Thank you for calling Example Inc.! Press 1 to talk to the sales department, press 2 to get technical support.',
    bargeIn: true
  },
    {
      action: 'input',
      eventUrl: [
        `${request.protocol}://${request.get('host')}/webhooks/input`],
      type: [ 'dtmf' ],
      dtmf: {
        maxDigits: 1
      }
    }
  ]

  response.json(ncco)
})

Escriba su webhook de eventos

Implemente un webhook que capture eventos de llamada para que pueda observar el ciclo de vida de la llamada en la consola:

app.post('/webhooks/voice/event', (request, response) => {
  console.log('event:', request.body)
  response.sendStatus(200);
})

Vonage ofrece un POST a este punto final cada vez que cambia el estado de la llamada.

Escribe tu webhook de entrada

Los resultados de la entrada DTMF se enviarán a la URL específica que establezca en la opción input acción: /webhooks/input. Añade un webhook para procesar el resultado e incorporar alguna interacción con el usuario.

En caso de reconocimiento correcto, la carga útil de la solicitud tendrá el siguiente aspecto:

{
  "speech": {
  },
  "dtmf": {
    "digits": "1",
    "timed_out": true
  },
  "from": USER_NUMBER,
  "to": VONAGE_NUMBER,
  "uuid": "abfd679701d7f810a0a9a44f8e298b33",
  "conversation_uuid": "CON-64e6c8ef-91a9-4a21-b664-b00a1f41340f",
  "timestamp": "2020-04-17T17:31:53.638Z"
}

Recupera la entrada del usuario desde el dtmf.digits para determinar las opciones que han seleccionado. Para conectar tanto al usuario como al agente del departamento correspondiente, crearás una llamada saliente al endpoint del agente. Puede utilizar un número de teléfono de prueba en este ejemplo para simplificar, por ejemplo, su número de móvil. En la vida real, el punto final podría ser un número RTC o Punto final SIP para conectar tu PBX o centro de contacto existente. También podría ser un cliente WebRTC si está desarrollando su solución de centro de contacto desde cero: el cliente Vonage Client SDK ofrece todo lo necesario para implementar tu propia aplicación para agentes de centro de atención al cliente.

Por último, ambas llamadas (tramos) deben trasladarse a una sala de conferencias (denominada conversación). Para ello, debe utilizar conversation acción con el mismo name tanto para la llamada del usuario (el tramo de entrada) como para el tramo del agente (la llamada de salida). Para generar el nombre de la conversación, puede utilizar cualquier método de generación de ID único, por ejemplo, utilizando la marca de tiempo real.

Si lo prefieres, puedes utilizar connect en la OCN para conectar al usuario con el agente. La diferencia es que con connectLa llamada se completará inmediatamente cuando alguno de los participantes cuelgue y sólo quede un tramo. Por lo tanto, sería imposible transferir al usuario a la encuesta después de la llamada; si eso no es necesario en su caso, connect es una opción un poco más práctica. Si desea que el usuario siga conectado después de que el agente finalice la llamada, elija conversation tal y como se muestra en el ejemplo siguiente.

Añadir el código para manejar la devolución de llamada de entrada:

app.post('/webhooks/input', (request, response) => {
  console.log('input:', request.body)

  // generating unique conversation name
  var conversationName = 'conversation_' + Date.now()

  console.log('conversationName: ', conversationName)

  // selecting agent/department endpoint
  var departmentId = request.body.dtmf.digits
  var department = ''
  var departmentNumber = ''

  switch (departmentId) {
    case '1':
      department = 'Sales'
      departmentNumber = AGENT_NUMBER
      break
    case '2':
      department = 'Support'
      departmentNumber = OTHER_AGENT_NUMBER //you can use the same number for the sample
      break
    default:
      break
  }

  var ncco = ''

  if (department != '') {
      // NCCO for the user leg
    ncco = [{
      action: 'talk',
      text: 'Please wait while we connect you to ' + department
    }, {
      action: 'conversation',
      name: conversationName
    }
    ]

    // creating the agent leg and moving it to the same conversation
    vonage.calls.create({
      to: [
        {
          type: 'phone',
          number: departmentNumber
        }
      ],
      from: {
        type: 'phone',
        number: VONAGE_NUMBER
      },
      ncco: [
        {
          action: 'conversation',
          name: conversationName
        }]

    }, (error, response) => {
      if (error) console.error('outbound error:', error)
      if (response) {
          console.log('outbound ok')
      }
    })
  } else { // something went wrong, fallback route
    ncco = [{
      action: 'talk',
      text: 'Press 1 to talk to the sales department, press 2 to get technical support.',
      bargeIn: true
    }, {
      action: 'input',
      eventUrl: [
        `${request.protocol}://${request.get('host')}/webhooks/input`
      ],
      dtmf: {
        maxDigits: 1
      }
    }]
  }
  
  response.json(ncco)
})  

Añadir encuesta OCN

A continuación, para aplicar la encuesta de satisfacción del cliente al final de la llamada, deberá gestionar completed del agente. Llegará al mismo webhook de evento, por lo que deberá ampliar el webhook de evento con solicitud de traslado a la encuesta NCCO. Para ello, debes guardar los identificadores del usuario y del tramo del agente:

var userLegId = ''
var agentLegId = ''

app.get('/webhooks/answer', (request, response) => {
  console.log('answer: ', request.query)

  userLegId = request.query.uuid

  console.log('userLegId: ', userLegId)
  

...

app.post('/webhooks/input', (request, response) => {
  console.log('input:', request.body)

    // creating the agent's leg and moving it to the same conversation
    vonage.calls.create({
        ...
    }, (error, response) => {
      if (error) console.error('outbound error:', error)
      if (response) {
        agentLegId = response.uuid
        console.log('agentLegId: ', agentLegId)
      }
    })
  } else ...

En el escenario de la vida real, deberías implementar una caché para almacenar los pares de identificadores de pata de usuario/agente. El código de ejemplo que se muestra en esta guía sólo funcionará correctamente para una llamada concurrente.

Amplíe su webhook de eventos con el método de llamada de actualización de la API REST con NCCO en línea con talk y input acciones para mover la pierna del usuario a la parte de la encuesta:

app.post('/webhooks/event', (request, response) => {
  console.log('event:', request.body)

  if (request.body.uuid == agentLegId && request.body.status == 'completed') {
    vonage.calls.update(userLegId, {
      action: 'transfer',
      destination: {
        type: 'ncco',
        ncco: [ {
          action: 'talk',
          text: 'Please valuate quality of service by entering a digit, 1 to 5'
        },
        {
          action: 'input',
          type: [ 'dtmf' ],
          dtmf: {
            maxDigits: 1
          },
          eventUrl: [ `${request.protocol}://${request.get('host')}/webhooks/survey` ]
        }
        ]
      }
    }, (err, res) => {
      if (err) {
        console.error('transfer error:', err)
      } else {
        console.log('transfer ok')
      }
    })
  }
  
  response.sendStatus(200)
})

Escriba el webhook de su encuesta

Añade un webhook de la encuesta para imprimir los resultados:

app.post('/webhooks/survey', (request, response) => {
  console.log('survey: ', request.body)

  var phone = request.body.from
  var date = request.body.timestamp
  var score = request.body.dtmf.digits

  console.log('[%s] User %s gave %d', date, phone, score)

  const ncco = [
    {
      action: 'talk',
      text: 'Thank you, good bye.'
    }
  ]

  response.json(ncco)
})

Crea tu servidor Node.js

Por último, escribe el código para instanciar tu servidor Node.js:

const port = 3000
app.listen(port, () => console.log(`Listening on port ${port}`))

Prueba tu aplicación

  1. Ejecute su aplicación Node.js ejecutando el siguiente comando:
node index.js
  1. Llama a tu número de Vonage desde el «teléfono del usuario» y escucha el mensaje de bienvenida.

  2. Abre el teclado numérico y pulsa el 1 o el 2.

  3. Contesta la llamada entrante "teléfono agente".

  4. Cuelga el teléfono del agente.

  5. Escucha el mensaje de la encuesta y pulsa cualquier tecla del primer dispositivo.

  6. Observe el registro de la consola para ver el resultado de la encuesta.

Solución de problemas

Si no escuchas el sonido del usuario y del agente, potencialmente puede ser porque las dos piernas están siendo procesadas en diferentes lugares. Puede determinar esto viendo diferentes conversation_uuid_to valores en el transfer para las patas de usuario y agente. Para solucionarlo, intente configurar el SDK para utilizar un centro de datos específico como se describe en la sección Guía de resolución de problemas:

const options = {
  apiHost: 'api-us-1.nexmo.com',
  restHost: 'rest-us-1.nexmo.com'
}

const vonage = new Vonage({
  apiKey: VONAGE_API_KEY,
  apiSecret: VONAGE_API_SECRET
  applicationId: VONAGE_APPLICATION_ID,
  privateKey: VONAGE_APPLICATION_PRIVATE_KEY_PATH
}, options)

Conclusión

Con Voice API de Vonage puedes potenciar tu solución de centro de contacto existente con IVR de cualquier complejidad lógica, que depende sólo de tu caso de uso objetivo y es prácticamente ilimitada. O puedes crear tu propia solución desde cero usando Voice API y Client SDK. Alternar entre la parte guionizada de la llamada y la conversación en directo (y viceversa) le permite combinar cualquier caso de uso de las llamadas telefónicas y crear una experiencia del cliente sin fisuras.

¿Y ahora qué?

  • Más información Flujo de llamadas con la Voice API
  • Aprende a crear un menú de llamadas (respuesta de voz interactiva) desde cero siguiendo nuestro tutorial
  • Mejore la experiencia del cliente con Reconocimiento de vozcomo alternativa o junto con la entrada DTMF;
  • Ver cómo utilizar Grabación de llamadas para futuras consultas y análisis posteriores a la llamada;
  • Accede directamente a los medios de comunicación con WebSockets para el análisis en tiempo real y la integración de la inteligencia artificial.
  • Comprobar IA de Vonage Te ofrecemos la posibilidad de que nuestros expertos desarrollen un sistema IVR o un bot de voz adaptado a tu caso concreto.