https://a.storyblok.com/f/270183/428824/8052a726fd/tweet-to-talk.png

Criação de um IVR no Twitter com conversão de texto em fala e a Voice API Nexmo

Publicado em May 13, 2021

Tempo de leitura: 5 minutos

Sou meio viciado no Twitter. Assim como muitos outros entusiastas de tecnologia, me cadastrei quando o Twitter explodiu em popularidade no SXSW em 2007, e ele ainda se destaca como uma ótima maneira de acompanhar o que está rolando em festivais ou conferências.

Mas a internet nas conferências geralmente não é muito boa. Você ainda pode tuitar por SMS, mas sem uma conexão de dados não dá para acompanhar a hashtag da conferência nem pesquisar tuítes nas proximidades para descobrir onde está a melhor festa pós-evento. Mas, mesmo sem dados, provavelmente ainda dá para fazer ligações. Vamos configurar um bot do Twitter que possamos controlar por meio de uma ligação telefônica e fazer com que ele leia os tweets para nós!

Antes de começarmos

Há algumas coisas de que você vai precisar antes de começarmos.

Controlando nosso bot com DTMF

Pode haver várias hashtags que queremos acompanhar, ou talvez queiramos poder conferir os tweets mais recentes de algumas contas diferentes. Por isso, precisamos de uma maneira de indicar ao nosso bot qual feed ele deve ler para nós.

Para isso, vamos usar a sinalização multifrequencial de dois tons (DTMF). Quando você disca um número no seu telefone, aquele tom que você ouve é o DTMF. Com a ação do Nexmo input , solicitamos que o usuário digite um número específico e, em seguida, variamos a ação a ser realizada com base no número digitado. Se você já precisou ligar para uma linha de atendimento ao cliente, provavelmente já se deparou com um sistema de resposta de voz interativa (IVR), que é exatamente o que estamos prestes a criar.

Quando um usuário ligar, vamos ler em voz alta uma lista das opções disponíveis, solicitar que ele faça uma escolha e, em seguida, usar a API do Twitter e a tecnologia de conversão de texto em fala para ler os tweets relevantes para ele.

Criação de um sistema de resposta de voz interativa com Python e Flask

Quando um usuário liga para o nosso número virtual, a Nexmo solicita o nosso objeto de controle de chamadas da Nexmo (NCCO). O NCCO é um arquivo JSON que contém uma lista de ações que a Nexmo deve realizar quando alguém ligar para o nosso número. Vejamos um exemplo.

[
  {
    "action": "talk", 
    "bargeIn": "true", 
    "text": "Welcome to Nexmo's talking Twitter. Please select from the following options. To hear the latest breaking news press 1. For showbiz gossip press 2. If you'd like to hear the latest #API tweets press 3. Or for tweets by Aaron Bassett press 4.", 
    "voice_name": "Amy"
  }, 
  {
    "action": "input", 
    "eventUrl": [
      "https://example.com/ivr/"
    ], 
    "maxDigits": 1
  }
]

O NCCO acima tem duas ações: primeiro, usamos a conversão de texto em fala para informar ao chamador quais são suas opções; definimos bargeIn como “true” para que o usuário possa digitar o número a qualquer momento, sem precisar ouvir a mensagem inteira, caso já saiba qual opção deseja. A próxima ação captura o número digitado pelo usuário e o envia via POST para o nosso eventUrl. Isso eventUrl retornará outro NCCO, que informará à Nexmo o que fazer a seguir.

Conversão de tweets em fala

Quando o usuário digita um número, ele é enviado como parte de uma solicitação POST para o nosso /ivr/ ponto de extremidade. Usando algumas condições (vamos lá, Guido, deixa a gente ter uma instrução switch de uma vez!) , podemos comparar a entrada do usuário com nossa lista de tweets possíveis e retornar cada tweet como uma talk ação em nosso novo NCCO. Usaremos text-to-speech para ler os tweets para o usuário.

Se o usuário tiver inserido um valor que não reconhecemos, reproduzimos uma mensagem curta informando que a entrada não foi compreendida e, em seguida, reiniciamos o processo.

Experimente você mesmo

view on Github

O código de exemplo usa Python e Flask; por isso, recomendo que você crie um novo ambiente virtual de Python para, em seguida, clonar o código e instalar as dependências.

