https://a.storyblok.com/f/270183/228774/72e2156c77/audio-file-java.png

Reproduzir um arquivo de áudio durante uma chamada de Voice com Java e Spark

Publicado em April 30, 2021

Tempo de leitura: 17 minutos

Este tutorial mostra como transmitir áudio durante uma chamada usando a Voice API Nexmo.

O caso de uso mais óbvio para isso é reproduzir música de espera ou mensagens. Ninguém gosta muito de ficar em espera. Mas você pode tornar essa experiência o mais agradável possível, oferecendo aos seus clientes algo para ouvir, em vez de silêncio. Estudos demonstraram que o tempo parece passar mais rápido quando os clientes têm algo para ouvir, e isso também pode reduzir significativamente seus níveis de ansiedade — o que é ótimo quando eles ligam para o seu atendimento ao cliente para reclamar.

No entanto, os mesmos estudos também indicaram que quem liga pode reagir negativamente se não gostar do que é obrigado a ouvir. Portanto, escolha sua música ou mensagem com cuidado e, faça o que fizer, não faça um “Rick Roll” neles!

Para atender uma chamada recebida, é necessário criar um webhook e configurar sua conta Nexmo para usá-lo. Usaremos Java e a framework web Spark para criar o webhook. Assim que a chamada estiver em andamento, usaremos a Biblioteca Cliente da API REST da Nexmo para Java para transmitir o áudio para ele. Você pode encontrar uma versão do código deste tutorial no GitHub.

Pré-requisitos

  • O JDK ou seu equivalente de código aberto, o OpenJDK. Este tutorial foi escrito usando o OpenJDK 11, mas qualquer uma das versões a partir da 8 deve funcionar bem.

  • Gradle (versão 3.4 ou posterior) para compilar seu projeto e gerenciar suas dependências.

  • ngrok para disponibilizar seu webhook na Internet pública.

Como adquirir um número da Nexmo

Você precisa de um número virtual da Nexmo para receber chamadas. É possível adquirir um diretamente no painel do desenvolvedor, mas, neste tutorial, você utilizará a ferramenta CLI da Nexmo .

Instale a CLI do Nexmo:

npm install -g nexmo-cli

Em seguida, configure-o com o seu NEXMO_API_KEY e NEXMO_API_SECRET no painel do desenvolvedor:

nexmo setup NEXMO_API_KEY NEXMO_API_SECRET

Use a CLI da Nexmo para exibir os Numbers com voice recursos que estão disponíveis para compra no seu país, substituindo GB no comando a seguir pelo seu próprio código de país de dois caracteres:

nexmo number:search GB --voice --verbose

Escolha um número e compre-o:

nexmo number:buy NEXMO_NUMBER

Como tornar seu aplicativo acessível pela Internet

Você deve tornar seu webhook acessível às APIs da Nexmo. Uma ótima maneira de fazer isso durante o desenvolvimento é usar ngrok. Para saber mais, leia nossa postagem no blog sobre o ngrok.

Baixe e instale ngroke, em seguida, execute o comando a seguir para disponibilizar seu aplicativo na porta 3000 para a Internet pública:

ngrok http 3000

Anote as URLs públicas que ngrok são fornecidas e deixe o programa em execução durante todo este tutorial (pois você precisará configurar seu aplicativo com essas URLs, e ngrok ele fornece URLs novas e aleatórias toda vez que você o executa, a menos que você se inscreva em um plano pago):

Terminal showing the ngrok URLsTerminal showing the ngrok URLs

Criando seu projeto

Crie um diretório para o seu projeto chamado play-audio-into-call, vá para esse diretório e, em seguida, use gradle para inicializar o projeto:

mkdir play-audio-into-call cd play-audio-into-call gradle init --type=java-application

Aceite todas as configurações padrão e, em seguida, abra o projeto gerado no seu IDE.

Inicializar dependências

Localize o build.gradle arquivo e altere o repositório de dependências de jcenter() para mavenCentral():

repositories {
    mavenCentral()
}

Substitua a dependencies seção pelo seguinte:

dependencies {
    // Spark framework
    implementation 'com.sparkjava:spark-core:2.8.0'
 
    // Nexmo client library
    implementation 'com.nexmo:client:4.4.0'

    // Use JUnit test framework
    testImplementation 'junit:junit:4.12'
}

Não vamos usar JUnit neste exemplo, mas você pode deixá-lo lá por enquanto, sem problema.

Criar um aplicativo web usando o Spark

O Gradle criou a App classe no src/main/java/play/audio/into/call diretório.

