https://a.storyblok.com/f/270183/1368x665/7bb8d4d606/became-a-millionaire_vonage-api-ai.png

Como me tornei milionário com as APIs da Vonage

Publicado em November 12, 2024

Tempo de leitura: 8 minutos

Spoiler: Na verdade, não sou milionário.

Todos nós já sonhamos com isso — sentar na cadeira do concorrente no programa “Quem Quer Ser Milionário', encarando aquela pergunta final, com o apresentador esperando pela sua resposta. Mas e se, em um mundo de multiversos e realidades alternativas, eu saísse de lá com um cheque gordo na mão?

E se eu te dissesse que descobri uma maneira de vencer? Cada. Único. vez.

Nesta postagem, vamos mergulhar por um momento nesse universo alternativo — onde as APIs da Vonage me transformaram em milionário, e ninguém suspeitou de nada.

O Roubo Perfeito

Neste universo, não sou apenas um participante de um programa de jogos — sou o mentor por trás do golpe perfeito. Uma última pergunta me separa do grande prêmio. Guardei cuidadosamente minha última ajuda, “Ligar para um amigo”, exatamente para este momento. O que está em jogo não poderia ser maior, mas estou tranquilo. Estou no controle.

Por quê? Porque essa não é uma ligação qualquer.

Tenho um trunfo na manga — um amigo que sabe de tudo. Em vez de ligar para uma pessoa de verdade, montei algo um pouco... fora do comum. O número que passei para o programa é um número de telefone virtual que comprei da Vonage.

No momento em que o apresentador disca o número, minha operação meticulosamente planejada começa. Ninguém na plateia, nem mesmo o apresentador, tem a menor ideia do que está acontecendo nos bastidores. Uma cadeia de processos automatizados, todos alimentados pelas APIs da Vonage, entra em ação para me fornecer a resposta correta.

O assalto perfeito não se resume apenas a sair impune — trata-se de executá-lo com tanta perfeição que ninguém sequer perceba que algo fora do comum aconteceu.

Deixe-me explicar como consegui fazer isso.

Insira aqui uma “risada maléfica”

Passo 1: Precisamos de um número

Todo golpe começa com as ferramentas certas; neste caso, precisamos de um número — um número virtual. Por que um número virtual? Porque ele é a chave para controlar o fluxo de informações, permitindo-nos interceptar a chamada e manipulá-la conforme quisermos. Ele suporta tanto chamadas e mensagens recebidas quanto enviadas. Não é necessário nenhum dispositivo, nem intervenção manual — basta um número virtual e um webhook.

Um número virtual permite que você receba chamadas e as encaminhe para qualquer lugar — até mesmo para um sistema automatizado. Nesse caso, a chamada acionará uma série de interações sem que ninguém perceba que se trata de algo diferente de uma chamada telefônica comum. Você pode ler mais sobre números virtuais aqui.

Mais especificamente, no caso da Vonage, o processo é relativamente simples. Você pode começar com a Voice API da Vonage para adquirir um número e configurá-lo para direcionar para um webhook de sua escolha — neste caso, o webhook que irá processar a chamada.

Assim que o anfitrião discar o número, a chamada será automaticamente encaminhada para o nosso webhook. A partir daí, é que começa a verdadeira diversão.

Etapa 2: Nosso informante interno

Quando o apresentador liga para o número, alguém precisa atender o telefone, certo? Mas não é qualquer pessoa do outro lado da linha. Não, é aqui que apresentamos nosso informante: Adam. Ele é um amigo de 40 anos que mora em Londres e tem muito conhecimento, pronto para ajudar com as perguntas mais desafiadoras.

Mas eis a reviravolta — Adam na verdade não existe. Ele é totalmente sintético, criado pela recurso de conversão de texto em fala (TTS) . Quando o apresentador liga, a voz de Adam é gerada em tempo real, e é tão natural e convincente que ninguém jamais suspeitaria que não está falando com uma pessoa de verdade.

Ele tem tudo o que é preciso: uma voz tranquila e natural e um sotaque londrino autêntico, o que faz dele o cúmplice perfeito.

// Our webhook
[HttpPost("answer")]
public IActionResult Answer()
{
    // Creating a Talk action with Adam's greeting message
    var talkAction = VoiceAdapter.MakeAdamTalk(GreetingsMessage);
    ...
    // Return a call control object to define the call flow 
    return this.Ok(new Ncco(talkAction, ...));
}

public static TalkAction MakeAdamTalk(string text) =>
    new TalkAction
    {
        Text = text,
        Language = "en-GB",
        Style = 6, 
        Premium = true, // Provides a more natural voice    
    };