git clone git@github.com:nexmo-community/nexmo-call-twitter.git
cd nexmo-call-twitter/
pip install -r requirements.txt

É necessário fazer uma pequena configuração; no app.py defina o event_url na sua URL do ngrok, seguido de /ivr/, e certifique-se de definir as variáveis necessárias do Twitter em seu ambiente. Você pode encontrar detalhes sobre como criar um novo aplicativo do Twitter na documentação do python-twitter.

export TWITTER_CONSUMER_KEY=
export TWITTER_CONSUMER_SECRET=
export TWITTER_ACCESS_KEY=
export TWITTER_ACCESS_SECRET=

Depois de definir todas as variáveis necessárias, você pode executar o aplicativo Flask. Vamos iniciá-la no modo de desenvolvimento; assim, teremos uma boa saída de depuração caso algo dê errado. Você precisará criar mais algumas variáveis de ambiente para o Flask.

export FLASK_APP=app.py
export FLASK_DEBUG=1

E, assim que estiverem configurados, podemos executar nosso aplicativo usando:

flask run

Experimente visitar http://127.0.0.1:5000 no seu navegador. Se tudo estiver funcionando corretamente, você deverá ver nosso NCCO. Mas, para tornar esse servidor acessível pela Voice API da Nexmo, precisamos que ele seja público. Portanto, certifique-se de que o ngrok esteja em execução e apontando para a porta correta.

Você também precisará configurar seu aplicativo de voz da Nexmo. A maneira mais fácil de fazer isso é por meio da nossa seção “Gerenciamento de aplicativos de voz” do Painel do Nexmo. A URL do evento não importa neste exemplo, já que não vamos trabalhar com nenhum webhook; portanto, defina-a e a sua URL de resposta com a sua URL do ngrok.

screenshot of Nexmo voice application screenscreenshot of Nexmo voice application screen

Depois de criar/configurar seu aplicativo de voz, não se esqueça de associar um número de telefone a ele!

Experimente

Para testar, basta ligar para o número virtual da Nexmo que você vinculou ao seu novo aplicativo de Voice. Você deverá ouvir a mensagem de introdução com as diferentes opções disponíveis. Tente discar números diferentes ou até mesmo um número que não seja reconhecido e preste atenção nas diferentes mensagens que receberá em resposta.

Utilizando suas próprias fontes de dados

Edite o exemplo e altere os Accounts do Twitter ou a hashtag das quais você deseja recuperar tweets, mas não se esqueça de atualizar sua mensagem introdutória para refletir essas alterações.

É claro que você não precisa extrair suas mensagens do Twitter. Você pode usar qualquer fonte de dados que quiser e descobrir como estão se saindo suas ações, ter sempre à mão um estoque de piadas de paiou até mesmo conferir o que está no topo do Hacker News.

ncco = []

topstories = requests.get('https://hacker-news.firebaseio.com/v0/topstories.json').json()
for x in range(0, 5):
    story = requests.get(
        'https://hacker-news.firebaseio.com/v0/item/{id}.json'.format(
            id=topstories[x]
        )
    ).json()

    ncco.append({
        'action': 'talk',
        'text': story['title']
    })

Na verdade, você pode executar qualquer código que quiser. Todos nós já ouvimos falar em ChatOps, mas e quanto ao IVROps?

Pressione 1 para desligar e ligar novamente

IT Crowd: Have you tried switching it off and back on again?IT Crowd: Have you tried switching it off and back on again?

Embora talvez seja uma boa ideia incluir algum tipo de autenticação nisso…

[
    {
        "action": "talk",
        "text": "Please enter your PIN followed by the hash key"
    },
    {
        "action": "input",
        "submitOnHash": "true",
        "eventUrl": ["https://example.com/verifypin/"]
    }
]

Compartilhar:

https://a.storyblok.com/f/270183/150x150/a3d03a85fd/placeholder.svg
Aaron BassettEx-funcionários da Vonage

Aaron era um defensor de desenvolvedores na Nexmo. Engenheiro de software experiente e aspirante a artista digital, Aaron costuma ser visto criando coisas com código ou com eletrônica; às vezes, os dois. Geralmente, dá para perceber quando ele está trabalhando em algo novo pelo cheiro de componentes queimando no ar.