https://a.storyblok.com/f/270183/57344/f266a491a5/deepgram_multi-speaker-rooms.png

Demonstração de diarização de falantes com o Vonage Video e o Deepgram

Publicado em June 15, 2023

Tempo de leitura: 6 minutos

Muitos trabalhadores em todo o mundo já voltaram ao escritório, mas o uso de sistemas de videoconferência não diminuiu! A maioria dos sistemas disponíveis no mercado hoje é projetada para um único palestrante por transmissão de vídeo, o que causa uma grande confusão nos sistemas das salas de reunião compartilhadas por vários palestrantes. Imagine ler a transcrição de uma conversa entre três pessoas, mas sem nenhuma identificação dos diferentes interlocutores. Isso pode ficar bem confuso.

Cada vez mais, os sistemas de conferência estão recorrendo a recursos de inteligência artificial para lidar com essa complexidade. A última geração de tecnologias vai além de simples legendas e traduções e utiliza o poder da IA para gerenciar a complexidade dos sistemas de sala, bem como cenários de Video híbridos.

Saber quem disse o quê a quem é importante para entender o sentido de uma conversa e para extrair valor das anotações e transcrições de reuniões. A identificação de falantes vai além da compreensão da conversa; ela permite agregar valor a itens como notas de reuniões e transcrições. Distinguir quem está falando a partir de uma única fonte de áudio é uma tarefa à qual os seres humanos se adaptaram especialmente, mas que representa um desafio complexo para as máquinas. Esse processo é chamado de diarização de falantes.

Neste blog, vamos mostrar como criamos um sistema de videoconferência para salas com vários participantes, utilizando diarização.

Abaixo você pode assistir a um Video dessa demonstração em ação!

Para implementar essa solução, precisávamos garantir que:

  1. O sistema de videochamada tinha acesso seguro ao áudio bruto no servidor para garantir tempos de processamento mais rápidos, bem como a captura de dispositivos SIP para quaisquer participantes que ligassem por telefone.

  2. O serviço de reconhecimento automático de fala (ASR) poderia separar os falantes individualmente em um fluxo de áudio, de modo que as falas de cada locutor fossem identificadas de forma exclusiva.

A obtenção desses recursos foi fundamental para explorar todo o potencial dos sistemas de conferência para instalações físicas e casos de uso híbridos, bem como para desenvolver um aplicativo de Video útil e intuitivo, conforme mostrado abaixo:

Vonage Video API Diarization Demovonage_video_api_diarization_demo.png

Reconhecimento de fala com diarização de falantes

O que é a diarização de falantes?

A diarização de falantes é o processo de separar um fluxo de áudio em segmentos de acordo com a identidade do falante, independentemente do canal. A diarização de falantes é geralmente dividida em quatro subtarefas principais:

  1. Detecção - Identificar trechos de áudio que contenham fala, em oposição ao silêncio ou ao ruído.

  2. Segmentação - Divida e separe as regiões detectadas em seções de áudio menores.

  3. Representação - Use um vetor discriminativo para representar esses segmentos.

  4. Atribuição - Adicione uma etiqueta de locutor a cada segmento com base em sua representação discriminativa.

As funcionalidades de diarização oferecidas pelos diversos provedores de reconhecimento de fala (ASR) variam em termos de recursos. Nosso parceiro Deepgram implementou um dos conjuntos de recursos mais robustos que já vimos no mercado, com mais de uma dúzia de idiomas e sem limite para o número de falantes ativos. Saiba mais sobre essa solução aqui.