Abra App.java no seu IDE. Remova o getGreeting() método que gradle foi criado para você e adicione a instrução necessária import instrução necessária para o spark pacote.

Em seguida, chame o método port para indicar que seu aplicativo está à espera de solicitações na porta 3000.

O seu App.java deveria ficar assim:

package play.audio.into.call;

import static spark.Spark.*;

public class App {
    public static void main(String[] args) throws Exception {       
        port(3000);
        System.out.println("I'm listening!");
    }
}

Execute seu aplicativo digitando gradle run no play-audio-into-call diretório. Verifique se está funcionando acessando http://localhost:3000 no seu navegador e ver a mensagem “I’m listening” exibida na página.

Criação de um aplicativo de Voice API

Um aplicativo de Voice API é um conceito da Nexmo e não deve ser confundido com o aplicativo que você vai desenvolver. Trata-se, na verdade, de um “contêiner” para as configurações de autenticação e configuração necessárias para trabalhar com a API.

Você pode criar um aplicativo da Voice API usando a CLI da Nexmo. É necessário fornecer um nome para o aplicativo e as URLs de dois endpoints de webhook: o primeiro é aquele para o qual as APIs da Nexmo enviarão uma solicitação quando você receber uma chamada recebida no seu número virtual, e o segundo é onde a API pode enviar dados de eventos.

Neste tutorial, estamos interessados apenas no webhook “answer”; portanto, você pode fornecer qualquer URL para o webhook “event”. Substitua o nome de domínio no comando da CLI do Nexmo a seguir pelo seu ngrok nome de domínio e execute-o no diretório raiz do seu projeto:

nexmo app:create “Play Audio Example” https://41acbcd0.ngrok.io/webhooks/answer https://example.com/webhooks/events --keyfile private.key

Este comando baixa um arquivo chamado private.key que contém informações de autenticação e retorna um ID exclusivo do aplicativo. Anote esse ID, pois você precisará dele nas etapas seguintes.

Como vincular seu número Nexmo

Agora você precisa vincular seu número virtual da Nexmo ao seu aplicativo da Voice API. Execute o seguinte comando da CLI da Nexmo, substituindo NEXMO_NUMBER pelo seu número virtual da Nexmo (incluindo o código de discagem internacional, mas omitindo quaisquer zeros à esquerda) e APPLICATION_ID pelo ID do aplicativo que você gerou na etapa anterior:

nexmo link:app NEXMO_NUMBER APPLICATION_ID

A configuração está concluída. Vamos voltar a programar seu aplicativo.

Atendendo a uma chamada recebida

Quando a Nexmo receber uma chamada no seu número virtual, ela enviará uma GET solicitação ao seu /webhooks/answer ponto de extremidade. Esse ponto de extremidade ainda não existe, mas você o criará em breve.

A Nexmo espera que seu webhook forneça uma resposta que contenha um Objeto de Controle de Chamadas da Nexmo (NCCO). Trata-se de uma matriz de objetos no formato JSON, cada um dos quais descreve um action que informa à Nexmo como lidar com a chamada.

Neste exemplo, você lerá uma mensagem de boas-vindas para quem está ligando usando a função de conversão de texto em fala e, em seguida, colocará essa pessoa em uma conferência. As duas ações do NCCO que permitem fazer isso são talk e conversation, respectivamente. Portanto, o NCCO que você precisa incluir em sua resposta terá a seguinte forma:

[
  {
    "action": "talk",
    "voiceName": "Russell",
    "text": "Please wait while we connect you to the conference"
  },
  {
    "action": "conversation",
    "name": "Test Conference"
  }
]

A talk ação deve ser bastante autoexplicativa. Tudo o que você está fazendo é ler a text string de volta para o usuário na Russell Voice. (Você pode encontrar uma lista completa das vozes disponíveis aqui).

A conversation ação exige que você forneça um name para a conferência, para que você possa incluir vários participantes na mesma conferência. Neste tutorial, você provavelmente será o único participante, mas ainda assim é necessário nomeá-la. Estamos usando a conversation ação apenas para manter a chamada aberta, para que possamos transmitir áudio para ela mais tarde.

A Biblioteca cliente da API REST da Nexmo para Java oferece algumas classes auxiliares para criar esse NCCO; portanto, vamos configurá-lo primeiro.

Inicializando o cliente Nexmo

Inclua a seguinte importação no seu App.java arquivo:

import com.nexmo.client.NexmoClient;

Em seguida, no seu main método, logo abaixo da chamada para port(3000), instancie a biblioteca do cliente, substituindo /path/to/your/private.key pelo caminho para o seu private.key arquivo e APPLICATION_ID pelo seu ID de aplicativo da Voice API:

