1 pontos por GN⁺ 1 일 전 | 1 comentários | Compartilhar no WhatsApp
  • transcribe.cpp é uma biblioteca baseada em ggml criada para incorporar facilmente vários modelos modernos de reconhecimento de fala em apps para Mac, Windows e Linux, com aceleração por GPU
  • Executa 16 famílias de ASR e mais de 60 modelos em Vulkan, Metal, CUDA e TinyBLAS, com suporte tanto a transcrição em streaming quanto em lote
  • Todos os modelos foram comparados numericamente com implementações de referência e submetidos a testes de WER com milhares de enunciados; os resultados de validação foram publicados no repositório e no Hugging Face
  • Executa arquivos .bin existentes do whisper.cpp e pode substituí-lo na maioria dos usos com desempenho semelhante; também oferece bindings oficiais para Python, JavaScript/TypeScript, Rust e ObjC/Swift
  • Mesmo no RK3566 de baixo consumo, consegue transcrever mais rápido que em tempo real, permitindo implantar ASR local em diversos dispositivos sem enviar áudio para a nuvem

Restrições na implantação de ASR multiplataforma

  • As opções existentes de inferência ASR multiplataforma se limitavam, na prática, a whisper.cpp e ONNX
    • Em dispositivos Apple, era possível adicionar MLX, mas isso exigiria dar suporte a dois motores e portar modelos para cada um deles
    • ONNX foi útil para adicionar modelos rapidamente ao Handy, mas era difícil aproveitar desempenho suficiente rodando apenas em CPU
  • Algumas bibliotecas que dão suporte a vários modelos têm autores, nível de testes e planos de manutenção pouco claros
    • Era difícil verificar se havia bindings utilizáveis em apps reais de desktop e mobile, se eram apenas código de demonstração, se havia benchmarks e se eram mais rápidas que ONNX
  • Com base na experiência de implantação de entrada de voz multiplataforma do Handy, era necessário um motor que atendesse às seguintes condições
    • Permitir baixar um arquivo e executar inferência imediatamente
    • Permitir verificar se a qualidade da inferência é equivalente à implementação de referência
    • Executar na GPU para obter desempenho máximo
    • Ser fácil de incorporar ao Handy sem grandes bibliotecas PyTorch
    • Funcionar em Mac, Windows e Linux
  • O ggml, por ter uma comunidade forte e uma forma conveniente de distribuição, foi escolhido como base para implementar esses requisitos

Modelos suportados e formas de aceleração

  • transcribe.cpp tem como objetivo inferência rápida e precisa e amplo suporte a modelos
    • Suporta 16 famílias de ASR e mais de 60 modelos, com planos de adicionar mais modelos
    • Suporta a maioria dos modelos modernos públicos de transcrição, embora alguns ainda estejam faltando
    • Oferece tanto transcrição em streaming quanto transcrição em lote
  • Todos os modelos suportados podem ser executados nos seguintes backends de aceleração
    • Vulkan
    • Metal
    • CUDA
    • TinyBLAS
  • Benchmarks por modelo foram realizados em um ambiente Fedora com CPU Ryzen 4750U e Vulkan, além de um M4 Max
  • O suporte a Vulkan foi adotado como requisito mínimo para a implantação de aplicações de inferência local

Implementação de referência e validação de precisão

  • Com base na experiência de ser difícil confiar na precisão de inferência de modelos .onnx obtidos no Hugging Face, todos os modelos são validados numericamente contra implementações de referência
  • Além da comparação numérica, são executadas verificações completas de WER para confirmar se a saída é igual à da implementação de referência
    • Cada modelo processa milhares de enunciados
    • Os resultados são muito próximos ou idênticos aos da implementação de referência
  • Os dados de validação são publicados no repositório do transcribe.cpp e nas páginas de cada modelo da organização handy-computer no Hugging Face