private const string GreetingsMessage = "Adam here. What can I do for you?";

Conforme mostrado no trecho de código, retornamos um Objeto de Controle de Chamada (NCCO)  com um ação de para realizar Adam falar. Quando a ligação for atendida, ele cumprimentará o apresentador com uma mensagem, garantindo que a conversa pareça autêntica desde a primeira palavra.

Etapa 3: Transcrição de texto

Fomos recebidos pelo nosso informante; é hora de compartilhar nossa pergunta final com ele. O próximo passo do nosso golpe é fundamental: converter minha pergunta falada em texto. Para isso, vamos usar o funcionalidade de conversão de voz em texto da Voice API da Vonage.

No nosso webhook, após a saudação de Adam, precisamos adicionar um ação de entrada de voz para capturar minha pergunta.

[HttpPost("answer")]
public IActionResult Answer()
{
    var talkAction = VoiceAdapter.MakeAdamTalk(GreetingsMessage);
    var inputAction = new MultiInputAction
    {
        Type = [NccoInputType.Speech],
        // Url where the transcription will be sent
        EventUrl = apiUrl + "/Webhooks/asr"],
        Speech = new SpeechSettings
        {
            Language = "en-GB",
            MaxDuration = 20,
            EndOnSilence = 2,
        },
    };
    return this.Ok(new Ncco(talkAction, inputAction));
}

// Webhook that will receive the text transcription
[HttpPost("asr")]
public async Task<IActionResult> Speech(MultiInput speechResponse) 
{
    ...
}

Nosso Objeto de Controle de Chamadas agora contém duas ações que serão executadas em sequência: Adam cumprimentará o anfitrião e, em seguida, o sistema ouvirá minha pergunta. Assim que o sistema detectar que minha fala terminou, seja por um período de silêncio ou por ter atingido a duração máxima, a transcrição será enviada para o webhook que configuramos.

Aqui está a transcrição da minha pergunta:

E aí, Adam! Olha só, estou participando do programa “Quem quer ser milionário?” com o Jeremy Clarkson e estou ligando para você como parte do meu último recurso, o “Ligar para um amigo”. Preciso da sua ajuda com a pergunta final.

Aqui está: “Durante a Guerra Fria, o governo dos EUA construiu um bunker para abrigar o Congresso sob qual resort de golfe?”

A: TheBreakers B: TheGreenbrier C: Pinehurst D: TheBroadmoor

Essa etapa é absolutamente essencial. O texto é um dado — e, nesse golpe, os dados são tudo. Eles podem ser manipulados, analisados e, o mais importante, repassados para a próxima fase do nosso plano.

Etapa 4: O Oráculo

Agora que temos a transcrição do texto da pergunta, é hora de consultar nossa entidade onisciente: GPT4. Nesta aventura, ele é o nosso oráculo — aquele que detém todas as respostas.

Assim que a transcrição chega ao nosso webhook, enviamos o texto, juntamente com um prompt personalizado, para o GPT-4. Esse prompt garante que a IA forneça a resposta precisa de que precisamos para vencer, já que Adam.

Contexto: 

Estamos no programa “Quem quer ser milionário?”, e estou ligando para você como parte do meu último recurso, “Ligar para um amigo”.

Você é Adam, um homem de 40 anos que usa o inglês do Reino Unido. 

Sua resposta precisa parecer que você realmente pegou o telefone para me dar uma resposta e que está fingindo pensar na resposta.

Sua resposta será transcrita por meio de conversão de texto em fala; portanto, evite dizer qualquer coisa que uma pessoa não diria. 

Não precisa de cumprimentos, e me deseje boa sorte para o jogo no final da sua resposta.

[HttpPost("asr")]
public async Task<IActionResult> Speech(MultiInput speechResponse) =>
    await FetchQuestion(speechResponse.Speech.SpeechResults)
        .MapAsync(aiAdapter.AskAsync)
        .Map(VoiceAdapter.MakeAdamTalk)
        .Map(this.Ok)
        .IfNone(this.Ok(VoiceAdapter.MakeAdamTalk(FailedToUnderstandQuestion)));

private static Maybe<string> FetchQuestion(SpeechRecognitionResult[] results) =>
    results.Length != 0 ? results.First().Text : Maybe<string>.None;

public Task<string> AskAsync(string question)
{
    var client = new ChatGpt(
        configuration["openai-key"] ?? throw new InvalidOperationException("Missing OpenAI key."),
        new ChatGptOptions { Model = "gpt-4-turbo" });
    return client.Ask(configuration["prompt"] + "\n" + question);
}

