https://d226lax1qjow5r.cloudfront.net/blog/blogposts/build-an-interactive-voice-response-with-go/go_ivr_1200x627.png

Erstellen einer interaktiven Voice-Antwort mit Go

Zuletzt aktualisiert am February 11, 2021

Lesedauer: 8 Minuten

In früheren Tutorials haben wir gelernt, wie man machen und empfangen Sprachanrufe mit Go. Dieses Tutorial zeigt Ihnen, wie Sie ein interaktives Sprachdialogsystem mit Go und der Voice API.

Wir werden einen Server aufbauen, der auf den Webhook-Endpunkt reagiert, den Vonage bei einem eingehenden Anruf sendet. Mithilfe einer Vonage-Anwendung mit Voice-Funktionen werden wir eingehende Sprachanrufe an ihr Ziel weiterleiten. Schließlich werden wir die API anweisen, einen Benutzer aufzufordern, einige Eingaben für den Anruf zu machen, und dann mit Text-To-Speech die Eingaben an den Benutzer weiterzugeben.

Voraussetzungen

Um diesem Tutorial folgen zu können, benötigen Sie Folgendes:

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.

Go SDK installieren

Dieses Projekt wird das Go SDK von Vonage verwenden, das Sie mit dem folgenden Befehl installieren können:

go get github.com/vonage/vonage-go-sdk

Den Code schreiben

Vonage prüft, ob Sie einen Webhook konfiguriert haben, an den Ihr Sprachanruf weitergeleitet wird, wenn es einen Anruf auf Ihrer virtuellen Nummer erhält. Diese Webhook-Konfiguration ist spezifisch für Ihre Anwendung, die Sie später im Lernprogramm erstellen und konfigurieren werden.

Lassen Sie uns den Code schreiben, der alle Anfragen an diesen Webhook bearbeitet. Erstellen Sie zunächst eine Datei namens handle-user-input-with-dtmf.go und kopieren Sie das Folgende in diese Datei:

package main



import (
    "encoding/json"
    "io/ioutil"
    "log"
    "net/http"

    "github.com/vonage/vonage-go-sdk/ncco"
)



type Dtmf struct {
    Digits    string
    Timed_out bool
}



type Response struct {
    Speech            []string
    Dtmf              Dtmf
    From              string
    To                string
    Uuid              string
    Conversation_uuid string
    Timestamp         string
}



func main() {



}

Der obige Code importiert Bibliotheken, die wir im Laufe dieses Tutorials verwenden werden. Außerdem erstellen wir zwei neue Structs, die die Eingaben von Webhook-Anfragen von Vonage verarbeiten werden. Anschließend initialisieren wir unser Projekt mit einer main() Funktion.

Als nächstes müssen wir einen /webhooks/answer Webhook-Endpunkt erstellen, um die Vonage-APIs anzuweisen, was mit eingehenden Anrufen geschehen soll. Dazu müssen wir ein Call Control Object (NCCO) erstellen, das den Anrufer zunächst auffordert, eine beliebige Taste einzugeben, und dann im nächsten Schritt die Eingaben des Anrufers aufzeichnet. Fügen Sie den folgenden Code in Ihr Projekt oberhalb der main() Funktion:

func answer(w http.ResponseWriter, req *http.Request) {
    MyNcco := ncco.Ncco{}

    talk := ncco.TalkAction{Text: "Hello please press any key to continue."}
    MyNcco.AddAction(talk)

    inputAction := ncco.InputAction{EventUrl: []string{"https://demo.ngrok.io/webhooks/dtmf"}, Dtmf: &ncco.DtmfInput{MaxDigits: 1}}
    MyNcco.AddAction(inputAction)

    data, _ := json.Marshal(MyNcco)

    w.Header().Set("Content-Type", "application/json")
    w.Write(data)
}