public class App {
    public static void main(String[] args) throws Exception {
        port(3000);
        NexmoClient client = NexmoClient.builder()
            .applicationId("APPLICATION_ID")
            .privateKeyPath("/path/to/your/private.key")
            .build();
    }
}

Criação do webhook de resposta

Então, primeiro você precisa criar esse endpoint. A rota que você usará para isso é /webhooks/answer.

Inclua as seguintes import instruções:

import com.nexmo.client.voice.VoiceName;
import com.nexmo.client.voice.ncco.Ncco;
import com.nexmo.client.voice.ncco.TalkAction;
import com.nexmo.client.voice.ncco.ConversationAction;

E adicione este código ao seu main método:

get("/webhooks/answer", (req, res) -> {
    String callId = req.queryParams("uuid");
    System.out.println("Call answered. The UUID for this call is: " + callId);
    TalkAction intro = TalkAction.builder("Please wait while we connect you to the conference.")
        .voiceName(VoiceName.RUSSELL)
        .build();
    ConversationAction conversation = ConversationAction.builder("Test conference")
        .build();
    res.type("application/json");
    return new Ncco(intro, conversation).toJson();
});

Este código utiliza o TalkAction e ConversationAction classes auxiliares da biblioteca do cliente Nexmo para construir o NCCO, que é então retornado na resposta à Nexmo.

Teste isso verificando primeiro se ngrok está em execução e, em seguida, execute gradle run. Em seguida, ligue para o seu número virtual da Nexmo. Seu aplicativo exibirá o UUID da chamada e você deverá ouvir a mensagem de boas-vindas. A linha permanecerá aberta até que você desligue.

Reprodução de áudio durante a chamada

Agora você precisa de uma maneira de reproduzir o áudio na teleconferência. Para isso, você criará uma rota chamada /play/:id, em que :id é o UUID da chamada na qual você deseja transmitir o áudio. Você chamará essa rota manualmente assim que a teleconferência estiver em andamento.

Adicione a seguinte import instrução:

import com.nexmo.client.voice.StreamResponse;

Para criar a /play/:id rota no seu main :

get("/play/:id", (req, res) -> {
    String id = req.params(":id");
    final String URL = "http://example.com/your/audio/file.mp3";
    System.out.println("Playing audio into " + id.toString());
    StreamResponse startStreamResponse = client.getVoiceClient().startStream(id, URL, 0);
    System.out.println(startStreamResponse.getMessage());
    Thread.sleep(5000);
    client.getVoiceClient().stopStream(id);
    return "";
});

Substitua URL pela URL de um arquivo de áudio de sua escolha. Você pode usar https://nexmo-community.github.io/ncco-examples/assets/voice_api_audio_streaming.mp3 para testar.

Essa rota extrai o UUID da chamada da GET URL da solicitação e o utiliza no startStream método para identificar a chamada correta para a qual o áudio deve ser transmitido. Ele reproduz o áudio por cinco segundos e, em seguida, interrompe a reprodução chamando stopStream. Se você não o interrompesse dessa forma, a reprodução continuaria indefinidamente, conforme especificado pelo terceiro parâmetro de startStream que informa à Nexmo quantas vezes o áudio deve ser reproduzido, sendo que zero significa infinito.

Experimente

Está tudo pronto! Agora você pode testar.

Execute seu aplicativo Java a partir do diretório do aplicativo:

gradle run

Ligue para o seu número virtual, ouça a mensagem de boas-vindas e anote o UUID da chamada exibido no console.

Em um navegador, ou usando o Postman ou uma ferramenta semelhante, crie uma GET solicitação para o /play ponto de extremidade, passando o UUID da chamada, por exemplo:

http://localhost:3000/play/d2af966a2fa415b7080b2762940a828c

Você deve ouvir um áudio que termina após cinco segundos.

Conclusão

Neste tutorial, você aprendeu a criar um aplicativo Java com o framework Spark para atender uma chamada no seu número virtual da Nexmo usando a Voice API, criar uma conferência e, em seguida, transmitir áudio para ela. Convide um amigo para ligar para o número ao mesmo tempo que você, para que ambos possam participar da conferência. Experimente usar diferentes arquivos de áudio e crie um /stop/:id ponto de extremidade para que você possa controlar a duração do áudio manualmente.

Leitura complementar

Compartilhar:

https://a.storyblok.com/f/270183/384x384/637d0e41eb/marklewin.png
Mark LewinEx-funcionários da Vonage

Ex-redator técnico da Vonage. Adora experimentar e documentar APIs.