Node.js

Criar o WebSocket

Primeiro, trate do connection evento para que você possa informar quando seu servidor de webhook estiver online e pronto para receber o áudio da chamada:

expressWs.getWss().on('connection', function (ws) {
  console.log('Websocket connection is open');
});

Ao enviar áudio para um WebSocket da Voice API, espera-se que o áudio esteja no formato formato específico. Para isso, você precisará de uma função que separe os dados de áudio binários em matrizes do tamanho correto:

function chunkArray(array, chunkSize) {
    var chunkedArray = [];
    for (var i = 0; i < array.length; i += chunkSize)
        chunkedArray.push(array.slice(i, i + chunkSize));
    return chunkedArray;
}

Em seguida, crie um manipulador de rota para o /socket rota. Quando o WebSocket estiver conectado, essa rota será chamada:

app.ws('/socket', (ws, req) => {
    const wav = new WaveFile(fs.readFileSync("./sound.wav"));
    wav.toSampleRate(16000);
    wav.toBitDepth("16");

    const samples = chunkArray(wav.getSamples()[0], 320);
    for (var index = 0; index < samples.length; ++index) {
        ws.send(Uint16Array.from(samples[index]).buffer);
    }
})

A rota carrega um arquivo de áudio do disco; você pode baixar esse mesmo arquivo em GitHub, utiliza a biblioteca WaveFile para alterar a taxa de amostragem e a profundidade de bits da Voice API. Em seguida, obtém as amostras de áudio do primeiro canal de áudio e utiliza a função mencionada anteriormente para alterar o tamanho da matriz de dados binários de áudio. Por fim, os dados binários de áudio são percorridos e enviados para a chamada por meio do WebSocket com o send() função.

NOTA: A Vonage armazenará em buffer apenas 3.072 mensagens o que deve ser suficiente para cerca de 60 segundos de áudio; se o seu arquivo for mais longo do que isso, você deve implementar um intervalo de 18 a 19 ms entre cada mensagem.