1 points par GN⁺ 1 일 전 | 1 commentaires | Partager sur WhatsApp
  • transcribe.cpp est une bibliothèque basée sur ggml, conçue pour intégrer facilement plusieurs modèles récents de reconnaissance vocale dans des applications Mac, Windows et Linux, avec accélération GPU
  • Elle exécute 16 familles d’ASR et plus de 60 modèles via Vulkan, Metal, CUDA et TinyBLAS, et prend en charge à la fois la transcription en streaming et par lots
  • Tous les modèles ont été comparés numériquement à leurs implémentations de référence et testés sur des milliers d’énoncés avec des tests WER ; les résultats de validation sont publiés dans le dépôt et sur Hugging Face
  • Elle peut exécuter les fichiers .bin existants pour whisper.cpp et le remplacer avec des performances similaires dans la plupart des usages ; des bindings officiels Python, JavaScript/TypeScript, Rust et ObjC/Swift sont également fournis
  • Même sur un RK3566 basse consommation, elle peut transcrire plus vite que le temps réel, ce qui permet de déployer de l’ASR local sur divers appareils sans envoyer la voix vers le cloud

Les contraintes du déploiement ASR multiplateforme

  • Les options existantes pour l’inférence ASR multiplateforme se limitaient, dans les faits, à whisper.cpp et ONNX
    • Sur les appareils Apple, on peut ajouter MLX, mais il faut alors prendre en charge deux moteurs et porter les modèles pour chacun d’eux
    • ONNX a été utile pour ajouter rapidement des modèles à Handy, mais une exécution uniquement sur CPU ne permettait pas d’exploiter pleinement les performances
  • Pour certaines bibliothèques prenant en charge plusieurs modèles, le niveau des auteurs, des tests et les plans de maintenance étaient peu clairs
    • Il était difficile de savoir si elles disposaient de bindings utilisables dans de vraies applications desktop et mobiles, si elles se limitaient à du code de démonstration, s’il existait des benchmarks, ou si elles étaient plus rapides qu’ONNX
  • À partir de l’expérience de déploiement d’entrée vocale multiplateforme de Handy, il fallait un moteur répondant aux conditions suivantes
    • Pouvoir télécharger un fichier et lancer immédiatement l’inférence
    • Pouvoir vérifier que la qualité d’inférence est équivalente à celle de l’implémentation de référence
    • S’exécuter sur GPU pour obtenir les meilleures performances
    • S’intégrer facilement à Handy sans grosse bibliothèque PyTorch
    • Fonctionner sur Mac, Windows et Linux
  • ggml, avec sa communauté solide et son mode de distribution pratique, a été choisi comme base pour répondre à ces besoins

Modèles pris en charge et modes d’accélération

  • transcribe.cpp vise une inférence rapide et précise, ainsi qu’une large prise en charge des modèles
    • Elle prend en charge 16 familles d’ASR et plus de 60 modèles, et d’autres modèles seront ajoutés
    • Elle prend en charge la plupart des modèles de transcription récents publiquement disponibles, même s’il en manque encore certains
    • Elle propose à la fois la transcription en streaming et la transcription par lots
  • Tous les modèles pris en charge peuvent s’exécuter sur les backends d’accélération suivants
    • Vulkan
    • Metal
    • CUDA
    • TinyBLAS
  • Les benchmarks par modèle ont été réalisés sous Fedora avec un CPU Ryzen 4750U et Vulkan, ainsi que sur M4 Max
  • La prise en charge de Vulkan a été retenue comme condition minimale pour le déploiement d’applications d’inférence locale

Implémentations de référence et validation de l’exactitude

  • À partir de l’expérience consistant à ne pas pouvoir être sûr de l’exactitude d’inférence des modèles .onnx obtenus sur Hugging Face, tous les modèles ont été validés numériquement par rapport aux implémentations de référence
  • En plus des comparaisons numériques, une vérification WER complète a été exécutée pour confirmer que les sorties correspondent à celles des implémentations de référence
    • Chaque modèle traite des milliers d’énoncés
    • Les résultats sont très proches, voire identiques, à ceux de l’implémentation de référence
  • Les données de validation sont publiées dans le dépôt transcribe.cpp et sur les pages de chaque modèle de l’organisation handy-computer sur Hugging Face

