
Partager:
Phil is Head of Developer Relations at Hookdeck, an asynchronous messaging platform, and a proud Vonage alumni.
Construire un système de diffusion d'alertes vocales en utilisant Ruby
Temps de lecture : 8 minutes
Parfois, un message texte ne suffit pas. Lorsque vous voulez vraiment être alerté de quelque chose d'important, vous souhaitez probablement recevoir un véritable appel téléphonique, que ce soit parce qu'un serveur est en panne ou parce qu'une catastrophe naturelle s'est produite dans votre région.
De même, un fournisseur de services ou une autorité (locale) confrontée à une situation d'urgence voudra atteindre le plus grand nombre de personnes possible, le plus rapidement possible, qu'elles possèdent ou non un téléphone portable.
L'application In-App Voice Voice pour la diffusion d'alertes en cas d'inondation
Pour ce tutoriel, nous ajouterons un système de diffusion d'alertes vocales Système de diffusion d'alertes Voice à une application existante en utilisant l'API Nexmo Text-To-Speech API (TTS). Pour ce faire, nous avons construit l'application Nexmo Flood Alerts qui permet aux utilisateurs de s'abonner à des alertes vocales pour leur code postal.

Cette application nous sert de point de départ pour ce tutoriel. Il s'agit d'une application Sinatra écrite en Ruby avec quelques gemmes supplémentaires pour faciliter les choses. Nous avons ajouté SQLite3 et ActiveRecord pour la persistance de nos abonnés. Nous avons également ajouté Bootstrap pour rendre notre interface utilisateur un peu plus attrayante. Enfin, pour ce tutoriel, nous avons laissé la récupération des données d'inondation comme un détail d'implémentation et à la place nous enverrons manuellement les notifications à travers le panneau d'administration.
Vous pouvez télécharger le point de départ de cette application sur Github :
Visitez ensuite localhost:4567 dans votre navigateur et souscrivez à une alerte inondation en indiquant votre code postal et votre numéro. Ensuite, vous pouvez visiter le (très rudimentaire) panneau d'administration où vous devriez pouvoir voir votre abonnement.
Tout le code pour ce point de départ peut être trouvé sur la page abonnements sur Github. Tout le code que nous allons ajouter ci-dessous se trouve sur la branche alertes sur Github. Pour votre commodité, vous pouvez voir tous les changements entre notre point de départ et notre point d'arrivée sur Github.
API de synthèse vocale Nexmo
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.
Nexmo Voice est le moyen le plus simple de créer des applications vocales de haute qualité dans le cloud. Il possède de nombreuses fonctionnalités et celle que nous allons étudier aujourd'hui est l'API TTS (Text-To-Speech API). API de synthèse vocale (TTS). Nous utiliserons cette API pour envoyer aux gens des appels vocaux qui leur énonceront les alertes d'inondation. Pour ce faire, nous allons apporter les modifications suivantes à notre application :
Ajouter le Nexmo Ruby Gem à notre application
Créer un formulaire permettant à l'administrateur de sélectionner les destinataires des alertes.
Envoyer une demande à l'API Nexmo pour un message Text-To-Speech
Ajouter la gemme Nexmo Ruby à notre application
Afin d'envoyer un message Text-To-Speech via Nexmo, nous allons devoir ajouter la gemme nexmo au projet.
# Gemfile
gem 'nexmo'
gem 'dotenv'Comme vous pouvez le voir, nous avons également ajouté la dotenv gem. C'est juste pour que l'application puisse charger les informations d'identification de l'API à partir d'un fichier .env fichier. La gem Nexmo récupère automatiquement ces variables d'environnement et les utilise pour initialiser le client. Vous pouvez trouver vos informations d'identification sur la page des paramètres de votre Account Nexmo.
Ensuite, nous devons également indiquer à l'application d'utiliser ces deux pierres précieuses lorsqu'elle démarre.
# app.rb
require 'nexmo'
require 'dotenv'
Dotenv.loadMaintenant que nous avons chargé ces deux pierres précieuses, nous pouvons simplement appeler Nexmo::Client.new n'importe où, sans aucun paramètre, pour commencer à passer des appels à l'API.
Sélectionnez un numéro ou un code postal