Graças ao nosso prompt personalizado, o Oracle irá gerar uma resposta em texto em que Adam parece estar refletindo cuidadosamente sobre a resposta. Seja um fato histórico complexo ou uma curiosidade complicada, ele produzirá a resposta perfeita, pronta para ser apresentada em voz de Adam.

Esta é a resposta que recebemos à minha pergunta:

Hmm... essa é difícil. Deixa eu pensar... 

Lembro-me de ter lido sobre isso há algum tempo. 

Não acho que seja o The Breakers ou o Pinehurst; esses não parecem ser os lugares certos. 

Estou inclinado a escolher o The Greenbrier, se não me engano. 

É, tenho quase certeza de que é a opção B: The Greenbrier. 

É esse que eles usavam para o Congresso durante a Guerra Fria.

Boa sorte, espero que você arrasar!

No entanto, há uma ressalva: essas coisas não acontecem tão rápido quanto estalar os dedos. Vamos analisar nosso cenário:

  • Faço minha pergunta.

  • Após dois segundos de silêncio, a gravação de voz é transcrita para texto.

  • A pergunta é enviada ao GPT, que gera a resposta.

Estamos diante de uma possível latência — algo entre cinco e dez segundos até recebermos a resposta. É um tempo precioso que vai se esgotando, e isso pode comprometer todo o meu plano.

Uma possível solução técnica seria recorrer à API em tempo real da OpenAI, que foi lançada recentemente. Mas, infelizmente, esse é um luxo de tempo que não tenho.

Em vez disso, pensei em uma solução alternativa inteligente: conversa fiada. Sei que Jeremy Clarkson adora seu Ford GT40 e, se eu tocar no assunto de forma casual, consigo fazê-lo falar. O entusiasmo dele por carros vai me dar os poucos segundos extras de que preciso para que a IA gere a resposta.

E quando estiver pronto? Mandamos um Talk com a resposta como resposta ao nosso endpoint, e o Adam entregará com segurança a resposta correta ao apresentador.

Etapa 5: A vitória

Com a resposta em mãos, repito a resposta de— “B: The Greenbrier” — de volta ao apresentador, calmo como sempre. E, assim, sem mais nem menos, ganhei!

Visto de fora, ninguém suspeita de nada. Para o público, parece que liguei para uma pessoa de carne e osso que, por acaso, sabe todas as respostas. Mal sabem eles que tudo isso foi possível graças às APIs da Vonage, um pouco de IA e — o mais importante — criatividade.

O assalto perfeito não dependia das ferramentas, mas de como eu as utilizava.

Conclusão

Voltando à realidade, obviamente não sou milionário — nem um gênio do crime.

Na verdade, meu plano tem muitas falhas. Para começar, eu teria que garantir que o apresentador não fizesse nenhuma pergunta complementar ao Adam, ou pior ainda, ligasse para o número antes do momento decisivo. O fluxo de trabalho que organizei também é bastante rígido: Cumprimento → Pergunta → Resposta. Se nos desviarmos disso, todo o plano vai por água abaixo.

E, claro, há a pequena questão de chegar à pergunta final! Não tenho conhecimento suficiente para responder a 14 perguntas no “Quem Quer Ser Milionário?” — talvez uma das minhas variantes no multiverso tenha, mas certamente não sou eu.

Do ponto de vista técnico, a conversão de fala em texto e a conversão de texto em fala podem não ser tecnologias novas, mas continuam sendo incrivelmente úteis. No entanto, a verdadeira lição deste post vem da automação — integrar plataformas como a Vonage e a OpenAI para criar um fluxo de trabalho específico. Não se trata apenas de usar ferramentas de ponta, mas de como combiná-las para criar algo único.

Como sempre, fique à vontade para entrar em contato comigo pelo meu LinkedIn ou junte-se a nós no Slack dos desenvolvedores da Vonage. Você também pode nos enviar uma mensagem no @VonageDev no X.

Boa programação, e até mais tarde!

Compartilhar:

https://a.storyblok.com/f/270183/384x384/fdffb72c8b/guillaume-faas.png
Guillaume FaasEx-funcionários da Vonage

Guillaume é um ex-membro da equipe da Vonage. Ele atuou como Promotor Sênior de Desenvolvimento .NET na Vonage. Trabalha com .NET há quase 15 anos, tendo se dedicado, nos últimos anos, à promoção do Software Craftsmanship. Seus temas favoritos incluem qualidade de código, automação de testes, mobbing e code katas. Fora do trabalho, ele gosta de passar tempo com a esposa e a filha, malhar ou jogar videogame.