Journal NoComprendo, la commande vocale pour Linux

Posté par  (site web personnel) . Licence CC By‑SA.
74
28
nov.
2019

Sommaire

Un contexte douloureux

Je pousse la souris depuis sa démocratisation (dans les années 80), je control-alt-shifte depuis encore plus longtemps ce qui fait de moi un bon connaisseur en TMS.
Ajoutons aussi une fracture du poignet gauche, il y a quelques années, qui m'ont rendu le Ctrl+Shift+Lettre douloureux en fin de journée.

J'ai pensé à la commande vocale. L'idée n'était pas de se passer d'un clavier, mais de pouvoir lancer verbalement quelques raccourcis claviers pour soulager mes articulations.

Trouver un outil

La reconnaissance vocale sur internet passe en général par des APIs Google ou Amazon.
Pas question pour ma part d'envoyer quoique que ce soit sur le web. La reconnaissance devra s'effectuer localement.
J'ai trouvé la librairie PocketSphinx qui correspondait à mes attentes : vocabulaire réduit, traitement rapide et local, les premiers tests sont concluants.

Ça marche ce truc ?

L'objectif initial a été largement dépassé. Je pense que NoComprendo peut maintenant répondre aux besoins de certains handicapés moteurs. Je vous le propose pour évaluation.

Si vous n'avez pas de handicap, ça reste très amusant utiliser, ça impressionnera vos amis.
Aujourd'hui je m'en sers quotidiennement pour lire les nouvelles "sans les mains" depuis mon lecteur de flux (mes mains tiennent le mug de thé). Ce n'était pas prévu pour ça, mais ça repose bien ma tendinite.
Une petite vidéo pour éveiller votre curiosité : NoComprendo en action

A quoi ça ressemble ?

  • Fenêtre principale : Fenêtre principale de NoComprendo
  • Fenêtre principale réduite : Fenêtre principale réduite de NoComprendo

Principes généraux

Vocabulaire

La reconnaissance vocale propose d'identifier tous les mots que vous articulez, comme dans une dictée.
La commande vocale cherche à reconnaître des mots dans un ensemble de mots prédéfinis. Pour les mots inconnus, elle trouvera ceux les plus semblables phonétiquement dans son vocabulaire.
Il s'agit d'établir un ensemble de mots (vocabulaire) dans lequel piocher pour créer des "énoncés".

  • Editeur de vocabulaire Editeur de vocabulaire de NoComprendo

Chaque mot peut-être fourni avec plusieurs phonétiques.
Par exemple : le verbe "descendre" correspond aux phonétiques de "descends" et "descendre".
Cela permettra d'utiliser indifféremment les énoncés "descends page" ou "descendre page" pour emmètre la touche PgDown.

Vous ne connaissez pas la phonétique. NoComprendo est fourni avec un dictionnaire de plus de 100000 entrées avec leurs phonétiques. Il n'y a qu'à puiser dedans, ou même rajouter de nouveaux mots.

Enoncé

Un énoncé est un ensemble de mots compris entre deux silences.
Un énoncé reconnu déclenche une commande.
Les énoncés sont rassemblés en "groupes de commandes" pour pouvoir les activer séparément.
Les groupes de commandes peuvent être facilement exportés et importés.

  • Editeur de groupe de commandes Editeur de groupe de commandes de NoComprendo

Les différentes commandes

Le projet initial consistait uniquement à envoyer des raccourcis claviers.

On peut maintenant :

  • envoyer une ligne de texte
  • exécuter une ligne de commandes avec ses paramètres.
  • utiliser des méta-commandes de contrôle de l'application
  • contrôler quelques déplacements souris
    La gestion des déplacements souris n'est pas très ergonomique. Il faut considérer cela comme expérimental.

  • Editeur de commande
    Editeur de commande de NoComprendo

Sous le capot

Librairie Qt

NoComprendo est basé sur la librairie Qt

Dépendance à x.org

Abordons maintenant un point délicat.
Pour fonctionner NoComprendo à besoin de X.org et de la librairie libxdo pour envoyer des commandes d'une application à l'autre. Wayland ne permettra plus ça, les applications devant être parfaitement isolées.
C'est cette faiblesse de sécurité de X.org qui a permis de réaliser ce logiciel.
Synergy utilise les mêmes principes et NoComprendo est compatible avec.

Après une courte réflexion, j'ai misé sur la pérennité de X.org et sa présence dans nos distributions pour encore longtemps.

Librairies statiques