Avant d'envoyer des alertes à tout le monde, nous devrions probablement donner à l'administrateur un moyen de sélectionner les personnes à qui envoyer un message. Commençons par ajouter un formulaire au panneau d'administration.
<!-- views/admin.erb -->
...
</table>
<h2 class='header'>Send an alert</h2>
<form class="form form-vertical" action="/alert" method="post">
<div class="form-group form-inline">
<select class="form-control" name="number">
<option disabled selected value> -- select a number -- </option>
<% Subscriber.pluck(:number).sort.each do |number| %>
<option><%= number %></option>
<% end %>
</select>
</div>
<input type='submit' value='Send' class='btn btn-primary'>
</form>
Ignorant le boilerplate de Bootstrap, tout ce que nous avons fait ici est de créer un formulaire avec un champ qui nous donne la possibilité de cibler un numéro de téléphone. Ajoutons un deuxième champ après le champ <select> que nous venons d'ajouter et qui nous permet de choisir parmi tous les codes postaux.
<!-- views/admin.erb -->
</select>
...
or
<select class="form-control" name="postcode">
<option disabled selected value> -- select a postcode -- </option>
<% Subscriber.pluck(:postcode).sort.each do |postcode| %>
<option><%= postcode %></option>
<% end %>
</select>
...
Envoi d'un message texte-parole de diffusion d'alertes vocales
Lorsque l'administrateur soumet ce formulaire, celui-ci POST une requête à /alert où nous pouvons analyser le numéro ou le code postal sélectionné et faire un appel à l'API Nexmo.
# app.rb
...
post '/alert' do
if params[:number]
send_alert(:number, params[:number])
elsif params[:postcode]
send_alert(:postcode, params[:postcode])
end
redirect '/alert'
endA l'intérieur de send_alertqui envoie effectivement le message, nous transmettrons 4 paramètres à la méthode initiate_tts_call de la méthode Nexmo::Client.
to- Le numéro auquel envoyer un message vocal. (obligatoire)text- Le message à adresser au destinataire (obligatoire)from- Le numéro de Nexmo Voice à partir duquel envoyer un message vocal (optionnel)lg- La langue vocale à utiliser. Dans ce cas, nous utiliserons une voix britannique. (optionnel)
Pour obtenir un Nexmo Voice Number, rendez-vous sur le Nexmo Dashboard et achetez un numéro, ou bien utilisez la fonction CLI de Vonage et acheter un numéro directement sur la ligne de commande. Une fois acheté, ajoutez le numéro au fichier .env fichier :
Nous pouvons maintenant envoyer notre message.
# app.rb
def send_alert key, value
Subscriber.where(key => value).each do |subscriber|
Nexmo::Client.new.initiate_tts_call(
to: subscriber.number,
from: ENV['NEXMO_PHONE_NUMBER'],
text: %{
<break time="1s"/> Hello #{subscriber.name}.
This is a flood alert for
<prosody rate="-50%">#{subscriber.postcode}</prosody>.
Thank you for using Nexmo.
},
lg: 'en-gb'
)
end
endIci, nous trouvons tous les Subscribers qui correspondent au code postal ou au numéro donné, et pour chacun d'entre eux, nous lançons un appel à l'API Nexmo.
Le paramètre du message vocal text du message vocal contient quelques éléments intéressants. Tout d'abord, nous avons utilisé l'étiquette <break/>-pour faire une pause d'une seconde au début de l'appel. Cela permet d'attendre que le destinataire porte le téléphone à son oreille. De même, nous avons utilisé la balise <prosody>-pour ralentir la prononciation du code postal. Vous trouverez plus d'informations sur ces balises dans notre documentation.
Enfin, il ne nous reste plus qu'à nous assurer que lorsque l'administrateur est redirigé, il voit une page qui confirme qu'il a envoyé l'alerte.
# app.rb
get '/alert' do
erb :alert
end<!-- views/alert.erb -->
<% content_for :title do %>
Alert sent
<% end %>
<p>
Your Nexmo Flood Alert has been sent.
</p>
C'est tout, essayez ! Veillez à redémarrer Sinatra si nécessaire. Sélectionnez votre propre numéro dans le menu déroulant et soumettez le formulaire. Vous devriez recevoir un appel vocal dans les secondes qui suivent !
Prochaines étapes
L'API Nexmo Text-To-Speech API a beaucoup plus d'options que celles que nous avons présentées ici, et nous avons même omis quelques options très puissantes :
Nexmo peut automatiquement réessayer un appel jusqu'à 10 fois.
Nexmo peut détecter automatiquement les répondeurs et laisser un message ou raccrocher.
Vous pouvez spécifier un point de terminaison webhook pour que Nexmo effectue un appel HTTP après qu'une alerte a été reçue avec succès.
Vous pouvez spécifier le genre préféré de la voix utilisée pour transformer votre texte en parole
Personnellement, j'aime beaucoup le fait de pouvoir envoyer un message Text-To-Speech comme celui-ci sans avoir directement besoin de webhooks, ce qui me permet d'ajouter des webhooks uniquement en cas de besoin ou ultérieurement.
J'aimerais savoir ce que vous ajouteriez ensuite ? N'hésitez pas à m'envoyer un tweet (je suis @cbetta) pour me faire part de vos réflexions et de vos idées.
