NoComprendo continue son chemin

Posté par  (site web personnel) . Édité par Davy Defaud, Ysabeau 🧶 🧦, ZeroHeure et palm123. Modéré par Nÿco. Licence CC By‑SA.
56
25
fév.
2020
Éducation

Il y a quelque temps, je vous présentais NoComprendo, logiciel de commandes vocales en cours de développement. Deux mois plus tard sortait la version 1.0.

Depuis, j’ai été contacté par l’équipe de Mageia et celle de DVKBuntu un projet handy opensource. Pour les premiers, j’ai amélioré et simplifié le processus de construction et les outils utilisés. Pour les seconds, j’ai apporté quelques modifications d’ergonomie. Pour le plaisir, j’ai éliminé les outils externes de création de « Language model » pour les remplacer par un interne, codé en Qt/C++.

Voici donc une nouvelle version numérotée 1.1.

Sommaire

Nouveautés

Rappel

NoComprendo est fourni avec un ensemble de commandes de démonstration (orienté Plasma/KDE). Ces commandes ne prétendent pas être adaptées à tout le monde, elles sont là comme exemples de ce qu’on peut faire.
C’est à chacun de constituer des groupes de commandes adaptés à son environnement et aux applications qu’il utilise.
Vérifier si les commandes disponibles correspondent bien à vos besoins.

Nouveautés dans l’interface

Sélecteur de langue

  • NoComprendo utilisait par défaut la variable d’environnement LANGUAGE pour sélectionner la langue par défaut ;
  • maintenant, au premier démarrage, l’application vous propose de choisir parmi les langues disponibles (fr_FR et en_US) ;
  • elle pourra être changée plus tard dans le dialogue de configuration ;
  • les groupes de commandes sont bien sûr différenciés pour chaque langue.

Zone de notification

Apparition d’une icône dans la zone de notification, pour surveiller l’état de NoComprendo lorsque la fenêtre est repliée.

Barre des tâches

  • NoComprendo peut être supprimé de la barre des tâches ;
  • la fenêtre reste accessible par la zone de notification ou par méta‑commande vocale.

Localisation de la souris

Quand on a perdu de vue le pointeur sur nos écrans devenus trop grands, on a l’habitude de secouer un peu la souris pour le retrouver. Mais sans les mains ? Une nouvelle méta‑commande lance une petite animation pour localiser le pointeur (dire « chercher souris »).

Nouvelles méta‑commandes

  • une commande de réduction de la fenêtre de l’application dans la barre des tâches : Minimize ;
  • une commande pour ré‑afficher et faire passer NoComprendo au premier plan : Raise ;
  • la commande de localisation du pointeur : MouseShow.

Confirmation de sortie

Une fenêtre de confirmation est activable avant de quitter l’application. C’est facile de lancer une commande vocale de sortie par erreur.

Options de ligne de commande

[user@localhost]$ nocomprendo --help
Utilisation : nocomprendo [options]
Commande vocale pour Linux/X.org
Basé sur Qt et PocketSphinx.

Options :
  -h, --help           Afficher cette aide.
  -v, --version        Afficher les informations de version.
  -a, --author         Afficher les informations sur l’auteur.
  -i, --license        Afficher les informations de licence.
  -b, --libs           Afficher la version des librairies.
  -p, --pocket         Log pocketsphinx complets.
  -w, --words          Tracer les mots reconnus.
  -l, --languageModel  Afficher le fichier "Language model".
  • les journaux pocketsphinx sont maintenant cachés depuis un terminal et accessibles avec l’option pocket ;
  • l’option words permet de suivre depuis le terminal les énoncés reconnus par NoComprendo ;
  • l’option languageModel affiche le fichier statistique utilisé par NoComprendo (dépend des groupes de commandes sélectionnés).

Simplification de la construction

Suite à quelques remarques de l’équipe Mageia, j’ai simplifié le processus de construction logicielles :

  • suppression de la dépendance à Python 2 (utilisés par défaut dans la construction des bibliothèques) ;
  • suppression des CMU Tools pour créer le « language model ».

Quelques mots sur les « language models »