Pour fonctionner, NoComprendo a besoin des librairies Sphinx et PocketSphinx 5-pre-alpha.
Aucune distribution Linux ne les proposant, ces librairies sont liées statiquement dans l'application. Le Makefile compile les librairies dans un premier temps avant de les intégrer à l'exécutable.

Multilinguisme

Le projet est prévu pour être éventuellement multilingue, mais pour le moment seul le français est disponible. Il n'y a pas de dictionnaire anglais intégré, mes premiers essais n'avaient pas été concluants (et mon accent anglais médiocre).
Je ne me pencherai sur le problème s'il y a de la demande et avec l'aide d'anglophones.

Installation

Pour l'installation, j'ai construit des paquets pour quelques distributions majeures chez Open Build Service.
Pardonnez-moi pour la signature du paquet invalide. C'est un truc qui me résiste dans la production de paquets chez OBS.
Je suis preneur de conseils.

L'installeur fournit un vocabulaire prédéfini prêt à l'emploi ainsi que quelques groupes de commandes en exemple.

  • Sélecteur de groupe de commandes Sélecteur de groupe de commandes de NoComprendo Mon environnement habituel étant KDE sous Mageia, un groupe de commandes spécifique est disponible. Assurez-vous que les commandes correspondent bien à vos raccourcis clavier. Si vous utilisez un autre environnement, assemblez vous-même votre groupe de commandes.

Liens

Vidéos

Pour aider à l'installation et la prise en main, 4 vidéos :
- Procédure d'installation 3 minutes
- Présentation de l'interface 4 minutes
- NoComprendo en action 5 minutes
- Configuration : ajout de vocabulaire et de commandes, 15 minutes.

