- 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
.binexistants 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
.onnxobtenus 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
.binpour 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
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
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
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 manuellementFé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
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
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
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
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...
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
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
ctypesune bibliothèque installée séparément, mais cela semble prévu pour une prochaine versionJe 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
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
À 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 7812La 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