Saiba mais sobre a diarização de falantes neste Deepgram (https://blog.deepgram.com/what-is-speaker-diarization/)

Acesso ao áudio bruto de sessões de Video ao vivo

Para que o reconhecimento de fala funcione de maneira eficiente, é necessário ter acesso aos fluxos de áudio brutos diretamente do roteador de mídia. Isso oferece as vantagens do suporte nativo para todos os dispositivos, utiliza uma fração da largura de banda de uma solução do lado do cliente e pode funcionar com sistemas protegidos por firewall. Usando o Audio Connector da Video API da Vonage, podemos extrair fluxos de áudio brutos de nossas sessões de vídeo ao vivo e enviá-los ao Deepgram para processamento em tempo real (bem como offline) desses fluxos de áudio. Você pode encontrar mais informações sobre o Audio Connector aqui.

Como criamos a demonstração de diarização do Room System

Quando criamos nossa demonstração, nosso objetivo era mostrar a diarização em tempo real de um sistema de sala, utilizando a Video API da Vonage para criar a sessão de vídeo e o Deepgram para transcrever a fala.

Para maior clareza, não incluímos outras pessoas que participam da conferência, embora essa solução possa, sem dúvida, lidar com esse caso (assim como com vários sistemas de sala simultâneos). O Audio Connector é iniciado quando adicionamos um novo Publisher (que, neste caso, sabemos ser um Sistema de Sala). Na verdade, é bastante simples configurar o Audio Connector, já que conhecemos o StreamID do Publisher (ele nos é enviado pelo aplicativo front-end). Embora o AudioConnector possa lidar com “todos” ou “uma lista de streams”, no nosso caso estamos usando apenas um stream, associado ao sistema de sala. Observe que isso PODERIA até mesmo ser um sistema tradicional de conferência por sala via SIP.

Precisamos de uma Video API da Vonage e de uma conta no Deepgram para criar esta demonstração. Você pode criar suas contas gratuitas aqui para a Video API da Vonage e aqui para o Deepgram.

Depois de criar nossa instância do Opentok (“opentok”) e criar uma sessão para a videoconferência (“sessionId”), juntamente com um token de autorização associado (“token”), o aplicativo nos informa o stream do sistema da sala (“streamId”). Em seguida, basta associar esse stream à URL de um WebSocket em espera (“url”):

opentok.websocketConnect(sessionId, token, url, {
    streams: [streamId],
    headers: {
        sessionid: sessionId,
        streamId: streamId
    },
    audioRate: 16000,
}, function(error, socket) {
    if (error) {
        console.log('Error:', error.message);
    } else {
        console.log('OpenTok Socket websocket connected');
    }
});

O WebSocket está à espera de conexões recebidas e, como estamos passando o sessionId e o streamId nos cabeçalhos, conseguimos saber exatamente qual fluxo iremos transcrever e registrar no diário:

app.ws('/socket', async (ws, req) => {

  ws.on('message', (msg) => {
    try {
      if (typeof msg === 'string') {
        let config = JSON.parse(msg);
        console.log("Socket string message: ", config);
        // Do whatever we need here…
        // the sessionId and streamId are contained in the msg!
      } else {

Quando a “msg” chega da seguinte forma:

Socket string message: {
    'content-type': 'audio/l16;rate=16000',
    event: 'websocket:connected',
    sessionid: '1_MX40NjQyMzI5Mn5-MTY4NjA5MDM1MTkwNX5yUVlkZmp0bE9jMk5rQTAyVxxxxxxxxx-xx',
    streamId: '553236ce-xxxx-xxxx-8cb4-9dd17b3119dc'
}

Agora podemos conectar nosso fluxo de áudio de entrada diretamente ao modelo de streaming do Deepgram. Quando percebemos que o WebSocket do Audio Connector está se conectando, instruímos o Deepgram a abrir um WebSocket. Para nossa demonstração, constatamos que o uso do modelo “phonecall” no plano “enhanced” nos proporcionou resultados realmente bons, e utilizamos o formato padrão do Audio Connector: “16000” para a taxa de amostragem e “linear16” para o formato de áudio. Clique aqui para obter informações sobre os recursos e opções do Deepgram. Além disso (e esse é, de certa forma, o ponto principal aqui), instruímos o Deepgram a usar a diarização (“diarize: true”):

const deepgramLive = deepgram.transcription.live({
    punctuate: true,
    model: 'phonecall',
    tier: 'enhanced',
    language: “en - US,
    ,
    diarize: true,
    encoding: 'linear16',
    sample_rate: 16000,
    endpointing: 10,
});

Podemos então usar essa conexão com o Deepgram para aguardar os resultados da transcrição (falaremos mais sobre o que fazemos com isso mais adiante), configurando um “listener”:

deepgramLive.addListener('transcriptReceived', async (transcription) => {

Ok, nosso encanamento já está todo instalado… hora de abrir a torneira!

No websocket do Audio Connector, sempre que recebemos um pacote de áudio proveniente do nosso sistema de sala (ou seja, quando o tipo de mensagem é “binário”), primeiro verificamos se o Deepgram está pronto para receber dados:

if ((deepgramLive.getReadyState() === 1)) {

E, se for o caso, simplesmente repassamos os dados, tal como estão!

deepgramLive.send(msg);

Assim que o Deepgram obtiver dados suficientes para criar a legenda, ele nos notificará por meio do “listener” mencionado acima. O Deepgram nos fornece uma grande quantidade de informações sobre o áudio transcrito (recomendo fortemente que você dê uma olhada na excelente documentação para ter uma boa noção da riqueza das informações fornecidas), mas a parte que mais nos interessa para a diarização do nosso sistema de sala é a matriz de “palavras” (mais especificamente, as “punctuated_word”, já que solicitamos ao Deepgram que pontuasse cada frase para nós). Agora, a diarização do Deepgram funciona palavra por palavra, sendo capaz de diferenciar mesmo quando há falantes se sobrepondo; portanto, queremos examinar cada PALAVRA e separá-las por falante. Criamos um array em que cada entrada será “o que aquele falante específico disse” e, em seguida, percorremos as palavras, separando-as e recompondo-as por falante:

let words = transcription.channel.alternatives[0].words
let message = [];


words.forEach(function each(word) {
    if (word.speaker in message) {
        message[word.speaker] += " " + word.punctuated_word
    } else {
        message[word.speaker] = word.punctuated_word
    }
});

Agora estamos de acordo message[0] o que o primeiro orador disse, message[1] com o que o segundo palestrante disse, etc.

E é isso! Podemos enviar essas mensagens de volta para a interface gráfica, para que ela as exiba da maneira adequada.

Agora temos um sistema para salas que registra as anotações das reuniões e lida com vários participantes, mesmo que estejam na mesma sala!

Saiba mais

Clique aqui para assistir a um Video dessa demonstração em ação!

Você também pode solicitar uma demonstração personalizada com um de nossos especialistas. Se tiver dúvidas ou sugestões, junte-se a nós no Slack para desenvolvedores da Vonage ou envie-nos um tweet no Twitter.

Compartilhar:

https://a.storyblok.com/f/270183/399x400/82a0319190/mark-berkeland.png
Mark BerkelandEngenheiro Sênior de Soluções

Mark desenvolveu demonstrações, implementou provas de conceito (POCs) e espalhou seu humor entre colegas desprevenidos na Vonage por mais de 4 anos. Ele atua profissionalmente como programador desde 1979, e sua experiência técnica abrange toda a gama, desde FORTRAN em cartões perfurados até React Native na nuvem. Sua criatividade e entusiasmo pelo desenvolvimento e compartilhamento de soluções tecnológicas só são superados por sua propensão a contar piadas de pai.