
Text to Speech mit Prompt-Aufrufen, mit Python auf AWS Lambda
Lesedauer: 5 Minuten
Die Nexmo Sprach-API bietet eine große Flexibilität bei den Anrufszenarien, die Sie aktivieren können. Um dies zu tun, müssen Sie jedoch oft mehrere Interaktionen mit der API durchführen. Für einige Szenarien möchten Sie vielleicht einen einzigen API-Aufruf von Ihrer Geschäftslogik aus haben, der eine Reihe von Interaktionen mit der Sprach-API aufruft. Dies ist ein ideales Szenario, um eine serverlose Anwendung zu erstellen, die Sie dann aufrufen können und die die Interaktionen mit der Sprach-API übernimmt.
In diesem Beispiel zeigen wir Ihnen, wie Sie einen Text-to-Speech-Anruf tätigen, der dem Empfänger eine Nachricht vorspielt und ihn dann auffordert, einige Ziffern auf der Tastatur einzugeben, z. B. um eine PIN-Nummer zu bestätigen. Sie erhalten dann einen Rückruf zu einer von Ihnen angegebenen URL, sobald die Interaktion abgeschlossen ist. Dies ist der veralteten TTS Prompt API von Nexmo sehr ähnlich, bietet Ihnen aber mehr Flexibilität.
Gegenwärtig ruft die Anwendung eine Nummer an, spielt eine erste Nachricht ab und wartet dann darauf, dass der Benutzer die von Ihnen angegebene PIN eingibt. Wenn er die PIN falsch eingibt, wird eine Fehlermeldung ausgegeben, und dann kann er es erneut versuchen, wobei bis zu 3 Versuche zulässig sind, obwohl dies in Ihrem Code geändert werden könnte.
Wenn sie beim dritten Versuch nicht die richtige PIN eingeben, wird der Anruf ohne Nachricht beendet.
Bei erfolgreicher PIN-Eingabe wird eine weitere Nachricht abgespielt, und der Anruf wird dann beendet. Sobald der Anruf beendet ist, erhalten Sie einen Rückruf an Ihren Webhook mit der Transaktions-ID des Anrufs und dem Ergebnis der PIN-Eingabeversuche.
Den Quellcode auf GitHub ansehen
Voraussetzungen
In diesem Lernprogramm werden Sie:
Sie benötigen ein AWS-Konto (Sie können dies auf dem kostenlosen Lambda-Tier ausführen)
Haben Sie das AWS CLI-Werkzeug und Chalice auf Ihrem Rechner installiert und konfiguriert
Erstellen Sie eine Nexmo Voice-Anwendung und speichern Sie den privaten Schlüssel in einer lokalen Datei namens
private.key
zusammen mit einer Notiz der Anwendungs-ID
Vonage API-Konto
Um dieses Tutorial durchzuführen, benötigen Sie ein Vonage API-Konto. Wenn Sie noch keines haben, können Sie sich noch heute anmelden und mit einem kostenlosen Guthaben beginnen. Sobald Sie ein Konto haben, finden Sie Ihren API-Schlüssel und Ihr API-Geheimnis oben auf dem Vonage-API-Dashboard.
In diesem Lernprogramm wird auch eine virtuelle Telefonnummer verwendet. Um eine zu erwerben, gehen Sie zu Rufnummern > Rufnummern kaufen und suchen Sie nach einer Nummer, die Ihren Anforderungen entspricht.
Einsatz
So stellen Sie die Funktion für Ihr eigenes AWS-Konto bereit:
Klonen Sie zunächst das Git-Repositorium auf Ihren lokalen Rechner:
git clone https://github.com/nexmo-community/voice-ttsprompt-lambda.git
Wechseln Sie in den Ordner:
cd voice-ttsprompt-lambda
Stellen Sie die Funktion in AWS bereit:
chalice deploy
Sie werden die folgende Ausgabe sehen, wenn Ihre Funktion bereitgestellt wird. Bestätigen Sie mit "Y", dass Sie die Ausführungsrichtlinie hinzufügen möchten
Initial creation of lambda function.
Updating IAM policy.
The following actions will be added to the execution policy:
dynamodb:PutItem
logs:PutLogEvents
dynamodb:CreateTable
logs:CreateLogStream
dynamodb:GetItem
logs:CreateLogGroup
Would you like to continue? [Y/n]: y
Creating deployment package.
Initiating first time deployment...
Deploying to: api
https://910e9mcan2.execute-api.us-east-1.amazonaws.com/api/
Die letzte Zeile ist die Basis-URL Ihrer neu eingerichteten Funktion. Notieren Sie sich diese, Sie können sie jederzeit mit dem Befehl abrufen chalice url
Einrichtung
Es gibt nur sehr wenig, das konfiguriert werden muss, da Chalice den Großteil der AWS-Konfiguration bei der ersten Bereitstellung übernimmt. Allerdings müssen Sie die DynamoDB-Tabelle erstellen, die zum Speichern des Anrufstatus verwendet wird. Dies geschieht mit einer HTTP-GET-Anfrage an die /setup
URL Ihrer Funktion.
Aufrufen von
Sie können nun Ihre neue Funktion mit einer einzigen HTTP-POST-Anfrage an Ihre Basis-URL mit /call
am Ende aufrufen. Sie müssen die folgenden Parameter übergeben
Parameter | Value | Example |
---|---|---|
to | The number to be called in e.164 format | 14155550100 |
from | The Nexmo number on your account to use for CallerID | 14155550101 |
text | The initial message played to the called party | "Enter your pin" |
pin_code | The PIN that the user should enter | 1234 |
callback | The URL on your server where the result should be sent | http://example.com/callback |
callback_method | The HTTP method used for your callback webhook | GET or POST |
bye_text | The message to be played on a successful pin entry | "Thank you, goodbye" |
failed_text | The message to be played on an incorrect pin with retry | "Incorrect, try again" |
Authentifizierung
Die Lambda-Anwendung speichert keine Ihrer Nexmo-Anmeldedaten, sondern diese werden zum Zeitpunkt des Funktionsaufrufs übergeben und nur für diese Anfrage verwendet.
Sie können dies auf zwei Arten tun: Entweder Sie generieren ein Nexmo JWT mit unseren Bibliotheken und fügen es in die Header der Anfrage ein oder Sie übermitteln einfach den privaten Schlüssel und die applicationID als Teil einer cURL-Anfrage. Es wird empfohlen, dass Sie die JWT-Methode der Authentifizierung verwenden.
cURL (Authentifizierung mit privatem Schlüssel)
Bearbeiten Sie die URL so, dass sie mit derjenigen übereinstimmt, die Sie bei der Bereitstellung Ihrer Funktion erhalten haben
curl -X "POST" "https://910e9mcan2.execute-api.us-east-1.amazonaws.com/api/call" \
--data-urlencode "private_key=`cat private.key`" \
-d "app_id=684027bc-a2e7-48b1-b4bd-adc02324e09c" \
-d "to=447970513607" \
-d "from=447520616161" \
-d "text='Enter the PIN'" \
-d "pin_code=1234" \
-d "callback=https://2bwz8nkbmfgc.runscope.net/callback" \
-d "callback_method=post" \
-d "bye_text='Thank You'" \
-d "failed_text='Try again'"
Python (JWT)
Bearbeiten Sie die URL so, dass sie mit der URL übereinstimmt, die Sie bei der Bereitstellung Ihrer Funktion erhalten haben.
Sie benötigen die Nexmo-Python-Bibliothek: Installieren Sie sie mit pip install nexmo
# you need the Nexmo client lib to generate your JWT
import nexmo
import requests
client = nexmo.Client(application_id=APP_ID, private_key=PRIVATE_KEY, key='dummy', secret='dummy')
headers = client._Client__headers()
data = {
'to': 'TO_NUMBER',
'from': 'CALLERID_NUMBER',
'text': 'Enter the pin',
'pin_code' : '1234',
'callback' : 'https://example.com/callback',
'callback_method' : 'post',
'bye_text' : 'thankyou',
'failed_text' : 'try again'
}
response = requests.post("https://910e9mcan2.execute-api.us-east-1.amazonaws.com/api/call", json=data, headers=headers)
Bei beiden Methoden ist die Antwort ein JSON-Objekt, das eine Transaktions-ID ("tid") enthält. Diese ist die Referenz für den Aufruf und wird im Callback mit dem Ergebnis verwendet.
Beispielantwort: { "tid": "6a2827c9-4c68-46fc-b179-115f055dc0eb" }
Rückrufe
Wenn der Aufruf abgeschlossen ist, stellt die Lambda-Funktion eine Rückrufanforderung an einen Webhook, den Sie beim Aufruf angegeben haben - dieser enthält Details zum Aufruf und zum Ergebnis:
Parameter | Value | Example |
---|---|---|
to | The number called in e.164 format | 14155550100 |
tid | The transaction ID | 6a2827c9-4c68-46fc-b179-115f055dc0eb |
status | The result | ok |
Die folgenden möglichen Statuswerte können zurückgegeben werden:
ok
: der Anruf wurde beendet und der Benutzer hat die richtige PIN eingegebenfailed
: der Anruf wurde beendet, aber der Benutzer hat nicht die richtige PIN eingegebenerror
: der Anruf wurde nicht beendet
Nächste Schritte
Sie können den Code ändern, um Parameter wie die Anzahl der Wiederholungsversuche, die der Benutzer für die Anstecknadel erhält, anzupassen, oder vielleicht möchten Sie die voiceName
die in den Eingabeaufforderungen verwendet werden.
Die Details zu jedem Ihrer Aufrufe werden in AWS DynamoDB gespeichert. Je nach Ihren Anforderungen möchten Sie diese Einträge möglicherweise von Zeit zu Zeit bereinigen.