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:
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
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:
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
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.90 €0.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 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
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
- Ejecute su aplicación Node.js ejecutando el siguiente comando:
-
Llama a tu número de Vonage desde el «teléfono del usuario» y escucha el mensaje de bienvenida.
-
Abre el teclado numérico y pulsa el 1 o el 2.
-
Contesta la llamada entrante "teléfono agente".
-
Cuelga el teléfono del agente.
-
Escucha el mensaje de la encuesta y pulsa cualquier tecla del primer dispositivo.
-
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.