2 pontos por GN⁺ 2023-11-03 | 1 comentários | Compartilhar no WhatsApp
  • Talk-Llama é um exemplo do whisper.cpp em que você fala no microfone pelo terminal, o Whisper converte a voz em texto e o LLaMA responde
  • A captura de áudio do microfone exige SDL2, e é necessário ativar a opção do CMake WHISPER_SDL2=ON durante a compilação
  • Ao executar, use -mw para especificar o modelo Whisper; para conversas em tempo real, os modelos base ou small são recomendados
  • Em -ml, especifique um modelo LLaMA compatível com ggml; a forma de preparar o modelo segue as instruções do llama.cpp
  • Se usar --session FILE, é possível salvar e carregar o estado do modelo para manter o contexto em conversas longas ou em várias execuções

Exemplo de conversa por voz no terminal

  • whisper.cpp/examples/talk-llama é um exemplo de conversa por voz com a IA LLaMA no terminal
  • Em uma demonstração de desempenho marcada em 2 de novembro de 2023, a execução aparece com a combinação Whisper Medium + LLaMA v2 13B Q8_0 em um M2 Ultra
  • Uma demonstração anterior também é disponibilizada em vídeo como exemplo de execução em CPU

Fluxo de compilação e execução

  • whisper-talk-llama depende da biblioteca SDL2 para capturar o áudio do microfone
  • Exemplos de instalação do SDL2 por sistema operacional:
    • Linux da família Debian: sudo apt-get install libsdl2-dev
    • Fedora Linux: sudo dnf install SDL2 SDL2-devel
    • Mac OS: brew install sdl2
  • Na compilação com CMake, ative a opção WHISPER_SDL2=ON
    • cmake -B build -S . -DWHISPER_SDL2=ON
    • cmake --build build --config Release
  • O exemplo de execução especifica o modelo Whisper, o modelo LLaMA, o prompt e a quantidade de threads
    • ./build/bin/whisper-talk-llama -mw ./models/ggml-small.en.bin -ml ../llama.cpp/models/llama-13b/ggml-model-q4_0.gguf -p "Georgi" -t 8

Opções de modelo

  • O argumento -mw define o modelo Whisper a ser usado
    • Para uma experiência em tempo real, os modelos base ou small são recomendados
  • O argumento -ml define o modelo LLaMA a ser usado
    • Para obter um modelo LLaMA compatível com ggml, consulte as instruções do llama.cpp

Continuidade de contexto com arquivo de sessão

  • whisper-talk-llama oferece suporte a gerenciamento de sessão para conversas mais consistentes e contínuas
  • Isso permite manter o contexto de interações anteriores para entender e responder aos pedidos do usuário de forma mais natural
  • O suporte a sessão é ativado com a opção de linha de comando --session FILE na execução
    • Após cada interação, o estado do modelo do whisper-talk-llama é salvo no arquivo especificado
    • Se o arquivo não existir, ele será criado
    • Se o arquivo já existir, o estado do modelo será carregado dele para retomar a sessão anterior
  • Isso é útil ao interagir com o assistant de IA em conversas longas ou ao longo de várias sessões, permitindo lembrar interações anteriores e fornecer respostas contextuais mais relevantes
  • Exemplo de execução:
    • ./build/bin/whisper-talk-llama --session ./my-session-file -mw ./models/ggml-small.en.bin -ml ../llama.cpp/models/llama-13b/ggml-model-q4_0.gguf -p "Georgi" -t 8

Saída de voz e feedback

  • Para ouvir a resposta de texto gerada em forma de voz, é necessário um ferramenta de TTS
  • Você pode usar o mecanismo de TTS que preferir e, conforme necessário, modificar o script speak
  • A configuração padrão usa o say do macOS ou o SpeechSynthesizer do Windows
  • O texto informa que feedback pode ser enviado na GitHub Discussion #672