Compatibilidade com whisper.cpp

  • Para substituir o whisper.cpp usado no Handy, foi implementada uma compatibilidade próxima de uma substituição drop-in
  • Arquivos de modelo .bin para whisper.cpp distribuídos com o Handy também podem ser executados no transcribe.cpp
  • Algumas flags e funcionalidades do whisper.cpp ainda não são suportadas
  • Para a maioria dos usos, a implementação do Whisper é suficientemente estável e pode substituir o whisper.cpp com desempenho aproximadamente semelhante

Bindings de linguagem e manutenção

  • Escrito em C/C++, fornece bindings oficialmente mantidos para distribuir transcrição local em vários ambientes
    • Python
    • JavaScript/TypeScript
    • Rust
    • ObjC/Swift
  • Contribuições de bindings para outras linguagens também são bem-vindas, mas o colaborador deve assumir a manutenção do respectivo binding
  • As necessidades reais do Handy foram refletidas no design da biblioteca, e o plano é continuar mantendo o transcribe.cpp com base na experiência de manutenção do Handy
  • A experiência obtida ao dar suporte a diversos modelos ASR e casos de uso reais foi incorporada, mas ainda há cenários não tratados, e contribuições externas são aceitas
  • A versão atual é v0.1.0 e ainda tem arestas, por isso solicita-se o relato de issues

ASR local expandindo até dispositivos de baixo consumo

  • O objetivo é facilitar a execução de ASR diretamente no dispositivo, reduzindo a necessidade de enviar áudio para serviços em nuvem
  • Mesmo em uma CPU RK3566 de baixo desempenho, é possível executar modelos mais rápido que em tempo real
  • Velocidades de transcrição acima do tempo real usando modelos modernos funcionam com consumo de energia na faixa de poucos watts
  • Para processar mais inferência localmente, o processo de distribuir e executar motores de inferência em aplicações precisa se tornar mais fácil
  • O transcribe.cpp sozinho não resolve todo o problema de implantação de inferência local, mas foi desenvolvido como um passo para reduzir a barreira de entrada do ASR local

Apoios que sustentaram o projeto

  • A Mozilla AI, o programa BiR e Davide, da Mozilla AI, apoiaram o projeto desde a fase inicial de exploração, quando ainda não havia uma forma concreta de produto
  • O ggml é a base essencial que permite a implantação de aplicações de inferência local
  • A Modal forneceu créditos usados em testes de WER e validação com CUDA
  • A Blacksmith apoia parte do CI/CD que verifica os artefatos de release
  • O Hugging Face forneceu espaço privado de armazenamento à organização handy-computer, permitindo o upload livre de modelos

Uso de IA no processo de desenvolvimento

  • Como foi considerado difícil para uma pessoa escrever do zero, em poucos meses, um motor baseado em ggml nessa escala, foi usado apoio de IA no desenvolvimento
  • O texto de apresentação do projeto não foi escrito por IA; ele é composto por frases ditadas ou digitadas diretamente

