
Teilen Sie:
Michael ist ein polyglotter Software-Ingenieur, der sich dafür einsetzt, die Komplexität von Systemen zu reduzieren und sie berechenbarer zu machen. Er arbeitet mit einer Vielzahl von Sprachen und Tools und gibt sein technisches Fachwissen auf Benutzergruppen und Konferenzen in der ganzen Welt weiter. Im Alltag ist Michael ein ehemaliger Developer Advocate bei Vonage, wo er seine Zeit damit verbrachte, über alle Arten von Technologie zu lernen, zu lehren und zu schreiben.
Anrufflüsterung mit selektiver Audiosteuerung
Lesedauer: 5 Minuten
Nexmo ist seit langem eine beliebte Wahl für Contact-Center-Lösungen, aber mit der heutigen Veröffentlichung von Selective Audio Controls heben wir sie auf die nächste Stufe. Selektive Audiosteuerung löst einen häufigen Anwendungsfall - ein Vorgesetzter hört einen Anruf, aber nur sein Mitarbeiter und nicht der Kunde - auf intuitive Weise.
Jedem Teilnehmer an einem Gespräch auf der Nexmo-Plattform wird eine ID zugewiesen. Mit Hilfe dieser IDs und der Gesprächsaktion können Sie eine Anwendung erstellen, die steuert, welche Teilnehmer ein neuer Gesprächsteilnehmer hören kann. In diesem Beitrag werden wir den Anwendungsfall "Vorgesetzter hört einem Mitarbeiter zu" erstellen.
Der Code für diese Anwendung ist verfügbar auf Github
Bootstrapping einer Anwendung
Um diesen Anrufablauf zu erstellen, müssen wir eine kleine node.js-Anwendung schreiben. Wir erstellen ein neues Projekt und installieren express um unsere answer_url.
Sobald Sie dies getan haben, müssen Sie eine Instanz von expresserstellen, eine answer_url und auf einem Port lauschen. Um dies zu tun, erstellen Sie index.js mit dem folgenden Inhalt:
const express = require('express');
const bodyParser = require('body-parser');
const app = express();
app.use(bodyParser.urlencoded({"extended": true}));
app.use(bodyParser.json());
app.get('/webhooks/answer', (req, res) => {
return res.json([]);
});
app.listen(3000, () => {
console.log('Listening');
});
Erstellen Ihrer Antwort-URL
Nachdem wir nun eine Anwendung gebootet haben, ist es an der Zeit, unsere Geschäftslogik hinzuzufügen. Es gibt drei Teilnehmer in unserem Gespräch:
Alice, die Leiterin des Kontaktzentrums
Bob, der Mitarbeiter des Kontaktzentrums
Charlie, der Kunde
In der realen Welt würden wir eine Datenbank verwenden, um alle Informationen zu speichern, die für diesen Vorgang benötigt werden, aber für diesen Beitrag wollen wir einfach ein Objekt im Speicher verwenden. Der Schlüssel ist die Telefonnummer des Teilnehmers, die einem Objekt zugeordnet ist, das Informationen über ihn enthält. Im Moment ist es nur ihre Rolle. Fügen Sie den folgenden Code nach app.use(bodyParser.json());ein, wobei Sie darauf achten, dass Sie den Code unten aktualisieren und die Schlüssel durch Ihre echten Telefonnummern ersetzen.
const conversationName = 'selective-audio-demo';
const participants = {
"<supervisor_phone_number>": {
"role": "supervisor",
},
"<agent_phone_number>": {
"role": "agent",
},
"<customer_phone_number>": {
"role": "customer",
}
};Wenn Sie das getan haben, müssen Sie Ihre /webhooks/answer URL aktualisieren, damit sie einen gültigen NCCO zurückgibt. Da wir für jede Art von Anrufer einen anderen NCCO benötigen, fügen wir eine switch Anweisung hinzufügen und eine Methode aufrufen, die einen NCCO für jeden Anrufertyp zurückgibt:
app.get('/webhooks/answer', (req, res) => {
const caller = participants[req.query.from];
if (!caller) {
return res.status(400).json("Unknown caller type: " + req.query.from);
}
// Generate an NCCO based on role
let ncco;
switch (caller.role) {
case 'supervisor':
ncco = createSupervisorNcco(caller);
break;
case 'agent':
ncco = createAgentNcco(caller);
break;
case 'customer':
ncco = createCustomerNcco(caller);
break;
default:
return res.status(400).json("Unknown caller type: " + caller.type);
}
return res.json(ncco);
});
Dieser Code ruft createSupervisorNcco, createAgentNcco oder createCustomerNcco auf, je nachdem, welcher Typ von Aufrufer angegeben wurde. Wir müssen fortfahren und diese Funktionen erstellen und NCCO zurückgeben.
Der Kunde NCCO
Beginnen wir mit dem Kunden-NCCO. Wenn der Kunde sich anmeldet, soll er den Agenten, nicht aber den Supervisor hören und sowohl mit dem Agenten als auch mit dem Supervisor sprechen können. Außerdem soll der Kunde, wenn er anruft, in der Warteschleife gehalten werden, bis sich ein Mitarbeiter in das Gespräch einschaltet.
Fügen Sie das Folgende am Ende Ihrer Datei hinzu, um die Kunden-NCCO zu erstellen. Wir verwenden die conversation Aktion, geben der Konversation einen nameund geben an, dass der Anruf nicht automatisch gestartet werden soll und dass der Benutzer in die Warteschleife gelegt werden soll. Dies sind alles bestehende Parameter für die Nexmo Voice API.
Was dieses NCCO interessant macht, sind die canSpeak und canHear Parameter. Diese beiden Parameter akzeptieren eine Liste von UUIDs, die andere Teilnehmer identifizieren, und steuern, mit wem die Person, die sich dem Anruf anschließt, sprechen und wen sie hören kann. Wenn die UUID eines Teilnehmers nicht angegeben wird, kann der Benutzer, der die Verbindung herstellt, nicht mit diesem Teilnehmer sprechen oder ihn hören.
In diesem Beispiel kann unser Kunde mit dem Agenten und seinem Vorgesetzten sprechen, kann aber nur den Ton des Agenten hören. Fügen Sie unten in Ihrer Datei Folgendes hinzu:
function createCustomerNcco(caller){
// Customer can hear agent, and speak to everyone
return [
{
"action": "conversation",
"name": conversationName,
"startOnEnter": false,
"musicOnHoldUrl": ["https://nexmo-community.github.io/ncco-examples/assets/voice_api_audio_streaming.mp3"],
"canSpeak": findParticipants('agent').concat(findParticipants('supervisor')),
"canHear": findParticipants('agent')
}
]
} Der Agent NCCO
Als Nächstes kommt der Agent NCCO. Die Agenten sollten mit allen Teilnehmern sprechen können und von allen Teilnehmern gehört werden. Sie sind die Eigentümer dieser Telefonkonferenz, also setzen wir startOnEnter auf true, um anzuzeigen, dass die Konferenz aktiv wird, wenn sie beitreten. Darüber hinaus setzen wir record auf true gesetzt, damit der Anruf aufgezeichnet wird.
Da der Agent mit jedem sprechen und jeden hören kann, finden wir alle Kunden und alle Vorgesetzten und geben ihre UUIDs an die conversation Aktion.
In diesem Fall könnten wir auslassen
canSpeakundcanHearin der NCCO weglassen, da die Standardwerte den Ton zwischen allen Teilnehmern zulassen. Im Interesse einer vollständigen Kontrolle über die Teilnehmer habe ich mich dafür entschieden, sie trotzdem anzugeben
function createAgentNcco(caller){
// Agent can hear everyone, and speak to everyone
return [
{
"action": "conversation",
"name": conversationName,
"startOnEnter": true,
"record": true,
"canSpeak": findParticipants('customer').concat(findParticipants('supervisor')),
"canHear": findParticipants('customer').concat(findParticipants('supervisor'))
}
]
} Der Datenschutzbeauftragte NCCO
Schließlich gibt es noch den Supervisor NCCO. Der Supervisor kann jeden hören, aber nur mit dem Agenten sprechen (das ist das Gegenteil des Kunden). Wie zuvor ist er nicht Eigentümer des Anrufs, so dass startOnEnter auf false gesetzt ist.
Wir bieten canSpeak und canHear mit einer Liste von UUIDs, wie unsere früheren NCCOs, und dies stellt sicher, dass der Supervisor nur mit dem Agenten sprechen kann, aber sowohl den Agenten als auch den Kunden hört.
function createSupervisorNcco(caller){
// Supervisor can hear everyone, but only speak to agents
return [
{
"action": "conversation",
"name": conversationName,
"startOnEnter": false,
"musicOnHoldUrl": ["https://nexmo-community.github.io/ncco-examples/assets/voice_api_audio_streaming.mp3"],
"canSpeak": findParticipants('agent'),
"canHear": findParticipants('customer').concat(findParticipants('agent'))
}
]
} Damit alles funktioniert
Wir haben es fast geschafft! Es gibt nur noch zwei Dinge, die wir tun müssen, bevor unsere Anwendung funktionieren wird. Das erste ist die Implementierung unserer findParticipants Methode zu implementieren. Fügen Sie die folgende Funktion am Ende Ihrer Datei ein:
function findParticipants(callerType) {
let legs = [];
Object.entries(participants).forEach(([number, participant]) => {
if (participant.role == callerType && participant.legId) {
legs.push(participant.legId);
}
});
return legs;
}
Diese Funktion durchsucht alle Teilnehmer nach der angegebenen Rolle. Wenn die Rolle übereinstimmt, wird die Bein-UUID in ein Array geschoben und zurückgegeben.
Die zweite Sache, die wir tun müssen, ist sicherzustellen, dass wir die Bein-UUID des Aufrufers speichern, wenn eine Anfrage an /webhooks/answer. Aktualisieren Sie Ihren Code, um die Bein-ID zu speichern, nachdem wir geprüft haben, ob der aktuelle Anrufer gefunden werden kann:
if (!caller) {
return res.status(400).json("Unknown caller type: " + req.query.from);
}
// Add their leg ID to the caller
caller.legId = req.query.uuid;Jetzt sollte Ihre Anwendung funktionieren. Stellen Sie sicher, dass Ihr answer_url zugänglich ist (vielleicht mit ngrok wenn sie sich auf Ihrem lokalen Rechner befindet) und rufen Sie eine Nummer an, die auf die gerade erstellte Anwendung verweist. Wenn Sie eine Nexmo-Applikation erstellen und eine Nummer mieten wollen, schauen Sie sich unsere Application Concepts auf unserem Entwicklerportal.
Teilen Sie:
Michael ist ein polyglotter Software-Ingenieur, der sich dafür einsetzt, die Komplexität von Systemen zu reduzieren und sie berechenbarer zu machen. Er arbeitet mit einer Vielzahl von Sprachen und Tools und gibt sein technisches Fachwissen auf Benutzergruppen und Konferenzen in der ganzen Welt weiter. Im Alltag ist Michael ein ehemaliger Developer Advocate bei Vonage, wo er seine Zeit damit verbrachte, über alle Arten von Technologie zu lernen, zu lehren und zu schreiben.