Das Projekt verfügt derzeit über keinerlei Funktionalität, um zu wissen, was mit der Eingabe des Aufrufers zu tun ist (Sie haben vielleicht die URL https://demo.ngrok.io/webhooks/dtmf im vorherigen Schritt bemerkt). Wir müssen diesen Endpunkt in unserem Projekt erstellen. Dieser Endpunkt muss den Text der POST Anfrage lesen und dann den Schlüssel zurücklesen, den der Aufrufer im vorherigen Schritt übermittelt hat. Fügen Sie das folgende Codebeispiel in Ihr Projekt ein:

func dtmf(w http.ResponseWriter, r *http.Request) {
    data, _ := ioutil.ReadAll(r.Body)
    var t Response
    json.Unmarshal(data, &t)

    MyNcco := ncco.Ncco{}
    talk := ncco.TalkAction{Text: "You pressed " + t.Dtmf.Digits + ", Goodbye"}
    MyNcco.AddAction(talk)

    responseData, _ := json.Marshal(MyNcco)
    w.Header().Set("Content-Type", "application/json")
    w.Write(responseData)
}

Es ist an der Zeit, die Funktion main() Funktion mitzuteilen, was sie mit den beiden neuen Funktionen, die wir erstellt haben, tun soll. Wir müssen einen http-Server erstellen, der auf Port 3000zu überwachen, und zwei Endpunkte an diese Funktionen weiterleiten. Fügen Sie die drei folgenden Zeilen in Ihre leere main() Funktion hinzu.

http.HandleFunc("/webhooks/answer", answer)
    http.HandleFunc("/webhooks/dtmf", dtmf)

    http.ListenAndServe(":3000", nil)

Stellen Sie das Projekt ins Internet

Wenn ein Anruf eingeht, sendet Vonage eine HTTP-Anfrage an Ihre vorkonfigurierte Webhook-URL. Ihre Go-Anwendung sollte über einen Internetzugang verfügen, um diese Anfrage zu empfangen, daher empfehlen wir Ngrok zu verwenden.

Starten Sie Ngrok mit dem folgenden Befehl:

ngrok http 3000

Kopieren Sie die HTTPS-URL, die ngrok verwendet, da Sie diese später benötigen werden. Sie wird ähnlich wie im folgenden Beispiel sein:

https://abc1234.ngrok.io -> http://localhost:8080

Hinweis Diese URL ist jedes Mal anders, wenn Sie den Befehl ausführen, wenn Sie den kostenlosen Plan verwenden. Sie müssen also Ihre Anwendung im Dashboard jedes Mal aktualisieren, wenn Sie den Befehl ausführen.

In Ihrer handle-user-input-with-dtmf.go Datei, finden Sie die Zeile inputAction := ncco.InputAction{EventUrl: []string{"https://demo.ngrok.io/webhooks/dtmf"}, innerhalb der answer() Funktion und ersetzen Sie "https://demo.ngrok.io" durch Ihre ngrok-URL. Denken Sie daran, den /webhooks/dtmf Teil jedoch beibehalten.

Konfigurieren Sie die Einstellungen

Erstellen Sie eine Applikation in Ihrem Dashboard unter "Ihre Applications". Geben Sie Ihrer neuen Applikation einen Namen.

Fügen Sie der Anwendung Voice-Funktionen hinzu und konfigurieren Sie die URLs mit der Ngrok-URL, die Sie zuvor kopiert haben. Verwenden Sie für die Antwort-URL [paste ngrok url]/webhooks/answer und für die Ereignis-URL [paste ngrok url]/webhooks/event.

Klicken Sie nun auf die Schaltfläche Link neben Ihrer kürzlich erworbenen virtuellen Vonage-Nummer, um Ihre neue Anwendung mit der Rufnummer zu verknüpfen.

Sie haben eine virtuelle Vonage-Nummer erworben, eine Vonage-Anwendung erstellt und den Code für die Webhook-Ereignisse geschrieben. Jetzt ist es an der Zeit, Ihr Projekt zu testen!

Zeit zum Testen

Wir haben unsere Vonage-Anwendung und Telefonnummer so konfiguriert, dass wir wissen, wie eingehende Voice-Anrufe zu behandeln sind. Wir haben auch einen Webhook in handle-user-input-with-dtmf.go geschrieben, um alle eingehenden Anrufanfragen zu bearbeiten. Schließlich haben wir einen weiteren Endpunkt hinzugefügt, der ausgelöst wird, sobald der Anrufer eine Taste auf seinem Telefon gewählt hat.

Nun ist es an der Zeit, diese Anwendung zu testen. Wenn Sie den unten stehenden Befehl ausführen, wird ein Webserver mit diesem Webhook gestartet, der auf die Anfrage wartet. Führen Sie also den folgenden Befehl aus, um mit dem Testen unserer neuen Anwendung zu beginnen:

go run handle-user-input-with-dtmf.go

Wenn Sie Ihre virtuelle Nummer anrufen, hören Sie die Worte "Hallo, bitte drücken Sie eine beliebige Taste, um fortzufahren". Sobald Sie diesen Satz hören, drücken Sie eine beliebige Taste auf Ihrem Telefon. Nach der Eingabe wird Ihr Anruf an die Webhook-URL weitergeleitet. /webhooks/dtmf Webhook-URL weitergeleitet, die Ihre Eingaben mit dem Satz "Sie haben [Taste hier] gedrückt Auf Wiedersehen" wiedergibt. Ersetzen von [key here] durch die von Ihnen eingegebene Taste.

Weitere Lektüre

Sie finden den in diesem Tutorial gezeigten Code in der Go-Code-Snippets-Repository.

Im Folgenden finden Sie einige andere Tutorials, die wir über die Verwendung unserer Dienste mit Go geschrieben haben:

Wenn Sie Fragen, Ratschläge oder Ideen haben, die Sie mit der Community teilen möchten, können Sie sich gerne in unserem Slack-Arbeitsbereich der Gemeinschaft. Ich würde mich freuen, von allen zu hören, die dieses Tutorial implementiert haben und wie Ihr Projekt funktioniert.

Teilen Sie:

https://a.storyblok.com/f/270183/250x250/b052219541/greg-holmes.png
Greg HolmesVonage Ehemalige

Ehemaliger Ausbilder für Entwickler @Vonage. Kommt von einem PHP-Hintergrund, ist aber nicht auf eine Sprache beschränkt. Ein begeisterter Gamer und Raspberry-Pi-Enthusiast. Oft beim Bouldern in Kletterhallen anzutreffen.