
Partager:
Ben est un développeur en seconde carrière qui a auparavant passé une décennie dans les domaines de la formation pour adultes, de l'organisation communautaire et de la gestion d'organisations à but non lucratif. Il a travaillé comme défenseur des développeurs pour Vonage. Il écrit régulièrement sur l'intersection du développement communautaire et de la technologie. Originaire de Californie du Sud et ayant longtemps vécu à New York, Ben réside aujourd'hui près de Tel Aviv, en Israël.
Lire un flux audio lors d'un appel téléphonique avec Ruby
Temps de lecture : 9 minutes
Dans ce billet, nous allons nous intéresser à la diffusion d'un fichier audio dans un appel téléphonique en cours. Il existe de nombreux cas d'utilisation pour la diffusion de fichiers audio dans les appels, et avec l'API Voice de Vonage et la gemme Ruby de Vonage, il s'agit d'un processus relativement simple. Que vous souhaitiez partager de la musique avec quelqu'un au téléphone ou un extrait d'une réunion de travail, vous pouvez le faire avec quelques lignes de Ruby et Vonage.
Le code source de ce billet est disponible sur GitHub.
Conditions préalables
Pour travailler sur cet article, vous aurez besoin de :
Vonage API Account
To complete this tutorial, you will need a Vonage API account. If you don’t have one already, you can sign up today and start building with free credit. Once you have an account, you can find your API Key and API Secret at the top of the Vonage API Dashboard.
This tutorial also uses a virtual phone number. To purchase one, go to Numbers > Buy Numbers and search for one that meets your needs.
Ruby 2.5.3 ou plus récent
Le dotenv gem
Configurez votre Account et votre application Vonage
Commençons par acheter un numéro de téléphone que nous pourrons utiliser pour nos tests. Nous utiliserons le CLI de Vonage pour acheter le numéro.
Ici, NUMBER représente le numéro que vous souhaitez acheter, et COUNTRYCODE l'indicatif de pays de ce numéro.
Si vous ne connaissez pas encore le numéro que vous souhaitez acheter, vous pouvez d'abord rechercher un numéro dans un pays particulier comme suit (ici, nous recherchons des numéros aux États-Unis en utilisant l'indicatif de pays US l'indicatif de pays) :
Notez le numéro de téléphone que vous venez d'acheter. Nous l'utiliserons dans un instant dans notre code.
Nous utiliserons également le CLI de Vonage pour créer une nouvelle application. Nous devons créer une application pour utiliser l'API Voice.
En exécutant cette commande, nous avons créé une nouvelle application appelée "Test Application 1" et défini trois paramètres :
answer_url: Où notre application fournit l'objet de contrôle d'appel de Vonage (NCCO) qui régit l'appel.event_url: Vonage envoie les informations sur l'événement de manière asynchrone lorsque lescall_statuschangements
Nous redéfinirons à la fois le answer_url et le event_url dans notre code. Il est important de noter qu'ils doivent être accessibles de l'extérieur accessibles de l'extérieur pour que la plateforme Vonage puisse y accéder. Pour notre installation locale, nous pouvons utiliser ngrok pour rendre notre serveur local accessible de l'extérieur. Vous pouvez trouver plus d'informations sur l'utilisation de Vonage avec ngrok à cet article de blog.
L'exécution de la commande vonage apps:create permet également d'obtenir un numéro d'identification pour l'application créée. Nous utiliserons cet identifiant dans un instant dans notre code, en même temps que le nouveau numéro de téléphone que nous avons acquis.
Mise en place de nos références
À ce stade, nous disposons maintenant des informations nécessaires pour créer notre application. Nous allons créer un serveur web Sinatra qui servira quatre routes, trois GET et une requête POST requête. Les GET initient l'appel téléphonique, fournissent les instructions NCCO à la plateforme Vonage et diffusent un fichier silencieux pour maintenir l'appel ouvert. La requête POST demande transmet l'audio à l'appel une fois qu'il a été répondu.
Pour accéder à notre Account Vonage et nous authentifier, nous devons fournir les informations d'identification correctes. Vous devez veiller à les stocker en toute sécurité et éviter de les archiver dans le contrôle des sources. Dans cet exemple, nous allons utiliser la gemme dotenv pour stocker nos informations d'identification en tant que variables d'environnement et y accéder dans notre code en conséquence. Pour ce faire, nous commençons par créer un fichier appelé .env et en y plaçant ce qui suit :
VONAGE_API_KEY=
VONAGE_API_SECRET=
VONAGE_APPLICATION_ID=
VONAGE_APPLICATION_PRIVATE_KEY_PATH=private.key
VONAGE_TO_NUMBER=
VONAGE_NUMBER=Votre VONAGE_API_KEY et VONAGE_API_SECRET vous ont été fournis lorsque vous vous êtes inscrit à un compte Vonage au début de ce guide. Vous pouvez y accéder à nouveau dans vos paramètres de votre Account. Votre VONAGE_APPLICATION_ID est ce qui vous a été renvoyé lorsque vous avez créé une nouvelle application à l'aide de l'interface de commande Nexmo. De même, votre VONAGE_APPLICATION_PRIVATE_KEY_PATH est le chemin d'accès au fichier private.key créé automatiquement lors de l'initialisation d'une nouvelle application avec le CLI. Dans notre exemple, il s'agit de ./private.key. Votre VONAGE_NUMBER est le numéro de téléphone que vous avez acheté, et le VONAGE_TO_NUMBER est le numéro de téléphone que vous souhaitez appeler.
Si vous déposez ce document sur GitHub, assurez-vous également de créer un fichier .gitignore et d'y ajouter .env à l'intérieur de celui-ci afin de s'assurer que vos informations d'identification ne soient pas publiées en ligne par accident.
Envoi d'un flux audio à un appel avec Ruby
Créons un nouveau fichier appelé server.rb et assurons-nous que nous demandons les dépendances nécessaires et que nous chargeons nos variables d'environnement dotenv variables d'environnement :
require 'sinatra'
require 'vonage'
require 'dotenv'
require 'json'
Dotenv.loadEnsuite, nous allons initialiser une nouvelle instance de client Vonage en utilisant ces informations d'identification et la gemme Vonage.
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'])
)À ce stade, nous disposons d'une instance de client Vonage accréditée et d'un flux audio défini. Que nous manque-t-il ? L'appel téléphonique, bien sûr !
Tout d'abord, obtenons notre ngrok que nous utiliserons pour mettre notre serveur à la disposition de Vonage afin qu'il reçoive nos instructions d'appel et qu'il envoie des mises à jour sur l'état de l'appel. Une fois que vous avez installé ngrokouvrez une nouvelle fenêtre de console et exécutez ngrok http 4567 à partir de la ligne de commande. Cela créera un nouveau ngrok sur le port 4567, en parallèle avec notre serveur Sinatra, qui fonctionne également sur le port 4567. Vous verrez s'afficher un état contenant l'URL ngrok sous le paramètre Forwarding sous le paramètre Copiez et collez cette URL dans la variable constante BASE_URL dans la variable constante server.rb.
BASE_URL = 'PASTE URL HERE'Pendant que nous définissons nos variables, nous allons définir le chemin d'accès à notre fichier audio en continu, et nous le définirons en tant que CONSTANT variable.
AUDIO_URL = "#{BASE_URL}/voice_api_audio_streaming.mp3"Nous pouvons maintenant créer un chemin d'accès URL vers /new qui, lorsqu'il sera consulté, lancera l'appel téléphonique.
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
endL'action get /new ci-dessus crée un nouvel appel téléphonique avec l'adresse to:, from:, answer_url: et event_url: fournis.
Les to: et from: nécessitent à la fois un type et a number. Dans notre cas, la valeur type pour les deux est phone. Les answer_url et event_url doivent être des URL accessibles de l'extérieur à partir desquelles la plateforme Vonage peut recevoir des instructions et envoyer des mises à jour sur l'état des appels, respectivement.
Une fois que nous avons lancé l'appel téléphonique, Vonage accède au chemin answer_url à la recherche d'instructions d'appel. Nous devons également créer cette action. L'action rendra et livrera les instructions sous forme de JSON. Les instructions fournissent actionle chemin URL vers un fichier audio silencieux qui sera joué en arrière-plan en maintenant la connexion ouverte et un paramètre loop que nous définissons comme 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
À ce stade, nous devons créer un autre chemin d'accès pour livrer le fichier audio silencieux que nous avons spécifié dans les instructions du NCCO. GET pour livrer le fichier audio silencieux que nous avons spécifié dans les instructions du NCCO :
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')
endEnfin, nous créons également un POST chemin vers /event qui reçoit l'état de l'appel de la plateforme Vonage et envoie le flux audio une fois que l'appel a été pris. L'action analyse les données reçues et utilise le paramètre status pour déterminer si l'appel a été pris. Le statut d'un appel passe de started à ringing puis answered et enfin, lorsqu'il est déconnecté, à completed. Notre code lit le fichier audio une fois que le status a atteint answered. Nous recevons également l'identifiant unique de cet appel, le uuidNous recevons également l'identifiant unique de cet appel, l' , des données reçues, ce qui est nécessaire pour injecter notre flux audio dans cet appel spécifique.
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
endAvec cette action, nous avons terminé la création de notre application. POST nous avons terminé la création de notre application. Il ne nous reste plus qu'à lancer ruby server.rb à partir de la ligne de commande pour démarrer notre serveur et nous assurer que nous avons initialisé ngrok pour rendre notre serveur local accessible de l'extérieur. Une fois que c'est fait, allez-y et naviguez vers http://localhost:4567 à partir de votre navigateur web et vous recevrez l'appel téléphonique. Lorsque vous répondrez à l'appel, l'audio commencera à être diffusé.
Conclusion
En une quarantaine de lignes de code, nous avons créé un serveur web entièrement fonctionnel qui peut appeler n'importe quel numéro de téléphone et diffuser de l'audio en continu dans cet appel. L'API Voice de Vonage permet de réaliser bien d'autres choses et vous pouvez l'explorer entièrement sur la plateforme des développeurs de Vonage.
Si vous avez des questions sur cet article, n'hésitez pas à envoyer un e-mail à devrel@nexmo.com ou à rejoindre le canal Slack de la communauté Vonage. rejoignez le canal Slack de la communauté Vonageoù nous vous attendons et sommes prêts à vous aider.
Partager:
Ben est un développeur en seconde carrière qui a auparavant passé une décennie dans les domaines de la formation pour adultes, de l'organisation communautaire et de la gestion d'organisations à but non lucratif. Il a travaillé comme défenseur des développeurs pour Vonage. Il écrit régulièrement sur l'intersection du développement communautaire et de la technologie. Originaire de Californie du Sud et ayant longtemps vécu à New York, Ben réside aujourd'hui près de Tel Aviv, en Israël.