Je me suis bien amusé à programmer cette application.
Je pense qu'on peut lui trouver plein d'utilisations non prévues au départ.
A vous de jouer…

  • # Au sujet des TMS : pédaliers USB

    Posté par  . Évalué à 10.

    Pour les problèmes de raccourcis claviers douloureux, il y a toujours les pédaliers USB. C'est généralement détecté comme une manette de jeu, et donc c'est bidouillable à souhait.

    • [^] # Re: Au sujet des TMS : pédaliers USB

      Posté par  . Évalué à 3.

      Mon avis est mitigé. J'avais acheté le modèle à 3 pédales, j'avais voulu configurer les pédales pour remplacer respectivement Ctrl, Shift et Alt. J'avais réussi (avec un peu de développement car le logiciel de configuration est pour Windows et n'est même pas libre), mais il n'était pas possible d'avoir 2 pédales appuyées simultanément : appuyer sur une seconde pédale faisait comme si on avait le pied de la première.

      • [^] # Re: Au sujet des TMS : pédaliers USB

        Posté par  . Évalué à 6.

        C'est le problème des bidules électroniques à pas cher, le support logiciel pour Linux est médiocre voire inexistant.

        Pour un périphérique USB (un clavier, souris, joystick, pedalier, etc.), le mieux c'est de remplacer le micro-controleur par un autre. Le Atmega32u4 d'un Arduino Pro micro est conçu pour ce genre d'utilisation.
        Quitte à virer toute l'électronique, c'est possible de modifier un pédalier pour guitare ou de se servir de boutons pour bornes d'arcade. Bref, il y a pleins d'options pour se bricoler un pédalier USB.

        Pour le problème des deux pédales, déjà voir comment sont cablés les interrupteurs (en matrice, il faut des diodes anti-retour) avant de mettre en cause le firmware.

    • [^] # Re: Au sujet des TMS : pédaliers USB

      Posté par  (site web personnel, Mastodon) . Évalué à 7. Dernière modification le 30 novembre 2019 à 07:15.

      Ah ben voilà, je me disais bien que c'était inhumain d'utiliser Emacs avec 2 mains ! Ils devraient ajouter dans leur documentation que pour pouvoir l'employer correctement, il faut utiliser ses pieds :)

  • # Excellent!

    Posté par  . Évalué à 10. Dernière modification le 28 novembre 2019 à 10:27.

    J'adore la démarche : je règle un problème, ici et maintenant, on verra plus tard pour wayland.

    J'adore la présentation : pas de chichis techniques, on parle usage.

    Merci pour le partage, mais j'utilise rarement l'ordinateur seul dans une pièce. Tu ne te sens pas foi à parler tout seul?

    ⚓ À g'Auch TOUTE! http://afdgauch.online.fr

  • # Emacs

    Posté par  . Évalué à 1. Dernière modification le 28 novembre 2019 à 10:33.

    Apres la lecture du 2eme paragraphe, j'ai de suite pensé qu'emacs aurait pu te sauver.

    J'en profite pour te dire merci, je m'étais intéressé à faire quelque chose de similaire il y a quelque temps, mais avait rebroussé chemin en voyant la difficulté de mise en place et le manque de temps.

    Aucune piste du côté wayland ? Il me semble que certaines implémentation permettent de faire du rdesktop, donc envoyer des commandes ne devrait pas être insurmontable.

  • # Super ! MERCI

    Posté par  . Évalué à 5.

    Juste pour te remercier.
    Merci.

  • # et en plus ça marche ! bien vue

    Posté par  . Évalué à -7.

    bonjour à tous

    félicitation pour ce job impressionnant
    je l'ai ajouté à ma collection de copies d'écrans linux

  • # Essaye vim

    Posté par  . Évalué à 5.

    Ajoutons aussi une fracture du poignet gauche, il y a quelques années, qui m'ont rendu le Ctrl+Shift+Lettre douloureux en fin de journée.

    Je ne peux m'empêcher de penser que tu dois utiliser des applications graphiques ou alors Emacs, alors qu'avec un bon vieux vim tu n'aurais toujours qu'une touche à actionner au même moment ! Ça aide vachement pour les TMS… (avec du bépo en plus si t'es motivé)

    • [^] # Re: Essaye vim

      Posté par  (site web personnel) . Évalué à 2.

      Je me débrouille sous vim, mais mon environnement habituel est QtCreator.
      Il est toujours possible de redéfinir à sa sauce des raccourcis clavier. Il faut le faire sur tous les postes qu'on utilise. Je préfère garder les raccourcis standards pour ne pas être perdu en changeant de machine.

      L'histoire de tendinite est surtout un prétexte.
      Actuellement j'ai beaucoup moins mal au poignet qu'au moment où j'avais commencé le développement, mais comme l'outil est amusant, je m'en sers souvent.

      Pour QtCreator, je me ferai un groupe de commandes quand je bosserai sur un autre projet.
      En se servant de NoComprendo pour développer NoComprendo, on se retrouve pendant les tests avec deux instances simultanées, c'est un peu risqué de recevoir deux fois les commandes.
      J'ai vite arrêté.

      • [^] # Re: Essaye vim

        Posté par  . Évalué à 2.

        Il est toujours possible de redéfinir à sa sauce des raccourcis clavier.

        Oui enfin là les « raccourcis », c'est la manière de base de fonctionner de vim, à une touche.

        Il faut le faire sur tous les postes qu'on utilise. Je préfère garder les raccourcis standards pour ne pas être perdu en changeant de machine.

        Moi aussi, quasiment (à part le ctsr au lieu du hjkl, en gros). Sinon j'ai mes dotfiles en git que je peux déployer n'importe où où je bosse : la magie d'unix qui fait que je n'ai pas à « reconfigurer » mes applis, puisque tout est fichier…

        L'histoire de tendinite est surtout un prétexte.

        Je comprends, t'avais aussi envie de t'amuser ;-)

  • # Simon

    Posté par  (site web personnel) . Évalué à 2.

    Merci pour ce partage très intéressant.

    Le concept semble assez proche de "Simon", une application KDE qui a pur but d'aider les personnes qui ont du mal à utiliser un clavier et une souris.
    https://simon.kde.org/

    Il permet aussi de créer facilement ses modèles acoustiques. Par contre, je ne sais pas si c'est compatible Wayland.

    • [^] # Re: Simon

      Posté par  (site web personnel) . Évalué à 1.

      C'est parce-que je n'avais pas réussi à faire marcher Simon que je me suis lancer là dedans.
      La configuration n'était pas triviale. Ça utilise les modèles acoustiques et il me semble qu'on peut l'entrainer avec des enregistrement de voix, trop compliqué.
      La librairie Sphinx permet de faire tout ça également, mais PocketSphinx fournit des fichiers clés en main pour reconnaître le français. Ça a marché dès les premiers tests.

      NoComprendo est, je pense, plus simple à configurer mais beaucoup moins ambitieux.

      J'ai lu sur des forums que PocketSphinx avait des problèmes avec les voix féminines. Je n'avais pas sous la main de voix haut perchée pour faire des tests.
      J'espère ne pas avoir fait un logiciel discriminatoire…

  • # Phonétique

    Posté par  . Évalué à 3.

    Très intéressant !

    Le verbe "descendre" correspond aux phonétiques de "descends" et "descendre".

    Tu voulais peut-être dire "descends" et "descendreuh" ?

    J'ai aussi deux questions sur la phonétique:

    • Les phonèmes(?) semblent codés sur deux caractères systématiquement, pourquoi ? Ca donnerait quoi pour script ?
    • Il y a vraiment une différence entre le "é" et le "er" de "démarrer" ? Je vois qu'ils sont respectivement transcris ai et ei.
    • [^] # Re: Phonétique

      Posté par  (site web personnel) . Évalué à 2.

      Je ne saurai pas répondre à cette question subtile. Peut-être le "é" final est différent ?

      Je n'ai pas inventé ce codage phonétique.
      J'utilise celui contenu dans le dictionnaire qui vient d'ici (fr.dict) et qui est utilisé par les librairies.

      Le dictionnaire permet de ne pas trop se poser de question, en lisant la phonétique on comprend à peu près.

      On peut recombiner des sons pour inventer des nouveaux mots. Si on veut dire "démarrer firefox", il faut d'abord prononcer firefox comme un français et combiner quelques phonèmes piochés dans le dico.

      Pour "script" le dictionnaire donne :
      script ss kk rr ii pp tt
      scripts ss kk rr ii pp tt
      scripts(2) ss kk rr ii pp tt zz

      • [^] # Re: Phonétique

        Posté par  . Évalué à 2.

        Pour "script" le dictionnaire donne

        J'avais mal lu les entrées du dictionnaire désolé. Les doublets de deux lettres différentes ne codent que des voyelles en fait.

      • [^] # Re: Phonétique

        Posté par  (site web personnel) . Évalué à 2.

        Si on veut dire "démarrer firefox",[…]

        Il faudrait mettre un alias pour "démarrer Internet"… parce qu'il y a beaucoup de gens qui ne savent pas ce qu'est Firefox, ni même savent ce qu'est un navigateur Internet.

        Pourquoi bloquer la publicité et les traqueurs : https://greboca.com/Pourquoi-bloquer-la-publicite-et-les-traqueurs.html

        • [^] # Re: Phonétique

          Posté par  (site web personnel) . Évalué à 1.

          Ça tombe bien puisque Firefox n'est pas un "navigateur internet" et que le Web n'est pas Internet ;-) .

          Perso, pouvoir arrêter ou démarrer Internet d'une simple commande vocale, ça me fera peur !

  • # Déclenchement

    Posté par  . Évalué à 1.

    Est-ce qu'il est possible d'avoir un son-clef d'activation/désactivation (un mot peu usité ou un claquement de langue) pour pouvoir lancer des moments d'interaction vocale et des moments où on peut discuter?

    • [^] # Re: Déclenchement

      Posté par  (site web personnel) . Évalué à 6. Dernière modification le 29 novembre 2019 à 08:21.

      Oui, il existe déjà les méta-commandes "Suspend" et "Resume" déclenchées par les énoncés "suspendre écoute" et "reprendre écoute".
      C'est visible vers la fin de la vidéo "En action".

      La commande la plus spectaculaire est "suspendre session" qui déclenche la mise en veille.
      Pour sortir de veille NoComprendo est impuissant.

  • # Compilation

    Posté par  . Évalué à 3. Dernière modification le 02 décembre 2019 à 13:53.

    J'ai pu compiler les sources et créer un paquet installable en suivant les étapes du readme_fr.txt.

    Petits détails :

    • En plus de ce qui est cité dans le journal, l'utilitaire espeak est requis pour compiler (fonctionne avec la 1.48.03).
    • Pour envoyer la procédure d'installation dans un autre répertoire racine (pour pouvoir ensuite générer le paquet), entrer :

      make install INSTALL_ROOT=install-rep # Indiquer un chemin absolu.
      
    • Copier pocketsphinx dans install-rep/usr/share (j'ai peut-être loupé qqch ici qui le fait automatiquement)

    • Générer le paquet pour la distro cible


    Note pour les utilisateurs de Slackware, qt5 est nécessaire aussi. AlienBob maintient un jeu de paquet pour qt5 (dans ce cas, utiliser qmake-qt5 au lieu de qmake).

    • [^] # Re: Compilation

      Posté par  (site web personnel) . Évalué à 1.

      espeak

      Espeak a été rajouté pour donner un peu de rétroaction au programme.
      Sa compilation est optionnelle. On peut mettre en commentaire la ligne :

      CONFIG += use_espeak

      dans nocomprendo.pro pour ne pas l'utiliser.

      Répertoire d'installation

      Le chemin /usr/share/pocketsphinx est codé en dur dans les directives d'installation du fichier .pro.
      Je vais voir comment corriger ça.

      qmake-qt5

      Fedora et OpenSuse utilisent aussi le nom qmake-qt5. C'est le fichier .spec (qui sert à fabriquer les rpm) qui fait la translation.
      nocomprendo.spec

      Bravo pour le paquet Slackware.

  • # Qwerty ?

    Posté par  . Évalué à 3.

    J'ai commencé à tester et ça marche plutôt bien (casque)…

    L'ouverture d'onglet dans le navigateur fonctionne bien par exemple, par contre quand j'ai tenté de fermer l'onglet rien ne se passait… Enfin si, la barre d'adresse s'activait.

    Le raccourci configuré est Ctrl+W. Dans le doute j'ai modifié en Ctrl+Z et là ça a fonctionné. Se peut-il que l'utilitaire ou une dépendance convertisse les raccourcis clavier en codes correspondant au clavier Qwerty ? (le vrai Ctrl+Z active bien la barre d'adresse.)

    • [^] # Re: Qwerty ?

      Posté par  (site web personnel) . Évalué à 2. Dernière modification le 02 décembre 2019 à 15:16.

      Ça me rappelle le même genre de problème avec Synergy qui utilise des commande semblables.
      Je l'avais résolu en forçant la disposition du clavier sur "français".
      La configuration générale du système en français ne suffisait pas.

      Si ça peut t'aider ?

      • [^] # Re: Qwerty ?

        Posté par  . Évalué à 1.

        Je l'avais résolu en forçant la disposition du clavier sur "français".

        Tu veux dire dans .config/BeRoot/NoComprendo.conf ? Je n'ai pas vu d'entrées pour le clavier.

        J'imagine que le problème est quelque part entre NoComprendo, xdo et le navigateur ? :-)

  • # Installation sur Ubuntu 18.04 LTS?

    Posté par  . Évalué à 1.

    Bonjour,
    Je souhaiterais utiliser nocomprendo (soucis avec mes mains), seulement je ne vois pas de lien de téléchargement pour Ubuntu 18.04 LTS. Qu’en est il?
    Merci

  • # Log d'erreur

    Posté par  . Évalué à 1.

    Merci pour se projet bien sympatique !
    Merci pour le build Ubuntu 18.04 :)

    J'ai quelques soucis après l'installation
    L'application a fonctionné quelques minutes mais ne reconnais plus les commandes.
    L'application est prête, elle écoute, mais plus de commande qui s'affiche ou s'éxecute
    Existe-il des log pour voir où cela couak ?
    Quel partie du programme s'occupe de la reconnaissance vocal ?

    Merci d'avance :)

    • [^] # Re: Log d'erreur

      Posté par  (site web personnel) . Évalué à 1.

      C'est pour répondre à une demande par email que j'ai créé le paquet Ubuntu 18.04.
      J'ai vu la demande bien plus tard dans les commentaires.

      Quelques pistes :
      - Les groupes de commandes sont-ils bien sélectionnés ?
      - Il reste un bug de rechargement des groupes de commandes bientôt résolu. Essayer de relancer le programme après modification de la sélection.
      - l'application est-elle suspendue ?
      - En démarrant NoComprendo depuis un terminal, on est bien servi en logs. Ce sont ceux de pocketsphinx, ils sont assez bavards pendant la reconnaissance vocale, mais pas sûr que ça puisse aider.

      La reconnaissance vocale est effectuée par la librairie pocketsphinx.
      C'est appelé dans le source "comprendo.cpp", les fonctions initPSphinx(), closePSphinx() et recognize_from_microphone() qui sont pratiquement des copier/coller des exemples fournis avec la librairie. Je ne pense pas que se plonger dans ce code éclaire beaucoup.

      Je pense faire un journal bientôt pour présenter les dernières nouveautés.

      • [^] # Re: Log d'erreur

        Posté par  . Évalué à 0.

        Merci pour ta réponse rapide.

        Pour les pistes:
        * les 6 groupes de commandes de bases sont sélectionné
        * L'application continue de tourner, des logs d'infos s'écrivent à chaque parole (ngram_search, ps_lattice, cmn_live)

        Effectivement je n'avais pas essyé de le lancé depuis le terminal, beaucoup d'info. Je ne sais pas braoment ou chercher, néamoins ces lignes m'étonne :

        INFO: ngram_search_fwdflat.c(960): fwdflat 0,00 CPU 0,004 xRT
        INFO: ngram_search_fwdflat.c(963): fwdflat 0,00 wall 0,004 xRT
        

        comme s'il ne trouver qucun mot correspondant

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.