Pour fonctionner, NoComprendo a besoin d’un « language model » (LM) :

  • un LM est un fichier statistique sur les probabilités d’occurrences de mots et de groupes de mots ;
  • on forme d’abord un corpus (ensemble des énoncés disponibles), qu’on « mouline » pour obtenir un LM ;
  • avec le corpus suivant :
    afficher bureau
    arrêter écoute
    avancer onglet suivant
    basculer
    chercher souris
    descendre page
    démarrer console
    <s>
    </s>
  • on obtient ce LM :
\data\
ngram 1=17
ngram 2=10
ngram 3=1

-grams:
-1.1027  -0.3010
-1.5798 </s> -0.2653
-1.5798 <s> -0.2653
-1.5798 afficher -0.2894
-1.5798 arrêter -0.2894
-1.5798 avancer -0.2894
-1.5798 basculer -0.2653
-1.5798 bureau -0.3010
-1.5798 chercher -0.2894
-1.5798 console -0.3010
-1.5798 descendre -0.2894
-1.5798 démarrer -0.2894
-1.5798 onglet -0.2894
-1.5798 page -0.3010
-1.5798 souris -0.3010
-1.5798 suivant -0.3010
-1.5798 écoute -0.3010

-grams:
-0.3010 </s>  -0.3010
-0.3010 <s>  -0.3010
-0.3010 afficher bureau -0.3010
-0.3010 arrêter écoute -0.3010
-0.3010 avancer onglet 0.0000
-0.3010 basculer  -0.3010
-0.3010 chercher souris -0.3010
-0.3010 descendre page -0.3010
-0.3010 démarrer console -0.3010
-0.3010 onglet suivant -0.3010

-grams:
-0.3010 avancer onglet suivant

\end\

Les chiffres affichés sont des logarithmes décimaux (probabilités) : − 0,3010 correspond à 0,5 (50 %). En démarrant l’application, j’ai d’abord utilisé un outil en ligne les LM tools version 3. Mais NoComprendo a commencé à beaucoup solliciter le site et ça ne pouvait pas être une solution durable. Je n’ai pas trouvé le code des LM tools 3, mais j’ai mis la main sur les LM tools version 2. C’était compilé/installé et intégré par un script Bash dans la première mouture de NoComprendo. À l’usage, j’ai compris que ces outils étaient trop évolués pour mes besoins. Ils sont faits pour ingurgiter un énorme corpus et produire des probabilités sur des groupes de mots possibles, mais non présents dans le corpus. Le LM produit contenait des énoncés supplémentaires qui perturbaient le fonctionnement de l’application.

Puis j’ai (re)trouvé un script Perl qui faisait l’affaire : QuickLM en ligne et disponible à cette adresse : QuickLM en Perl. Je l’avais déjà croisé, mais je n’avais pas compris à l’époque que sa simplicité en faisait un outil particulièrement adapté. Après quelques jours de tests, j’ai décidé de réécrire QuickLM en Qt/C++. Perl est un langage qui terrifie un peu, mais dans ce cas‑là, le code est relativement simple, linéaire et clair (pour du Perl) et les QMap et QRegExp de Qt peuvent facilement remplacer les structures et expressions rationnelles de Perl. Au final, 170 lignes de Perl transformées en 170 lignes de Qt/C++ maintenant intégrées dans l’application. On ne peut pas dire que le code final soit beaucoup plus lisible que l’original, mais plus besoin d’outil extérieur et de dépendance à Perl.

Le fichier quick_lm.pl reste présent dans l’archive (comme référence) mais n’est plus installé avec les paquets. Pour les plus curieux, la traduction de quick_lm.pl en Qt/C++ est dans le fichier languagemodeler.cpp.

Pérennité de l’application

Pérennité des outils

xdotool et X.Org

xdotool n’est pas un projet des plus actifs, la page d’accueil est datée de 2015. D’un autre côté, avec l’arrivée de Wayland, il ne faut pas s’étonner qu’il n’y ait pas de frénésie de développement autour de cette bibliothèque. Elle est stable depuis cinq ans et NoComprendo n’en utilise que quelques commandes basiques.

Pocketsphinx

La page d’accueil du CMUSphinx project nous rappelle (octobre 2019) qu’il est toujours actif, même si la reconnaissance vocale a pris d’autres voies récemment (deep learning, etc.). PocketSphinx reste un outil qui fonctionne bien et adapté à de petites configurations (Raspberry Pi).