Compatibilité avec whisper.cpp

  • Pour pouvoir remplacer whisper.cpp utilisé dans Handy, une compatibilité proche d’un remplacement drop-in a été implémentée
  • Les fichiers de modèle .bin pour whisper.cpp distribués avec Handy peuvent aussi être exécutés avec transcribe.cpp
  • Certains flags et certaines fonctionnalités de whisper.cpp ne sont pas encore pris en charge
  • Pour la plupart des usages, l’implémentation de whisper est suffisamment stable et peut remplacer whisper.cpp avec des performances globalement similaires

Bindings de langage et maintenance

  • Écrite en C/C++, la bibliothèque fournit des bindings officiellement maintenus afin de déployer la transcription locale dans plusieurs environnements
    • Python
    • JavaScript/TypeScript
    • Rust
    • ObjC/Swift
  • Les contributions pour des bindings dans d’autres langages sont les bienvenues, mais les contributeurs devront en assurer la maintenance
  • Les besoins réels de Handy ont été intégrés dans la conception de la bibliothèque, et transcribe.cpp continuera d’être maintenu sur la base de l’expérience de maintenance de Handy
  • Le projet intègre l’expérience acquise en prenant en charge divers modèles ASR et cas d’usage réels, mais certains cas ne sont pas encore couverts et les contributions externes sont acceptées
  • La version actuelle est v0.1.0 et présente encore des aspérités ; les signalements d’issues sont donc demandés

Étendre l’ASR local jusqu’aux appareils basse consommation

  • L’objectif est de faciliter l’exécution directe de l’ASR sur l’appareil afin de réduire le besoin d’envoyer la voix vers des services cloud
  • Même sur un CPU RK3566 peu performant, il est possible d’exécuter des modèles plus vite que le temps réel
  • Des vitesses de transcription supérieures au temps réel avec des modèles récents fonctionnent à une puissance de l’ordre de quelques watts
  • Pour traiter davantage d’inférences en local, il faut simplifier le déploiement et l’exécution des moteurs d’inférence dans les applications
  • transcribe.cpp ne peut pas résoudre à elle seule tout le problème du déploiement de l’inférence locale, mais elle a été développée comme une étape pour abaisser la barrière d’entrée de l’ASR local

Soutiens au projet

  • Mozilla AI, le programme BiR et Davide de Mozilla AI ont soutenu le projet dès sa phase exploratoire initiale, alors qu’il n’avait pas encore de forme produit concrète
  • ggml est la base essentielle qui rend possible le déploiement d’applications d’inférence locale
  • Modal a fourni des crédits utilisés pour les tests WER et la validation CUDA
  • Blacksmith prend en charge une partie de la CI/CD qui vérifie les artefacts de release
  • Hugging Face fournit à l’organisation handy-computer un espace de stockage privé, permettant de téléverser librement les modèles

Utilisation de l’IA dans le développement

  • Estimant qu’il serait difficile pour une seule personne d’écrire from scratch en quelques mois un moteur basé sur ggml de cette envergure, une assistance IA a été utilisée pour le développement
  • Le texte de présentation du projet n’a pas été écrit par IA ; il est composé de phrases prononcées ou saisies directement