1 comentários

 
GN⁺ 2023-11-03
Opiniões no Hacker News
  • Interessante ver isso aqui :)
    O desempenho do Apple Silicon provavelmente melhorou bastante em relação ao que aparece no vídeo. O whisper.cpp agora roda totalmente na GPU, e a velocidade de geração do llama.cpp também melhorou muito nos últimos meses

    • Foram só 13 minutos até o commit do novo vídeo de demonstração, nada mal :D
      O desempenho de fato também é impressionante
    • Parece que você ficou bem famoso agora. É bem provável que muita gente esteja acompanhando o GitHub de perto
    • Enviei um PR para colocar a nova demo no topo. Acho que a nova demo é muito melhor
    • Apple Silicon é a opção com melhor custo-benefício para rodar isso, ou daria para fazer mais barato em um servidor Linux de homelab com bom desempenho?
    • Será que funciona também com o distilled Llama mais recente?
  • Muito legal. Em um projeto recente, tentei conectar o Llama a um modelo de síntese de voz open source, e havia muitos elementos de engenharia interessantes
    Pessoalmente, as ferramentas de auxílio à programação que considero mais úteis são as que reduzem o trabalho manual, em vez de tentar assumir o pensamento difícil ou a resolução de problemas — por exemplo, gerando argumentos e tipos a partir de docstrings, ou o contrário. Para tarefas mais complexas, percebi que é preciso dar ao assistente um ponto de partida bastante bom
    Costumo falar sozinho enquanto programo, então, se uma ferramenta dessas pudesse incorporar o que eu digo em vetores de contexto para usar como entrada adicional e dar ao modelo um ponto de partida melhor, isso pareceria realmente futurista e útil. Demorei a adotar o Copilot e não o uso o tempo todo, mas ficaria curioso se alguém conhecer algo parecido

  • Se a proposta de pesos abertos virar realidade em até 270 dias, daqui a alguns meses isso pode acabar sendo proibido na prática

    • Essa afirmação não é sustentada pelo texto da ordem executiva do governo Biden. O que há é apenas a exigência de que vários órgãos do governo criem uma estrutura de avaliação de segurança, façam uma avaliação inicial de modelos com pesos abertos e apresentem recomendações ao presidente em até 270 dias
      Pelo que encontrei, não há nada sobre proibir modelos com pesos abertos. Também não vejo muito motivo para que a recomendação final inclua “proibir”
      Por exemplo, consigo imaginar recomendações favoráveis aos incumbentes, como tornar o ônus de adoção de modelos com pesos abertos pelo governo tão alto que comprar da OpenAI pareça muito mais atraente. Mas isso é diferente do que foi dito originalmente
      A ordem executiva parece bem fácil de ler; deixei passar algo no texto?
      https://www.whitehouse.gov/briefing-room/presidential-action...
    • Não vejo nada dizendo que os pesos serão proibidos. A parte que vi parece mais pedir a criação de um relatório sobre os riscos e benefícios dos pesos abertos
      Concordo que a forma como o escopo fica em aberto é preocupante, mas onde está a proibição de fato?
    • Quão séria é essa ameaça? Como poderiam impor algo tão idiota sem nem consultar os líderes do setor?
  • Ao executar ./talk-llama no Arch e no Debian, ocorre uma floating point exception. Também verifiquei sdl2lib e ffmpeg, e vi a issue relacionada (https://github.com/ggerganov/whisper.cpp/issues/1325), mas não consegui resolver. Mais alguém passa por isso?

    • Sofri com o mesmo erro no PopOS 22.04, e isto ajudou:
      https://github.com/ggerganov/whisper.cpp/issues/352#issuecom...
      Não tenho certeza do que mudou, mas basicamente removi ffmpeg e libsdl2-dev e rodei make na raiz do repositório. Depois instalei libsdl2 e ffmpeg e rodei make talk-llama
      Em um i7-8550U de 4 núcleos com 16 GB de RAM, é bem lento
      Na raiz do repositório, fiz mais ou menos isto:
      $ sudo apt purge ffmpeg
      $ make clean
      $ git pull
      $ make
      $ sudo apt install libsdl2-dev
      $ make talk-llama
      $ ./talk-llama -mw ./models/ggml-small.en.bin -ml ../llama.cpp/models/llama-2-13b.Q4_0.gguf -p "t0mk" -t 8\n\n
  • Não existe uma solução de conversão de texto em fala que receba o stream de texto e fale imediatamente, sem esperar o Llama terminar a geração?
    Imagino que só seja possível se o modelo preencher o buffer rápido o suficiente para que o mecanismo de síntese de voz não pare

    • Bastaria fazer o llama.cpp emitir coisas como “um”, “uhh” quando restasse só uma palavra no buffer :D
    • É preciso saber para onde a frase está indo para acertar melhor timing e ênfase. Caso contrário, pode soar como um intérprete da ONU, com palavras vindo em sequência de forma plana
    • ElevenLabs e Gemelo.AI são serviços que oferecem suporte a streaming de entrada de texto exatamente para esse uso. Não conheço modelos open source de síntese de voz incremental (Incremental TTS), mas dá para implementar algo parecido armazenando tokens em buffer e enviando-os ao modelo de síntese de voz quando aparecer pontuação
  • Será que dá para reduzir a latência não esperando a resposta completa do LLM terminar e, em vez disso, fazendo streaming da síntese de voz à medida que ela é gerada, em blocos de cerca de 6 tokens?

    • Sim, eu pretendia fazer isso na época, mas surgiu outra coisa. Este exemplo simples pode ser melhorado de várias maneiras
      Dá para melhorar a detecção de fim de fala, que atualmente usa apenas um limite adaptativo básico, e também fazer um LLM pequeno gerar respostas rápidas genéricas enquanto um LLM maior calcula. A síntese de voz também pode ser transmitida em streaming por chunks ou por frases
      Acho que uma das melhores versões open source desse tipo de chatbot é https://github.com/yacineMTB/talk. Hoje é bem provável que existam ainda mais projetos parecidos
  • Qual é a melhor interface de chat para Llama? Tenho uma 3090 e queria rodar um modelo no terminal para tarefas rápidas de programação

    • O ollama é realmente fácil de usar. É um único binário que baixa os modelos quando necessário, parecido com a forma como o Docker baixa imagens
      pacman -S ollama
      ollama serve
      ollama run llama2:13b 'insert prompt'
      https://ollama.ai/
    • Existe um projeto open source que também oferece suporte a voz:
      https://github.com/cogentapps/chat-with-gpt
      Parece ter sido feito para usar ElevenLabs e a API da OpenAI, mas talvez seja fácil configurá-lo para o Whisper.cpp e o Llama locais
    • Não é open source, mas existe o lmstudio.ai, que ainda é gratuito. Ele tem histórico de chat, uma UI de configurações decente, gerenciamento fácil de prompts, gerenciamento e exploração de modelos, configuração simples, é multiplataforma e ainda oferece um servidor de API para integrar com outras ferramentas
      Eles estão contratando e não há uma estratégia de monetização pública, então imagino que em breve haverá alguma mudança, como cobrar por parte dos recursos gratuitos ou limitá-los de propósito. Ainda assim, é difícil para apps leves para LLMs gratuitos que dependem totalmente do llama.cpp criarem aprisionamento a fornecedor. Se open source for mais importante que recursos, eu também recomendaria o ollama
    • O mais fácil de configurar é este: https://faraday.dev/
      Para perguntas técnicas, acho que o Wizard é o mais popular no momento
    • Depende do que você quer dizer com “melhor”. Se for inferência de ponta o mais rápida possível, em uma 4090 é ExLlama ou ExLlamaV2
  • Estou bem satisfeito com o ollama para rodar LLMs open source locais, mas qual seria o equivalente para Whisper ou para modelos open source recentes de síntese de voz? Não conheço bem um projeto que torne tão simples configurar o Whisper localmente

  • Alguém pode explicar de forma simples o que isto consegue fazer? Ele consegue aprender o contexto do chat e manter algum tipo de memória de longo prazo?

    • Não sou especialista em LLMs, mas, pelo que entendo, é uma arquitetura que roda reconhecimento de fala → Llama → síntese de voz no seu próprio PC, em vez de em servidores de terceiros
      O limite de contexto do LLM depende do modelo e das configurações escolhidos pelo usuário. Por exemplo, varia conforme o modelo usado, como Llama 2, Wizard Vicuna etc., e conforme a forma como a janela de contexto foi configurada. Pode ser confuso porque o LLM não “responde” ao usuário exatamente; ele prevê a continuação mais plausível em um histórico de conversa entre o usuário e um assistant útil e, com isso, consegue fingir tão bem que é um assistant útil que acaba sendo de fato um assistant útil
      Alterando o pipeline, esse tipo de comportamento também parece possível. A estrutura passaria a ser reconhecimento de fala → Wrapper[Llama] → síntese de voz, e ficaria interessante se o Wrapper pudesse deixar o Llama fazer seu trabalho enquanto aplica processamento adicional ao texto de entrada
      O Wrapper poderia analisar a conversa e extrair elementos-chave como “o nome desta pessoa é Bob, homem, 35 anos, gosta de cachorros, prefere coisas organizadas, quer um lembrete para ligar para a filha às 17h, é um agente infiltrado da máfia antártica e prefere que falem com ele usando um forte sotaque polonês”, e agir de acordo com isso
      Por exemplo, poderia criar um lembrete para as 17h via HomeAssistant, configurar o motor de síntese de voz com sotaque polonês e modificar o histórico inicial de conversa em execuções futuras. Algo como inserir o nome da pessoa no chat interno e fornecer um resumo compacto de seus interesses e personalidade na introdução prévia da próxima conversa
      Assim, a interatividade surge por meio de ações executadas por outras ferramentas, e a continuidade também pode ser criada ao modificar o histórico da próxima conversa
  • Isto passa uma vibe de ELIZA muito forte