
Teilen Sie:
Ben ist ein Entwickler im zweiten Beruf, der zuvor ein Jahrzehnt in den Bereichen Erwachsenenbildung, Community-Organisation und Non-Profit-Management tätig war. Er arbeitete als Anwalt für Entwickler bei Vonage. Er schreibt regelmäßig über die Überschneidung von Gemeindeentwicklung und Technologie. Ursprünglich aus Südkalifornien stammend und lange Zeit in New York City ansässig, wohnt Ben jetzt in der Nähe von Tel Aviv, Israel.
Wiedergabe von Streaming-Audio in einem Telefongespräch mit Ruby
Lesedauer: 8 Minuten
In diesem Beitrag werden wir uns mit dem Streaming einer Audiodatei in ein laufendes Telefonat beschäftigen. Es gibt viele Anwendungsfälle für das Streaming von Audiodateien in Telefongespräche, und mit der Vonage Voice API und dem Vonage Ruby-Gem ist es ein relativ unkomplizierter Prozess. Ganz gleich, ob Sie jemandem am Telefon Musik vorspielen oder einen Ausschnitt aus einer Besprechung wiedergeben möchten, mit ein paar Zeilen Ruby und Vonage können Sie dies tun.
Der Quellcode für diesen Blogbeitrag ist verfügbar auf GitHub.
Voraussetzungen
Um diesen Beitrag durchzuarbeiten, benötigen Sie:
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.
Ruby 2.5.3 oder neuere Version
Die dotenv gem
Konfigurieren Sie Ihr Vonage-Konto und Ihre Anwendung
Beginnen wir mit dem Erwerb einer Telefonnummer, die wir für Tests verwenden können. Wir verwenden die Vonage CLI, um die Nummer zu erwerben.
Hier, NUMBER für die Nummer, die Sie kaufen möchten, und COUNTRYCODE die Landesvorwahl für diese Nummer.
Wenn Sie die Nummer, die Sie kaufen möchten, noch nicht kennen, können Sie zunächst nach einer Nummer in einem bestimmten Land suchen (hier suchen wir nach Nummern in den USA unter Verwendung der US Landesvorwahl):
Notieren Sie sich die Telefonnummer, die Sie soeben erworben haben. Wir werden sie gleich in unserem Code verwenden.
Wir werden auch die Vonage CLI verwenden, um eine neue Anwendung zu erstellen. Wir müssen eine Anwendung erstellen, um die Voice API zu nutzen.
Nach der Ausführung dieses Befehls haben wir nun eine neue Anwendung mit dem Namen "Testanwendung 1" erstellt und drei Parameter definiert:
answer_url: Unsere Anwendung liefert das Vonage Call Control Object (NCCO), das den Anruf steuert.event_url: Vonage sendet die Ereignisinformationen asynchron, wenn diecall_statusÄnderungen
Wir werden sowohl die answer_url und die event_url in unserem Code neu definieren. Es ist wichtig zu beachten, dass sie von außen zugängliche URLs sein müssen, damit die Vonage-Plattform darauf zugreifen kann. Für unsere lokale Installation können wir ngrok verwenden, um unseren lokalen Server extern verfügbar zu machen. Weitere Informationen zur Verwendung von Vonage mit ngrok finden Sie unter diesem Blog-Beitrag.
Die Ausführung des vonage apps:create Befehls wird auch eine Anwendungs-ID für die erstellte Anwendung ausgegeben. Wir werden diese ID gleich in unserem Code verwenden, zusammen mit der neuen Telefonnummer, die wir erhalten haben.
Einrichten unserer Anmeldeinformationen
Jetzt haben wir die Informationen, die wir zum Erstellen unserer Anwendung benötigen. Wir werden einen Sinatra-Webserver erstellen, der vier Routen, drei GET Anfragen und eine POST Anfrage. Die GET Anfragen leiten den Anruf ein, geben die NCCO-Anweisungen an die Vonage-Plattform weiter und streamen eine stille Datei, um den Anruf offen zu halten. Die POST streamt den Ton zum Anruf, sobald dieser angenommen wurde.
Um auf unseren Vonage Account zuzugreifen und uns zu authentifizieren, müssen wir die richtigen Anmeldedaten angeben. Sie sollten darauf achten, diese sicher zu speichern und sie nicht in die Versionsverwaltung einzuchecken. In diesem Beispiel werden wir das dotenv gem verwenden, um unsere Anmeldedaten als Umgebungsvariablen zu speichern und in unserem Code entsprechend darauf zuzugreifen. Dazu erstellen wir zunächst eine Datei namens .env erstellen und das Folgende darin einfügen:
VONAGE_API_KEY=
VONAGE_API_SECRET=
VONAGE_APPLICATION_ID=
VONAGE_APPLICATION_PRIVATE_KEY_PATH=private.key
VONAGE_TO_NUMBER=
VONAGE_NUMBER=Ihr VONAGE_API_KEY und VONAGE_API_SECRET wurden Ihnen zur Verfügung gestellt, als Sie sich zu Beginn dieser Anleitung für einen Vonage Account angemeldet haben. Sie können sie in Ihren Account-Einstellungen. Ihre VONAGE_APPLICATION_ID ist das, was Ihnen zurückgegeben wurde, als Sie eine neue Anwendung mit der Nexmo CLI erstellt haben. Gleichermaßen ist Ihr VONAGE_APPLICATION_PRIVATE_KEY_PATH ist der Dateipfad zu der Datei private.key Datei, die bei der Initialisierung einer neuen Anwendung mit der CLI automatisch erstellt wird. In unserem Beispiel ist es ./private.key. Ihre VONAGE_NUMBER ist die Telefonnummer, die Sie erworben haben, und die VONAGE_TO_NUMBER ist die Rufnummer, die Sie anrufen möchten.
Wenn Sie dies auf GitHub einreichen, stellen Sie bitte sicher, dass Sie auch eine .gitignore Datei und fügen Sie .env hinzufügen, um sicherzustellen, dass Ihre Anmeldeinformationen nicht versehentlich online veröffentlicht werden.
Senden von Streaming-Audio an einen Anruf mit Ruby
Erstellen wir eine neue Datei namens server.rb und stellen sicher, dass wir die notwendigen Abhängigkeiten und unsere dotenv Umgebungsvariablen laden:
require 'sinatra'
require 'vonage'
require 'dotenv'
require 'json'
Dotenv.loadAls Nächstes werden wir eine neue Vonage-Client-Instanz unter Verwendung dieser Anmeldeinformationen und des Vonage-Gems initialisieren.
client = Vonage::Client.new(
api_key: ENV['VONAGE_API_KEY'],
api_secret: ENV['VONAGE_API_SECRET'],
application_id: ENV['VONAGE_APPLICATION_ID'],
private_key: File.read(ENV['VONAGE_APPLICATION_PRIVATE_KEY_PATH'])
)Zu diesem Zeitpunkt haben wir nun eine Vonage-Client-Instanz mit Anmeldeinformationen und unser Audio-Streaming definiert. Was fehlt uns noch? Der Telefonanruf natürlich!
Lassen Sie uns zunächst unsere ngrok extern zugängliche URL, die wir verwenden werden, um unseren Server für Vonage verfügbar zu machen, damit dieser unsere Anrufanweisungen empfangen und Anrufstatusaktualisierungen zurücksenden kann. Sobald Sie die URL installiert haben ngrokinstalliert haben, öffnen Sie ein neues Konsolenfenster und führen Sie ngrok http 4567 in der Befehlszeile aus. Dadurch wird ein neuer ngrok Server auf Port 4567, der parallel zu unserem Sinatra-Server läuft, der ebenfalls auf Port 4567 läuft. Es wird Ihnen ein Status angezeigt, der die ngrok URL unter dem Forwarding Parameter enthält. Kopieren Sie nun diese URL und fügen Sie sie in die Variable BASE_URL konstante Variable in server.rb.
BASE_URL = 'PASTE URL HERE'Während wir unsere Variablen definieren, legen wir den Pfad zu unserer Streaming-Audio-Datei fest und definieren ihn als CONSTANT Variable.
AUDIO_URL = "#{BASE_URL}/voice_api_audio_streaming.mp3"Wir können nun einen URL-Pfad zu /new erstellen, der beim Zugriff den Anruf startet.
get '/new' do
response = client.calls.create(
to: [{ type: 'phone', number: ENV['VONAGE_NUMBER'] }],
from: { type: 'phone', number: ENV['VONAGE_TO_NUMBER'] },
answer_url: ["#{BASE_URL}/answer"],
event_url: ["#{BASE_URL}/event"]
)
puts response.inspect
endDie Aktion get /new Aktion erzeugt einen neuen Anruf mit der to:, from:, answer_url: und event_url: angegebenen Parametern.
Die to: und from: Parameter erfordern sowohl einen type und a number. In unserem Fall ist die type für beide gleich phone. Die answer_url und event_url müssen von außen zugängliche URLs sein, von denen die Vonage-Plattform Anweisungen empfangen bzw. an die sie Aktualisierungen des Anrufstatus senden kann.
Sobald wir den Anruf einleiten, greift Vonage auf den answer_url Pfad auf der Suche nach Anrufanweisungen. Wir müssen auch diese Aktion erstellen. Die Aktion rendert und liefert die Anweisungen als JSON. Die Anweisungen enthalten die actionden URL-Pfad zu einer stummen Audiodatei, die im Hintergrund abgespielt wird, während die Verbindung offen bleibt, und einen loop Parameter, den wir auf 0.
get '/answer' do
# Provide the Vonage Call Control Object (NCCO) as JSON to the Vonage Platform
content_type :json
[{ :action => 'stream', :streamUrl => ["#{BASE_URL}/stream/silent"], :loop => 0 }].to_json
end
An diesem Punkt müssen wir einen weiteren Pfad erstellen GET Pfad erstellen, um die stumme Audiodatei zu liefern, die wir in den NCCO-Anweisungen angegeben haben:
get '/stream/silent' do
# Stream a silent file in the background to keep the call open
send_file File.join(settings.public_folder, 'silence.mp3')
endZum Schluss erstellen wir auch einen POST Pfad zu /event der den Anrufstatus von der Vonage-Plattform empfängt und das Streaming-Audio sendet, sobald der Anruf angenommen wurde. Die Aktion parst die empfangenen Daten und verwendet den status Parameter, um festzustellen, wann der Anruf angenommen wurde. Der Status eines Anrufs ändert sich von started zu ringing und dann answered und schließlich, wenn die Verbindung getrennt wird, zu completed. Unser Code spielt die Audiodatei ab, sobald der status erreicht hat answered. Wir erhalten auch den eindeutigen Bezeichner für diesen Anruf, den uuidaus den empfangenen Daten, die wir benötigen, um unser Audio-Streaming in diesen speziellen Aufruf zu integrieren.
post '/event' do
data = JSON.parse(request.body.read)
response = client.calls.stream.start(data['uuid'], stream_url: [AUDIO_URL]) if data['status'] == 'answered'
puts response.inspect
endMit dieser POST Aktion haben wir die Erstellung unserer Anwendung abgeschlossen. Jetzt müssen wir nur noch ruby server.rb von der Kommandozeile aus starten, um unseren Server hochzufahren, und sicherstellen, dass wir ngrok initialisiert haben, damit unser lokaler Server von außen zugänglich ist. Sobald das erledigt ist, navigieren Sie zu http://localhost:4567 in Ihrem Webbrowser und Sie werden den Anruf erhalten. Wenn Sie den Anruf annehmen, beginnt das Audio-Streaming.
Schlussfolgerung
In etwa 40 Zeilen Code haben wir einen voll funktionsfähigen Webserver erstellt, der jede beliebige Telefonnummer anrufen und Streaming-Audio in diesen Anruf einspeisen kann. Die Voice API von Vonage bietet noch viele weitere Möglichkeiten, die Sie auf der Vonage Entwickler-Plattform.
Wenn Sie Fragen zu diesem Beitrag haben, können Sie eine E-Mail an devrel@nexmo.com schicken oder treten Sie dem Slack-Kanal der Vonage Community beiwo wir bereit sind, Ihnen zu helfen.
Teilen Sie:
Ben ist ein Entwickler im zweiten Beruf, der zuvor ein Jahrzehnt in den Bereichen Erwachsenenbildung, Community-Organisation und Non-Profit-Management tätig war. Er arbeitete als Anwalt für Entwickler bei Vonage. Er schreibt regelmäßig über die Überschneidung von Gemeindeentwicklung und Technologie. Ursprünglich aus Südkalifornien stammend und lange Zeit in New York City ansässig, wohnt Ben jetzt in der Nähe von Tel Aviv, Israel.