1 commentaires

 
GN⁺ 1 일 전
Commentaires sur Hacker News
  • Ça a l’air très impressionnant. En revanche, je n’ai pas trouvé dans la documentation du modèle de fonction permettant de transcrire les sons, et non le sens d’une langue inconnue, en alphabet phonétique international (IPA)
    Pour les langues minoritaires parlées par moins de 10 000 personnes, il se peut qu’il n’y ait jamais assez de ressources pour entraîner un modèle par langue. S’il existait un modèle capable de convertir directement la parole en IPA sans identifier la langue, ce serait d’une grande aide pour les linguistes qui étudient les langues minoritaires du monde entier

    • Dans la parole réelle, il y a beaucoup d’ellipses et de contractions, donc même en connaissant la langue, la transcription phonémique est bien plus difficile que la transcription en mots. Il existe des modèles comme https://huggingface.co/spaces/KoelLabs/IPA-Transcription-EN, mais leur taux d’erreur est très élevé
    • La famille de ma femme est originaire des Iu Mien, un sous-groupe des Dao/Yao de Chine. Le mien est une langue distincte, mais la plupart de ses locuteurs sont en pratique analphabètes, et il n’existe presque ni manuels ni cours, donc elle est difficile à apprendre
      Il existe aussi très peu de documents écrits, donc j’aimerais créer moi-même un système de traduction, un peu comme dans Project Hail Mary
    • Je connais très peu de modèles qui prennent cela en charge, donc c’est hors du périmètre actuel de la bibliothèque, mais s’il existe un modèle adapté, je serais tout à fait prêt à l’intégrer
    • Il existe quelques modèles d’automatic phoneme recognition (APR), mais leurs performances sont tout juste passables
    • Pour être pratiques, ces modèles semblent devoir connaître à l’avance la plage de sons qu’ils vont entendre. L’IPA couvre énormément de sons, mais chaque langue n’en utilise qu’une partie
      Le l sombre et le l clair en anglais (ball/light), ou le p aspiré (pin/spin), peuvent distinguer le sens dans d’autres langues, mais pas en anglais. Je me demande si les linguistes cherchent à obtenir une transcription IPA la plus fidèle possible, puis à la normaliser manuellement
  • Félicitations pour la sortie. J’utilise beaucoup Handy sur Mac et sur téléphone, et c’est particulièrement utile quand la reconnaissance vocale par défaut d’Apple comprend mal des termes spécialisés
    Je me demande s’il serait possible d’obtenir un soutien d’une fondation pour les coûts de maintenance. Si je voulais être rémunéré pour un projet de ce type, j’aimerais aussi savoir vers quel type d’organisation se tourner et comment demander ce soutien

    • Avec la popularité de Handy, je suis devenu malgré moi un mainteneur open source, et heureusement les dons individuels ainsi que plusieurs sponsors soutiennent déjà ce travail
      J’aimerais continuer à contribuer à l’open source, donc tout soutien allant dans ce sens est bienvenu, en particulier de la part d’organisations qui croient en l’open source et le font progresser. Pour en discuter plus en détail : contact@handy.computer
    • La dictée par défaut du système sur iOS oblige Apple à téléverser le carnet d’adresses à chaque requête, même sans utiliser iCloud, donc je suis forcé de la désactiver
  • Plusieurs systèmes de speech-to-text reconnaissent correctement la parole elle-même, mais ne prennent pas en charge le workflow souhaité. Il faut pouvoir ouvrir un document, parler, et que le texte soit inséré en continu avec une latence minimale à la position du curseur
    Le fait de coller tout le texte d’un coup après avoir arrêté l’enregistrement n’est pas très utile ; la saisie continue est l’essentiel

    • Pour ma part, j’ai trouvé qu’une transcription faite d’un bloc une fois l’enregistrement terminé me convenait mieux. Avec la saisie en temps réel, vérifier les erreurs de transcription rend plus difficile de poursuivre son raisonnement jusqu’au bout
      Il est plus utile de parler pendant 5 à 10 minutes de tout ce qu’on a en tête sur un sujet, puis de relire ensuite, car cela évite de casser le fil de la pensée
    • Si vous le souhaitez, cela pourrait s’implémenter assez facilement en modifiant Handy. Je prévois aussi de l’ajouter comme fonctionnalité officielle de l’application, mais il y a d’abord beaucoup d’autres problèmes à régler
    • En anglais, beaucoup de mots ne peuvent être déterminés qu’avec le contexte autour. Par exemple, there et their ne se distinguent pas à la seule prononciation
    • L’utilité d’une fonction de transcription dépend de la manière dont on l’utilise. Si, pendant la dictée, on ouvre d’autres fenêtres ou qu’on regarde des graphiques et des données, il devient plus facile de fournir des informations qui appuient ce qu’on dit
      Certaines applications utilisent même ce qui est copié ou en cours de consultation comme contexte de transcription pour améliorer le résultat : https://superwhisper.com/docs/common-issues/context#types-of...
    • J’ai essayé cette approche dans https://github.com/electronstudio/low_latency_dictation, mais la précision du modèle temps réel était faible. Je fais donc un second passage avec un modèle plus précis avant de valider le texte
  • Je me demande s’il est possible, comme avec Whisper.cpp, de fournir du contexte en entrée pour améliorer fortement la précision

    • Oui
  • Parmi les quatre bindings de langage pris en charge par le mainteneur, celui pour Python se trouve ici : https://github.com/handy-computer/transcribe.cpp/tree/main/b...
    Il n’existe pas encore de wheels binaires PyPI incluant les dépendances ; pour l’instant, la bibliothèque PyPI appelle via ctypes une bibliothèque installée séparément, mais cela semble prévu pour une prochaine version

    • J’ai soumis à PyPI une PR demandant de l’espace de stockage supplémentaire pour les paquets CUDA, mais elle ne semble pas encore avoir été approuvée. J’aimerais recevoir de l’aide pour améliorer la developer experience (DX) des bindings
  • Je tombe dessus au bon moment. J’entends souvent parler d’intégrer la synthèse vocale (TTS) dans les outils de prompting, et j’avais envie d’essayer moi-même
    L’idée d’un cycle où l’on développe longuement ses pensées à l’oral pour en faire un document, puis qu’on l’édite avant de l’envoyer à une IA, me paraît très séduisante

  • C’est une contribution énorme à la communauté, et c’est impressionnant que cela ait été fait seul. Je m’attendais presque à voir une annonce de levée de fonds Series A à la fin
    Cela montre qu’on peut certes utiliser l’IA pour produire très vite des résultats médiocres, mais aussi élargir ses ambitions pour créer des choses plus rigoureuses et plus durables qu’avant. Plutôt que d’intégrer directement Transcribe.cpp dans une application, je pense que ce genre de fonctionnalité devrait être disponible partout, via le système d’exploitation ou des applications comme Handy

    • Oui, je suis bien l’auteur et le mainteneur, et le soutien des sponsors ainsi que les dons de la communauté Handy ont été d’une grande aide. En particulier, Mozilla AI a soutenu le travail initial, ce qui m’a permis de transformer un rêve un peu vague autour de Handy en vrai projet et de sortir la v0.1.0
      Un jour, j’aimerais distribuer correctement libtranscribe et en faire une sorte de bibliothèque système. Il faudra du temps pour la stabiliser, mais je pense que c’est possible
  • Cela fonctionne bien mieux que transcribe-rs. J’ai aussi mis à jour l’application de saisie vocale hors ligne pour utiliser la nouvelle bibliothèque, et la vitesse s’est nettement améliorée : https://github.com/notune/android_transcribe_app

  • Il est juste de dire que, pour diverses raisons, l’inférence locale va se développer, et que l’exécution et le déploiement doivent devenir plus simples pour que davantage d’applications l’adoptent
    Le fait qu’aucun mot de l’article n’ait été rédigé par une IA, mais soit sorti de la bouche ou des doigts de son auteur, rend aussi le projet plus digne de confiance et plus accessible

    • Il m’est difficile d’être d’accord avec cette affirmation, car les outils que nous utilisons façonnent notre pensée. Un LLM de reconnaissance vocale reste au final un LLM, et les erreurs qu’il produit se forment selon les attentes intégrées à son entraînement, influençant aussi les mots qui apparaissent à l’écran
      À force de l’utiliser, on finit par apprendre quelles suites de mots seront transcrites correctement, et cela devient une partie du processus de pensée. Avec le temps, le LLM et la pensée s’entremêlent, si bien que même cet usage de l’IA peut réellement modifier la phrase finale
  • J’ai rencontré des problèmes similaires en cherchant à faire tourner un serveur d’API de transcription en local. Ce qui me manquait le plus, c’était la prise en charge du streaming et celle de mots spéciaux à prioriser pendant la reconnaissance, donc je suis ravi de voir qu’il y a du streaming ici

    • Depuis l’arrivée de whisper.cpp, je l’exploite moi-même sur un serveur 3090 Ti. Même si une alternative plus rapide et meilleure est sortie, cela continue de fonctionner sans problème, les poids sont légers et c’est largement assez rapide pour mes besoins
      En l’installant sur un home server local comme ci-dessous, on peut facilement créer une API de transcription locale. Il faut ajuster un peu les paramètres d’inférence, mais une fois fixés, cela fonctionne très bien

      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

    • La pondération des mots ne sera probablement prise en charge que bien plus tard, mais le streaming est déjà disponible
      J’espère que quelqu’un contribuera à la codebase avec un bon exemple de serveur et aidera à résoudre les problèmes, ou construira un serveur robuste en s’appuyant sur transcribe.cpp ou ses bindings dans d’autres langages. Une fois cela prêt, je serais aussi disposé à l’intégrer directement au projet principal