Article image
Florencio Soares
Florencio Soares10/10/2023 20:30
Share

Criando um novo amigo - Assistente Virtual

  • #MySQL
  • #Python
  • #API Rest

Olá, sou Florêncio Soares, um entusiasta de tecnologia de 22 anos e estudante de Engenharia de Software.

Recentemente, fui movido pela ideia de criar um assistente virtual que funcione por comandos de voz, com o objetivo de transformar minha casa em um ambiente inteligente e totalmente offline. No entanto, minha visão não se limita a um assistente virtual comum, como a Alexa ou o Google Assistente.

Quero um assistente que compreenda e se comunique em linguagem natural para a maior imersão e satisfação do usuário, se aproximando ao máximo do Jarvis (Assistente virtual do Iron Man).

Link do Repositório no GitHub: https://github.com/zlilpoof/Jorge-V.A

Minha jornada de desenvolvimento teve início com a escolha cuidadosa das tecnologias. Para o reconhecimento de voz, optei pelo Vosk (https://alphacephei.com/vosk/) e seu modelo de linguagem em português, o vosk-model-small-pt-0.3. Para a compreensão do conteúdo falado, integrei um modelo treinado em português com base no Sentence Transformers (mpjan/msmarco-distilbert-base-tas-b-mmarco-pt-300k).

A ativação do assistente se dá por meio de uma frase-chave, neste caso, "Salve Jorge", que, quando detectada, desencadeia o início da captura de comandos do usuário, semelhante ao clássico "Ok Google". Assim que um novo comando é capturado, realiza-se uma comparação com comandos previamente estabelecidos, permitindo interações intuitivas e personalizadas.

Exemplos

  Usuário - “Quero cadastrar um compromisso”

    Vídeo de demonstração: https://youtu.be/gdE-0V3JtJk

    Jorge perguntará: “Que dia é seu compromisso?”

    Usuário - “12”

    Jorge perguntará: “De que mês?”

    Usuário - “10”

    Jorge perguntará: “Que hora?”

    Usuário - “18”

    Jorge perguntará: “O que fará nesse compromisso?”

    Usuário - “Irei ao mercado”

    Jorge responderá: “Compromisso registrado com sucesso para o dia 12/10”

    // Obs: A qualquer momento o usuário poderá dizer “cancelar” ou ficar em silêncio que a operação será cancelada sem efetuar qualquer registro.image

  Usuário - “Quais compromissos tenho na data”

    Vídeo de demonstração: https://youtu.be/S7OzjHdE1m4

    Jorge perguntará: “Em qual dia?”

    Usuário - “12”

    Jorge perguntará: “Qual mês?”

    Usuário - “10”

    Jorge responderá: “(ID) Dia 12 do Mês 10, às 18 horas: Irei ao mercado”

    // Obs: Jorge listará todos os compromissos que a pessoa tiver registrado para o dia consultado.image

  Usuário - “Quais meus compromissos”

    Vídeo de demonstração: https://youtu.be/nGqQ_0tmb3Y

    Jorge responderá: “(ID) Dia 12 do Mês 10, às 18 horas: irei ao mercado”

    // Obs: Jorge listará todos os compromissos que a pessoa tiver registrado.image

  Usuário - “Deletar compromisso”

    Vídeo de Demonstração: https://youtu.be/NXu-a4ffbCE

    Jorge perguntará: “Qual compromisso quer deletar?”

    Usuário - “(ID)”

    Jorge responderá: “Compromisso (ID) deletado com sucesso.”

    // Obs: Jorge deleta apenas o compromisso do ID mencionado.

    // Obs: O usuário pode falar “Cancelar” e Jorge responderá: “Operação cancelada”image

  Usuário - “Bom dia”

    Vídeo de demonstração: https://youtu.be/yUG7LNiBfco

    Jorge responderá: “Bom dia, hoje é Terça-Feira 10/10/2023.

    Clima em (Cidade desejada) Céu limpo, Temperatura: 29.96°C, Umidade: 42%

    Seus compromissos de hoje são

    (ID): Dia 10 do Mês 10, às 18 horas: lavar roupa

    (ID): Dia 10 do Mês 10, às 19 horas: levar o cachorro para passear”

    // Obs: Jorge listará todos os compromissos que a pessoa tiver registrado para o dia atual.image

image  

Se não houver correspondência semântica entre a entrada do usuário e os comandos pré-estabelecidos, é realizada uma análise semântica para verificar se há correspondência de perguntas e respostas pré-estabelecidas.

Assim, se houver uma correspondência acima de 0.30 entre a entrada do usuário e alguma das perguntas pré-estabelecidas, a resposta dessa correspondência é armazenada em um dicionário que suporta 5 valores e voltamos ao loop, se for encontrada uma correspondência maior, a correspondência é armazenada na próxima posição, se o último valor armazenado for na posição 5, o valor da primeira posição é substituída até que todas as perguntas pré-estabelecidas sejam comparadas com a entrada do usuário e a melhor correspondência seja encontrada.

Se a melhor correspondência encontrada tiver uma pontuação acima de 0.80, essa correspondência é retornada ao usuário como resposta.

Se não houver correspondência acima de 0.80, entra em um fluxo de resposta da API da OPENAI utilizando o modelo gpt-3.5-turbo-0301 com texto de embasamento para a personalidade do assistente, 5 respostas pré-estabelecidas com maior correspondência, resultado de pesquisa na internet, hora atual, clima atual, compromissos do dia atual, compromissos do dia posterior e a entrada atual do usuário.

Após isso, o resultado do retorno da API da OPENAI é exibido ao usuário com sintetização de voz e impressão em campo dedicado na interface.

Exemplos de uso

  Se o usuário falar algo similar a “Que dia é hoje”, haverá uma alta correspondência semântica e será retornado a função tempo.data_atual_formatada que conterá ex: Terça-Feira 10/10/2023.

  Vídeo de demonstração: https://youtu.be/2Jc86rD5zHMimage

  Se o usuário falar algo similar a “Como está o clima hoje”, haverá uma alta correspondência semântica e será retornado a função tempo.clima que responderá com o resultado coletado pela api da OpenWeatherMap.

  Vídeo de demonstração: https://youtu.be/E-_2p17CA1Eimage

  Se o usuário perguntar algo similar a “Estou pensando em passear com o cachorro, acha uma boa ideia?”, a entrada do usuário irá no fluxo de geração de texto com todo o embasamento encontrado pela análise semântica, personalidade do assistente, resultado de pesquisa na internet, hora atual, clima atual, compromissos do dia atual, compromissos do dia posterior e a entrada atual do usuário.

  Exemplo de resposta: Pode crer, mano! Dar um rolê com o Akamaru é uma baita ideia. Além de ser um rolêzão, é um ótimo exercício pra ele e pra você também. Mas, não esquece de levar uns petiscos pra recompensar o bichinho! Ta ligado né?

  Vídeo de demonstração: https://youtu.be/l-85IzoTbrw

image

Conclusão

Em resumo, minha jornada de desenvolvimento para criar um assistente virtual com alto grau de imersão e comunicação em linguagem natural está progredindo de forma promissora. Até o momento, usei tecnologias como Vosk para o reconhecimento de voz e modelos treinados em português para a análise semântica e respostas personalizadas.

Embora meu objetivo final seja ter um assistente completamente offline, atualmente, devido a limitações técnicas, estou fazendo uso da API da OpenAI para a geração de texto. No entanto, isso não é um obstáculo, uma vez que minha solução ainda está em fase de desenvolvimento e, à medida que avanço, planejo realizar a implementação de modelos de processamento local para alcançar a independência completa da nuvem.

Acredito que esse projeto pode se tornar uma contribuição significativa para a integração de assistentes virtuais em casas inteligentes, proporcionando uma experiência de usuário excepcional, semelhante ao que vemos nos filmes de ficção científica. À medida que continuo aprimorando e desenvolvendo meu assistente virtual, estou empolgado para compartilhar com a comunidade de desenvolvedores e entusiastas de tecnologia os progressos e conquistas alcançados ao longo desta empolgante jornada.

Agradecimentos

Gostaria de expressar minha sincera gratidão a Diego Recaman por fornecer generosamente uma chave de API da OpenAI, que foi fundamental para o desenvolvimento do meu assistente virtual.

Além disso, um agradecimento especial a Sthorm, que criou o som de responsividade do assistente, o característico "bip" que indica quando o assistente está pronto para ouvir comandos. Esse som tornou a interação com o assistente mais envolvente e intuitiva, proporcionando uma experiência mais agradável para os usuários.

Quero expressar minha gratidão a Ana Luiza por sua brilhante sugestão de adicionar gírias ao meu assistente virtual. Graças a ela, agora meu assistente é "descolado" e está totalmente "antenado" com a linguagem atual. 👌😎

Gostaria de expressar meu sincero agradecimento ao DALL-E 3 do Bing por sua incrível capacidade de criar a imagem visual do meu assistente.

Sua habilidade em transformar conceitos em representações visuais é verdadeiramente notável e contribuiu significativamente para a identidade e personalidade do meu assistente virtual.

Um super obrigado para o ChatGPT por criar essas frases de agradecimento. Sua contribuição na geração de palavras de apreço é inestimável e, sem dúvida, enriqueceu minha capacidade de expressar gratidão de forma eloquente.

Share
Comments (5)
Leonardo Azevedo
Leonardo Azevedo - 12/10/2023 16:59

Projeto muito dahora man!

Márcio Pereira
Márcio Pereira - 11/10/2023 09:41

Eu que estou começando agora na área de tecnologia, achei muito motivador me deparar com projetos como esse! Parabéns pelo projeto!


TM

Thiago Monteiro - 11/10/2023 08:27

Muito bom, mano!! Parabéns!!

CS

Caio Santos - 10/10/2023 21:09

Muito legal, parabéns pelo projeto!

Gustavo Santos
Gustavo Santos - 10/10/2023 20:46

Caraca mano, isso sim que é um projetasso, ainda mais se funcionar de forma "offline"