eSpeak (facilement désactivable)

eSpeak est un TTS (Text To Speech) de qualité moyenne, il pourra être facilement remplacé par un TTS de meilleure qualité. J’avais ajouté la synthèse vocale un peu pour m’amuser ; je l’ai laissée parce que c’est pratique dans certains cas, même si j’ai pris l’habitude de la désactiver. Il a l’avantage d’être disponible dans toutes les distributions. L’interface avec eSpeak est regroupée dans un seul fichier de cinq fonctions. Une option de compilation permet de le supprimer de la construction.

Pérennité du développeur

Comme je l’ai sous‑entendu dans mon premier journal, le développeur non plus n’est pas de première fraîcheur. Il serait même plus vieux que Linux qu’Unix. Je compte bien assurer le suivi quelques années, mais il y a peu de chances que je sois encore là pour entretenir ce code dans quinze ans. Dans cette perspective le code a été organisé pour qu’il n’y ait à intervenir que sur un seul module pour changer d’outil de pilotage de l’interface graphique.

L’avenir avec Wayland

Pour le moment, je n’ai encore jamais installé de machine avec Wayland. Si un module (genre rdesktop ou autre) permet un jour d’adapter NoComprendo, il suffira de remplacer une dizaine d’appels de xdotool vers Wayland et de mettre à jour une table de conversion de séquences de touches si nécessaire (tout est dans le fichier guicontrol.cpp).
J’aimerais écrire cette évolution moi‑même, mais je ne fais pas vraiment de veille technologique autour de Wayland. Quand un outil sera disponible, je me pencherai volontiers sur le problème.

Conseils de configuration et d’utilisation

Halte à la technique informatique, voici un peu de technique acoustique pour bien commencer avec NoComprendo.

Avale ta haine, étouffe ta joie !

Un commentaire d’un journal précédent me demandait si je ne me sentais pas fou à parler tout seul à mon ordinateur. Après réflexion, je crois que beaucoup de gens parlent à leur ordinateur et souvent sur un ton pas très amical (trucs qui plantent, machins qui rament trop). Avec NoComprendo, j’ai dû changer d’habitude, pas d’énervement, mais pas d’enthousiasme non plus, un ton neutre, une bonne respiration et bien articuler. Ce type de reconnaissance vocale n’est pas vraiment compatible avec l’expression d’émotions.

Effet collatéral inattendu : ces exercices imposent un certain calme intérieur pour être bien compris, j’en ressors plus détendu, on peut presque considérer ça comme un exercice respiratoire apaisant. En fin de journée, quand la voix et le tonus faiblissent, l’efficacité de la reconnaissance vocale s’en ressent.

Évite les commandes monosyllabiques

Il est tentant d’associer les touches flèches vers le haut et vers le bas aux mots « haut » et « bas ». Pourtant, les commandes formées d’une seule syllabe ont la fâcheuse manie de se déclencher de façon intempestive. Le moindre bruissement, grincement de chaise, reniflage ou soupir (de désespoir face à un bogue) risque d’être interprété comme des mots brefs : « fin », « flux », « fort », etc. Il vaut mieux qu’ils ne déclenchent rien.

Tous ces mots peuvent faire partie du vocabulaire, mais devraient être combinés pour former un énoncé de plusieurs syllabes : « plus fort », « ouvrir flux » ou « touche fin », par exemple. À l’usage, on s’aperçoit qu’un bon énoncé est formé d’au moins deux à trois syllabes. Plus un énoncé est long, plus il sera identifiable avec précision. Choisir le mot « quitter » pour émettre la touche Ctrl + Q est trop risqué, un énoncé comme « quitter application » est plus sûr.

Malgré ces bons conseils, j’ai laissé dans les commandes de démonstration le mot « clic » pour l’action clic gauche, parfois PocketSphinx préfère entendre « quitte ».

Prends garde aux homophonies

Parfois, on a un ensemble de commandes qui fonctionne bien, mais l’ajout d’un nouveau mot peut déstabiliser ce bel équilibre. Il vaut mieux ne pas trop étendre le vocabulaire, car cela risque de multiplier les possibilités que des mots s’entrechoquent. Réutiliser les mots déjà là pour former de nouveaux énoncés.

