
Compartilhar:
Phil is Head of Developer Relations at Hookdeck, an asynchronous messaging platform, and a proud Vonage alumni.
Criação de um sistema de transmissão de alertas de voz usando Ruby
Tempo de leitura: 8 minutos
Às vezes, uma mensagem de texto não é suficiente. Quando você realmente quer ser avisado sobre algo importante, provavelmente prefere receber uma ligação de verdade; seja porque um servidor está fora do ar ou porque ocorreu um desastre natural na sua região.
Da mesma forma, um prestador de serviços ou uma autoridade (local) que esteja lidando com uma emergência desejará entrar em contato com o maior número possível de pessoas, o mais rápido possível, independentemente de elas possuírem um celular.
O aplicativo de alertas de transmissão de voz “The Flood”
Neste tutorial, vamos adicionar um Sistema de Transmissão de Alertas de Voz a um aplicativo já existente usando a API de conversão de texto em fala (TTS) da Nexmo. Para isso, criamos o aplicativo Nexmo Flood Alerts , que permite que as pessoas se inscrevam para receber alertas de voz correspondentes ao seu CEP.

Este aplicativo servirá como ponto de partida para este tutorial. Trata-se de um aplicativo básico aplicativo , escrito em Ruby com algumas gems adicionais para facilitar as coisas. Adicionamos o SQLite3 e ActiveRecord para armazenar nossos assinantes. Também adicionamos o Bootstrap para deixar nossa interface um pouco mais atraente. Por fim, para este tutorial, deixamos a obtenção dos dados sobre enchentes como um detalhe de implementação e, em vez disso, enviaremos manualmente as notificações pelo painel de administração.
Você pode baixar o código inicial deste aplicativo no GitHub:
Em seguida, acesse localhost:4567 no seu navegador e inscreva-se para receber um alerta de enchente com seu CEP e seu número de telefone. Depois disso, você pode acessar o (muito rudimentar) painel de administração , onde você poderá ver sua inscrição.
Todo o código para este ponto de partida pode ser encontrado nas ramo “subscriptions” no GitHub. Todo o código que adicionaremos a seguir pode ser encontrado no ramo . Para sua conveniência, você pode ver todas as alterações entre nosso ponto inicial e final no GitHub também.
API de conversão de texto em fala da Nexmo
Nexmo Voice é a maneira mais fácil de criar aplicativos de voz de alta qualidade na nuvem. Ele oferece diversos recursos, e o que vamos abordar hoje é a API de conversão de texto em fala (TTS). Usaremos essa API para enviar às pessoas chamadas de voz que irão ler em voz alta os alertas de enchentes para elas. Para isso, vamos adicionar as seguintes alterações ao nosso aplicativo:
Adicione o gem Ruby da Nexmo ao nosso aplicativo
Crie um formulário para permitir que o administrador selecione quem recebe os alertas
Envie uma solicitação à API da Nexmo para uma mensagem de conversão de texto em fala
Incorporando a gem do Nexmo para Ruby ao nosso aplicativo
Para enviar uma mensagem de conversão de texto em fala pelo Nexmo, teremos que adicionar o nexmo gem ao projeto.
# Gemfile
gem 'nexmo'
gem 'dotenv'Como você pode ver, também adicionamos o dotenv gem. Isso serve apenas para que o aplicativo possa carregar as credenciais da API a partir de um .env arquivo. A gem Nexmo detecta automaticamente essas variáveis de ambiente e as utiliza para inicializar o cliente. Você pode encontrar suas credenciais na página de configurações da sua conta Nexmo.
Em seguida, também precisamos configurar o aplicativo para usar essas duas gems ao ser iniciado.
# app.rb
require 'nexmo'
require 'dotenv'
Dotenv.loadAgora que carregamos essas duas gems, basta chamar Nexmo::Client.new em qualquer lugar, sem nenhum parâmetro, para começar a fazer chamadas à API.
Selecione um número ou um CEP

Antes de começarmos a enviar alertas para todo mundo, provavelmente deveríamos dar ao administrador a possibilidade de selecionar para quem enviar uma mensagem. Vamos começar adicionando um formulário ao painel de administração.
<!-- 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>
Ignorando o código padrão do Bootstrap, tudo o que fizemos aqui foi criar um formulário com um campo que nos permite selecionar um número de telefone. Vamos adicionar um segundo campo após o <select> que acabamos de adicionar, que nos permita escolher entre todos os códigos postais também.
<!-- 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>
...
Enviar uma mensagem de texto-para-voz como alerta de voz
Quando o administrador enviar este formulário, isso irá POST uma solicitação para /alert onde podemos analisar o número ou código postal selecionado e fazer uma chamada à API da 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'
endDentro send_alert, que de fato envia a mensagem, vamos passar quatro parâmetros para o initiate_tts_call método do Nexmo::Client.
to- O número para o qual enviar uma mensagem de voz. (obrigatório)text- A mensagem a ser transmitida ao destinatário (obrigatório)from- O número do Nexmo Voice do qual se deseja enviar uma mensagem de voz (opcional)lg- O idioma da voz a ser usado. Neste caso, usaremos uma voz britânica. (opcional)
Para obter um número de voz da Nexmo, acesse o Painel da Nexmo e compre um número, ou, como alternativa, use o CLI da Vonage e compre um número diretamente na linha de comando. Após a compra, adicione o número ao .env arquivo:
Agora podemos enviar nossa mensagem.
# 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
endAqui encontramos todos os Subscribers que correspondem ao CEP ou número fornecido e, em seguida, para cada um deles, fazemos uma chamada à API da Nexmo.
O parâmetro da mensagem de voz text contém alguns detalhes interessantes incorporados ao texto. Em primeiro lugar, usamos a <break/>-tag para fazer uma pausa de um segundo no início da ligação. Isso é útil para esperar que o destinatário coloque o telefone no ouvido. Da mesma forma, usamos a <prosody>-tag para diminuir o ritmo da pronúncia do CEP. Mais informações sobre essas tags podem ser encontradas em nossa documentação.
Por fim, tudo o que precisamos fazer é garantir que, quando o administrador for redirecionado, ele veja uma página que confirme que o alerta foi enviado.
# 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>
É isso aí, experimente! Não se esqueça de reiniciar o Sinatra, se necessário. Escolha seu próprio número no menu suspenso e envie o formulário. Você deve receber uma chamada de voz em poucos segundos!
Próximos passos
A API de conversão de texto em fala da Nexmo oferece muitas mais opções do que mostramos aqui, e, na verdade, deixamos de fora algumas muito poderosas:
A Nexmo pode tentar novamente uma ligação automaticamente para você até 10 vezes
A Nexmo consegue detectar automaticamente secretárias eletrônicas e, dependendo do caso, deixar uma mensagem ou desligar
Você pode especificar um endpoint de webhook para que a Nexmo faça uma chamada HTTP após o recebimento bem-sucedido de um alerta
Você pode especificar o gênero preferido da Voice usada para converter seu texto em fala
Pessoalmente, gosto muito de poder enviar uma mensagem de conversão de texto em fala como essa sem precisar usar webhooks diretamente, o que me permite adicionar webhooks apenas se for necessário ou mais tarde.
Adoraria saber o que você acrescentaria a seguir. Por favor, me mande um tweet (meu nome de usuário é @cbetta) com suas opiniões e ideias.