1 comentários

 
GN⁺ 1 일 전
Comentários do Hacker News
  • Parece muito legal. Só não encontrei na documentação do modelo uma função para transcrever sons em IPA (Alfabeto Fonético Internacional), em vez do significado de um idioma desconhecido
    Idiomas minoritários com menos de 10 mil falantes talvez nunca tenham recursos suficientes para treinar modelos por idioma. Se existisse um modelo que convertesse a própria fala em IPA sem identificar o idioma, isso seria de grande ajuda para linguistas que estudam línguas minoritárias no mundo todo

    • Na fala real há muitas omissões e reduções, então mesmo conhecendo o idioma, a transcrição fonêmica é muito mais difícil do que palavras. Existem modelos como https://huggingface.co/spaces/KoelLabs/IPA-Transcription-EN, mas a taxa de erro é muito alta
    • A família da minha esposa é do Iu Mien, um subgrupo dos Dao/Yao da China. Mien é um idioma independente, mas a maioria dos falantes é praticamente analfabeta, e quase não há materiais didáticos ou cursos, então é difícil aprender
      Há também poucos registros escritos, então eu gostaria de criar meu próprio sistema de tradução, como em Project Hail Mary
    • Quase não conheço modelos que deem suporte a isso, então no momento está fora do escopo da biblioteca, mas eu apoiaria com prazer se houvesse um modelo adequado
    • Existem alguns modelos de reconhecimento automático de fonemas (APR), mas o desempenho é apenas razoável
    • Parece que esses modelos precisam saber qual faixa de sons devem esperar ouvir para serem práticos. O IPA representa muitos sons, mas cada idioma usa só uma parte deles
      O l escuro e o l claro em inglês (ball/light), e o p aspirado (pin/spin), podem distinguir significado em outros idiomas, mas não em inglês. Fico curioso se linguistas querem receber uma transcrição em IPA o mais fiel possível e depois normalizá-la manualmente
  • Parabéns pelo lançamento. Estou usando bem o Handy no Mac e no celular, e ele é especialmente útil quando o reconhecimento de fala padrão da Apple entende mal termos de domínios específicos
    Fico pensando se haveria uma forma de ter os custos de manutenção apoiados por fundações. Se alguém fosse ser pago por esse tipo de projeto, também queria saber que organizações procurar e como pedir apoio

    • Com a popularidade do Handy, acabei me tornando sem querer um mantenedor de open source, e felizmente doações individuais e vários patrocinadores vêm apoiando o trabalho
      Quero continuar contribuindo com open source, então sou receptivo a apoio de qualquer lugar que valorize isso, especialmente organizações que acreditam em open source e querem fazê-lo avançar. Dá para conversar melhor em contact@handy.computer
    • O ditado padrão do sistema no iOS exige enviar sua agenda para a Apple a cada solicitação, mesmo sem usar iCloud, então não tem como deixá-lo ativado
  • Vários sistemas de fala para texto reconhecem bem a fala em si, mas não dão suporte ao fluxo de trabalho desejado. Você deveria poder abrir um documento, falar, e o texto continuar sendo inserido na posição do cursor com latência mínima
    Parar a gravação e colar tudo de uma vez depois não é útil; entrada contínua é o essencial

    • Para mim, funcionou melhor justamente transcrever tudo de uma vez depois que a gravação termina. Quando vejo entrada em tempo real, acabo verificando erros de transcrição e tenho mais dificuldade de manter o raciocínio até o fim
      Acho mais útil falar por 5 a 10 minutos tudo o que está na cabeça sobre um tema e revisar depois, sem interromper o fluxo de pensamento
    • Se quiser, dá para implementar isso com relativa facilidade modificando o Handy. Também pretendo adicionar como recurso oficial do app, mas há outras coisas para resolver antes
    • Muitas palavras em inglês só podem ser definidas com o contexto ao redor. Por exemplo, there e their não podem ser distinguidos só pela pronúncia
    • A utilidade da transcrição depende de como ela é usada. Se você abre outras janelas durante o ditado ou olha gráficos e dados, fica mais fácil fornecer informações que sustentem a fala
      Alguns apps usam até o que você copiou ou está vendo como contexto de transcrição para melhorar o resultado: https://superwhisper.com/docs/common-issues/context#types-of...
    • Tentei essa abordagem em https://github.com/electronstudio/low_latency_dictation, mas a precisão do modelo em tempo real era baixa. Então faço um segundo processamento com um modelo mais preciso antes de confirmar o texto
  • Gostaria de saber se, como no Whisper.cpp, é possível inserir contexto para aumentar bastante a precisão

    • Sim
  • Dos quatro bindings de linguagem suportados pelo mantenedor, o de Python está em https://github.com/handy-computer/transcribe.cpp/tree/main/b...
    Ainda não há wheels binários no PyPI com dependências incluídas, e a biblioteca atual no PyPI chama via ctypes uma biblioteca instalada separadamente, mas parece haver planos para lançar isso no futuro

    • Enviei ao PyPI um PR pedindo espaço extra de armazenamento para os pacotes CUDA, mas aparentemente ainda não foi aprovado. Eu gostaria de ajuda para melhorar a experiência do desenvolvedor (DX) dos bindings
  • Encontrei isso na hora certa. Tenho visto muita conversa sobre incluir síntese de voz (TTS) em ferramentas de prompt e queria testar por conta própria
    Parece atraente um ciclo de trabalho em que você fala longamente os pensamentos para virar um documento, edita, e depois envia para a IA

  • É uma contribuição enorme para a comunidade, e me surpreende que tenha sido feita por uma pessoa só. Eu quase esperava um anúncio de rodada Series A no fim
    Isso mostra que, com IA, você pode tanto despejar rapidamente resultados de baixa qualidade quanto ampliar sua ambição e criar algo mais rigoroso e duradouro do que antes. Em vez de colocar o Transcribe.cpp diretamente em apps, acho que esse tipo de recurso deveria ficar disponível em qualquer lugar via sistema operacional ou apps como o Handy

    • Sim, sou o autor e mantenedor, e o apoio de patrocinadores e das doações da comunidade do Handy ajudou muito. Em especial, a Mozilla AI apoiou o trabalho inicial e me deu tempo para transformar um sonho vago para o Handy em um projeto real e lançar o v0.1.0
      Um dia quero distribuir o libtranscribe de forma adequada e torná-lo como uma biblioteca de sistema. Vai levar tempo para estabilizar, mas acho que é possível
  • Funciona muito melhor do que o transcribe-rs anterior. Atualizei meu app de entrada de voz offline para usar a nova biblioteca e a velocidade melhorou bastante: https://github.com/notune/android_transcribe_app

  • No futuro, a inferência local vai aumentar por vários motivos, e está correta a avaliação de que, para mais apps usarem isso, a execução e a distribuição precisam ser fáceis
    O fato de que nenhuma palavra do texto foi escrita por IA, e sim saiu da boca ou dos dedos de alguém, também torna o projeto mais confiável e acessível

    • É difícil concordar com essa afirmação, porque as ferramentas que usamos moldam o pensamento. Um LLM de reconhecimento de voz ainda é, no fim das contas, um LLM, e os erros são moldados pelas expectativas embutidas no processo de treinamento, influenciando também as palavras que aparecem na tela
      Com o uso frequente, você aprende quais combinações de palavras são transcritas com precisão, e isso passa a fazer parte do processo de pensamento. Com o tempo, o LLM e o pensamento se entrelaçam, então esse tipo de uso de IA também pode acabar mudando de fato a frase final
  • Tive problemas parecidos ao pesquisar como rodar um servidor local de API de transcrição. O que mais fazia falta era suporte a streaming e suporte a palavras especiais para aumentar a prioridade no reconhecimento, então é bom ver que há streaming aqui

    • Desde que o whisper.cpp apareceu, eu o opero diretamente em um servidor com 3090 Ti. Mesmo que tenham surgido alternativas melhores e mais rápidas, ele continua funcionando sem problemas, os pesos são pequenos e é mais do que rápido o bastante para o que preciso
      Se você subir isso em um home server local, como abaixo, dá para criar facilmente uma API local de transcrição. Os parâmetros de inferência precisam de alguns ajustes, mas, depois de definidos, funciona muito bem

      MODEL="/home/user/projects/ggml-org/whisper.cpp/models/ggml-large-v3-turbo.bin"
      WHISPER_SERVER_BIN="/home/user/projects/ggml-org/whisper.cpp/build/bin/whisper-server"
      "$WHISPER_SERVER_BIN" --model "$MODEL" --language en --host 127.0.0.1 --port 7812

    • O ajuste de peso de palavras provavelmente só será suportado bem mais tarde, mas o streaming já é oferecido
      Espero que alguém contribua com um bom exemplo de servidor para a base de código e também ajude a resolver problemas, ou crie um servidor robusto em outra linguagem usando transcribe.cpp ou bindings. Quando estiver pronto, há disposição para conectá-lo diretamente ao projeto principal