Ne tapote pas sur le clavier avec l’écoute active

Si votre micro est proche de votre clavier, il est préférable de suspendre l’écoute avant de faire de la saisie continue. Le clapotis des touches peut être pris pour des commandes et provoquer de mauvaises surprises (changement de ligne au milieu d’un mot, clic ailleurs dans la fenêtre ou dans une autre fenêtre).

Sauve la planète

Il serait inconcevable en 2020 de présenter une application qui ne soit pas durable et qui ne sauve pas la planète. NoComprendo vous permet d’atteindre ce but. En effectuant une reconnaissance vocale locale, vous :

  • faites l’économie du transfert de votre voix jusqu’à un serveur états‑unien ;
  • réduisez la surchauffe d’un serveur rempli de processeurs parallèles pour décoder votre parole à l’autre bout du monde ;
  • faites l’économie du retour à travers la planète des trois mots que vous avez articulés vers votre ordinateur ;
  • votre parole étant restée chez vous, elle n’occupera pas d’espace de stockage sur les serveurs de gens bien intentionnés.

Aller plus loin

  • # Conseils de configuration et d’utilisation

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

    Conseils de configuration et d’utilisation

    Merci pour cette partie. On a généralement tendance à se focaliser sur les considérations techniques, alors que finalement des conseils ergonomiques sont les biens venus également. Il ne viendrait à l'idée de personne de faire des boutons trop petit sur une interface, ou de ne pas faire une vérification sur une commande importante. À l'oral, ces considérations sont différentes, et c'est bien d'avoir un retour.
    Merci !!

  • # tutoriels

    Posté par  . Évalué à 1.

    Bonjour,

    merci pour ce logiciel. J'ai voulu lire un tutoriel, mais le site internet d'origine n'en comporte aucun. Où me trompé-je ?
    Merci

    • [^] # Re: tutoriels

      Posté par  . Évalué à 1.

      Je réponds à moi-même: je navigue en anglais sur le réseau. Je ne voyais donc pas le tutoriel. En sélectionnant le français, comme langue d'affichage, le tutoriel est apparu.

      • [^] # Re: tutoriels

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

        Désolé mais les tutoriels en anglais, c'est trop dur pour moi. Même pas sûr de pouvoir démarrer le navigateur avec mon accent.
        Les tutoriels n'intègrent pas les dernières nouveautés.

  • # Bravo

    Posté par  . Évalué à 2.

    J'ai essayé plusieurs fois de mettre en place quelque chose de similaire sans aboutir, alors je suis content de profiter de ce développement, ça juste marche sans réinventer la roue !

    Quelle est la différence entre arrêter et suspendre l'écoute ?

    Une idée pour autoriser de manière générique les commandes Ctrl+lettre en limitant les risques d'erreurs, utiliser un des alphabets radio ?

    aussi sur le salon xmpp:linuxfr@chat.jabberfr.org?join

    • [^] # Re: Bravo

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

      Avec suspendre écoute (méta-Suspend), NoComprendo continue d'écouter mais ne réagit qu'à un énoncé qui déclenche la commande méta-Resume. Une fois à l'arrêt plus personne ne t'entend crier, il faut ressortir la main de sa poche et cliquer sur le bouton de démarrage.
      L'icône dans la zone de notification différencie bien les différents états.

      J'avais pensé à l'alphabet utilisé en aéronautique Alpha, Bravo, Charlie. Ça pourrait permettre de faire un clavier à commande vocale.
      C'est sûr qu'utiliser les noms de lettres monosyllabiques ne serait pas une bonne idée.

  • # le nom

    Posté par  . Évalué à 2.

    Le nom a vraiment été bien trouvé !

    Je suis plié de rire devant la trouvaille.

    Comme rire c'est bien, mais essayer c'est mieux, je vais tout de suite l'installer depuis AUR (il est dispo dans les repos users de ArchLinux). Le temps de trouver un micro.

    Discussions en français sur la création de jeux videos : IRC freenode / #gamedev-fr

Suivre le flux des commentaires

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