alexylem / jarvis

Jarvis.sh is a simple configurable multi-lang assistant.
http://openjarvis.com
MIT License
805 stars 197 forks source link

Reconnaissance Vocale en Francais avec PocketSphinx #7

Closed alexylem closed 7 years ago

alexylem commented 8 years ago

Aujourd'hui Jarvis supporte PocketSphinx pour la reconnaissance du mot clé "Jarvis" (uniquement). Le dictionnaire utilisé est très limité (100 mots) car il est limité par la puissance du Raspberry Pi 1, et il ne fonctionne qu'avec le modèle de lange anglophone (d'ou le fait que la reconnaissance de "Jarvis" fonctionne mal). J'ouvre ce ticket pour tester le dictionnaire Français et son modèle de langue et voir s'il peut fonctionner sur Raspberry Pi 3 (bien plus puissant que Raspberry Pi 1).

Voici les pages que j'utilise: https://doc.ubuntu-fr.org/pocketsphinx https://sourceforge.net/projects/cmusphinx/files/Acoustic%20and%20Language%20Models/French/

Si vous arrivez à faire fonctionne PocketSphinx en standalone en Français sur Raspberry Pi, merci de partager votre démarche! Alex.

alexylem commented 8 years ago

J'ai réussi à faire reconnaitre "bonjour comment ca va" avec PocketSphinx en français. Par contre l'initialisation de PocketSphinx et la reconnaissance a pris en tout 37 secondes (sur Raspberry Pi 3).

-dict       fr_FR/fr.dic
-hmm    /home/pi/jarvis/stt_engines/pocketsphinx/fr_FR/hmm
-lm     fr_FR/fr-small.lm.bin
INFO: dict.c(336): 105003 words read
result=bonjour comment ça va

Du coup il faut que j'arrive à lancer lancer PocketSphinx dans un processus parallèle de sorte que l'initialisation se fasse et que la reconnaissance soit envoyée au fur et à mesure à Jarvis...

Le problème principal et que je n'ai jamais réussi à faire reconnaitre depuis le micro j'ai une erreur, j'ai toujours utilisé un fichier audio temporaire...

Error opening audio device default for capture: No such file or directory
FATAL: "continuous.c", line 245: Failed to open audio device
alexylem commented 8 years ago

Je garde espoir, je vois 2 arguments très intéressants:

-adcdev     Name of audio device to use for input.
-keyphrase  Keyphrase to spot

J'ai essayé ca, mais j'ai une erreur

$> pocketsphinx_continuous -inmic yes -adcdev hw:1,0
Failed to set PCM device to mono: Invalid argument
FATAL: "continuous.c", line 245: Failed to open audio device
physicien commented 8 years ago

Je ne sais pas si ça peut aider, mais je viens de trouver un Roadtest de pocketsphinx sur RP3 selon différentes configurations : https://www.element14.com/community/roadTestReviews/2166/l/roadtest-review-a-raspberry-pi-3-model-b-review De plus, c'est assez récent vu que ça date du début du mois.

alexylem commented 8 years ago

Merci physicien, malheureusement c'est avec dictionnaire anglais, exécuté depuis un fichier wav d'input, et leur résultat est à... 90 secs... :)

alexylem commented 8 years ago

Je progresse, j'arrive à reconnaitre directement depuis le micro avec:

pocketsphinx_continuous -adcdev plughw:1,0 -inmic yes
physicien commented 8 years ago

J'aimerais avoir plus de détails si possible sur la façon dont Jarvis et pocketsphinx interagissent ensemble actuellement. Est-ce que Jarvis doit boot pocketsphinx à chaque fois qu'il reconnaît son magic word? Si oui, il suffirait en effet de faire comme tu as dit et de lancer pocketsphinx en parallèle et de lui link l'input du micro à chaque fois que Jarvis reconnaît son nom.

Edit : Très content de voir une progression!

alexylem commented 8 years ago

Aujourd'hui Jarvis utilise sox pour détecter un bruit qu'il enregistre dans un fichier audio. Si la durée pourrait correspondre à "JARVIS" il l'envoie à PocketSphinx pour "traduction" ce qui prend 1 à 2 secondes (petit dictionnaire Anglais). J'aimerais que ce soit fait en continue aussi avec un dictionnaire plus grand (le Français), c'est que j'essaye de faire maintenant dans ce ticket.

alexylem commented 8 years ago

Bon je reviens à ma première conclusion, le raspberry pi est trop lent (même le 3) pour un dictionnaire complet. Ca marche si je dis lentement un mot à la fois (espacés de 10 secondes). Sinon voici ce que j'obtient en reconnaissance continue depuis le micro:

Input overrun, read calls are too rare (non-fatal)

D'après: https://sourceforge.net/p/cmusphinx/discussion/help/thread/1460f747/

This error means that decoder is too slow to process incoming data. You need to make sure it's fast enough otherwise it will loose the audio and accuracy will drop. You can compile pocketsphinx with -O3 for faster decoding and also you can tune parameters as described in http://cmusphinx.sourceforge.net/wiki/pocketsphinxhandhelds Overall Pi is pretty slow machine, it's unlikely you will be able to decode anything serious on it, you can only do keyword spotting or grammar recognition of vocabulary less than 10 words.

Je vais creuser au niveau des paramètres de PocketSphinx ainsi que le mode keyword spotting...

physicien commented 8 years ago

Si les paramètres ne donnent rien, je me souviens d'un projet où un problème semblable et été résolu par un script qui défaisait l'input en briques plus petites et plus facilement utilisables. Je ne trouve plus la source, mais il me semble que dans leurs cas c'était afin d'envoyer des dialogues à un TTS engine qui avait une limitation pour les textes trop longs.

alexylem commented 8 years ago

Ce qui reviendrait à faire ce que j'ai fait pour Jarvis (n'envoyer à PocketSphinx qu'un mot à reconnaitre).

Je viens de tester les paramètres et l'option -keyphrase mais ca ne donne rien de concluant, j'ai toujours l'erreur Input overrun, read calls are too rare (non-fatal).

physicien commented 8 years ago

As-tu essayé de compiler pocketsphinx avec -O3? Sinon, je viens de trouver une option possiblement intéressante : -pl_window

Phonetic lookahead is a specific technique which is used to speedup decoding by reducing the amount of computation. Basically everything is decoded with phonetic decoder first and then detailed search is restricted by the results of the fast phonetic search. It's also called “Fast match”. For details and evaluations see the chapter “4.5 Phonetic Fast Match” in Efficient Algorithms for Speech Recognition Mosur K. Ravishankar

pl_window specifies lookahead distance in frames. Typical values are from 0 (don't use lookahead) to 10 (decode 10 frames ahead). Bigger values give faster decoding but reduced accuracy.

Référence

alexylem commented 8 years ago

Oui j'ai essayé -pl_window ainsi que tous les autres recommandés ici. Mais j'ai toujours l'erreur. Pour la compilation pas encore essayé 😄 La je suis en train de faire un dictionnaire allégé en Français de 100 mots, juste pour voir si ca change quelque-chose (en gardant le modèle et langue et modèle acoustique complets)

physicien commented 8 years ago

J'allais justement le proposer. Si déjà Jarvis est capable de comprendre son nom en français, ça sera déjà ça. Dans le pire des cas, je considèrerai utiliser un server avec Sphinx sur mon PC plutôt que celui de Google :laughing:

alexylem commented 8 years ago

Bon j'ai testé avec un dictionnaire plus petit (les 100 mots les plus utilisés dans la langue française).

$>pocketsphinx_continuous -hmm $hmm -lm $lm -dict $dic -logfn $log -infile $audiofile
"Bonjour comment ca va?"
result: au jour là (normal il n'y a pas tous les mots dans ce dictionnaire)
total: 11 secondes

11 secondes c'est mieux que 37 (dictionnaire complet). Si je me mets en mode écoute continue depuis le micro, après initialisation, ca tourne autour de 8 secondes.

C'est toujours trop long pour une reconnaissance de mot clé. Je pense que le modèle de langue complet est ce qui pose problème, mais je n'ai pas trouvé d'outils pour le générer à partir d'une liste de mots. Le seul que je connaisse est en ligne et pour l'anglais: http://www.speech.cs.cmu.edu/tools/lmtool-new.html

physicien commented 8 years ago

Pour ce qui est de la génération du language model, tu as plusieurs options :

While our system is tuned to process with French language, our tools can be used in other languages.

Pour ce qui est de la RP3, j'ai étudié depuis hier le côté hardware pour essayer de comprendre précisément où ça ralentit et pour évaluer sommairement si la puissance CPU nécessaire est disponible sur le marché en version nanocomputer. Tout d'abord, j'ai trouvé un benchmark où sont comparés les performances d'une RP2 et d'un ordinateur avec un processeur de 2GHz pour utiliser pocketsphinx. On remarque que la différence est assez importante entre les deux en terme de computation time. Le CPU n'expliquant pas tout, j'aimerais aussi mentionner le 1GB LPDDR2 (900 MHz) de la RP3 ainsi que la faible vitesse de lecture/écriture de la norme microSD. Ceci dit, j'ai peut-être trouvé une alternative à la RP3 , la ODROID-C2. J'hésite encore à m'en procurer une, mais ce serait dans l'absolu une piste de solution hardware. Je pense aussi qu'il est intéressant de s'interroger sur l'éloignement de la RP3 des specs minimales pour rouler pocketsphinx sans le problème du Input overrun, read calls are too rare (non-fatal).

Pour finir, en jouant un peu dans les settings de Jarvis sur ma RP3, je me suis demandé s'il est envisageable d'ajouter une 4e option au choix de STT engine, soit l'option de faire appel à un serveur pocketsphinx sur un PC de l'utilisateur. Je lance l'idée, car ça revient à utiliser un serveur comme celui de Google ou de Wit(Facebook), mais sans les problèmes de respect de la vie privée.

alexylem commented 8 years ago

Merci physicien pour tes précieux conseils. Je vais essayer de générer le language model & dic depuis corpus avec le lmtool et voir ce que ca donne. J'ai déjà prévu de rajouter un nouveau STT offline pour snowboy. Les tests et implémentation seront suivi dans #8 J'aime bien ton idée de faire appel à une autre instance de PocketSphinx sur un serveur à part, tu n'es pas le premier à le proposer, je viens de créer un nouveau ticket #9 en ton nom.

physicien commented 8 years ago

Comme on dit par chez moi, Y a pas d'quoi! Sinon, j'ai bien hâte de voir les développements et les prochaines updates. Snowboy semble intéressant pour le STT offline, tant qu'il permet d'appeler Jarvis facilement il me conviendra parfaitement.

Un serveur PocketSphinx est probablement le meilleur compromis que nous puissions faire, car tout en embarqué n'est pas encore possible, et pas besoin d'internet si ça reste dans la maison.

alexylem commented 8 years ago

Bon alors j'ai généré, depuis un corpus de 100 mots français, un dictionnaire et modèle de langue depuis cet outil en ligne. En utilisant le modèle acoustique français (qui fonctionne avec le dico et lm complets), j'obtiens les erreurs suivantes:

ERROR: "dict.c", line 195: Line 1: Phone 'AO' is mising in the acoustic model; word 'ALLER' ignored
ERROR: "dict.c", line 195: Line 2: Phone 'EY' is mising in the acoustic model; word 'ALORS' ignored
ERROR: "dict.c", line 195: Line 3: Phone 'OW' is mising in the acoustic model; word 'AU' ignored
ERROR: "dict.c", line 195: Line 4: Phone 'AO' is mising in the acoustic model; word 'AUSSI' ignored
...

Je pense que l'outil en ligne génère des phonèmes anglais qui ne sont pas connus dans le modèle acoustique français. J'ai regardé sur le site de LIUM, mais n'ai pas trouvé d'outils pour générer dictionnaire et modèle de langue en français.

D'ailleurs sur le site de PocketSphinx on trouve:

If your language is English and text is small it's sometimes more convenient to use web service to build it. [...] Then go to the page http://www.speech.cs.cmu.edu/tools/lmtool-new.html. Simply click on the “Browse…” button, select the corpus.txt file you created, then click “COMPILE KNOWLEDGE BASE”.

physicien commented 8 years ago

Je confirme que ce site ne génère que pour les phonèmes anglais selon la documentation de CMUSphinx

If your language is English and text is small it's sometimes more convenient to use web service to build it.

Autrement, il y a SRILM avec quelques infos sur le fonctionnement ici.

physicien commented 8 years ago

Je viens de voir quelque chose de possiblement intéressant ici.

You can prune the model afterwards to reduce the size of the model ngram -lm your.lm -prune 1e-8 -write-lm your-pruned.lm

alexylem commented 8 years ago

Oui j'ai vu, je suis en train de parcourir les instruction d'installation de SRILM... 😕

EDIT: j'ai trouvé ca, un peu plus digeste, et surtout récent (4 Juin 2016)

physicien commented 8 years ago

Et soudainement, mes yeux cessèrent de saigner :laughing:

physicien commented 8 years ago

Aujourd'hui j'ai essayé à peu près la même chose que ce que tu as fais hier, et j'arrive au même résultat. Donc aucun progrès de mon côté!

EDIT: au moins on est sûr de la reproductibilité des résultats!

alexylem commented 8 years ago

Je mets l'issue en low étant donné que l'alternative snowboy donne d'excellents résultats et est désormais le moteur de reconnaissance vocale recommandé pour le mot clé.

facturaenruta commented 7 years ago

Salut a tous, j'ai reussi faire marcher excellent, rapid et dinamiquement avec mes informations (des images et audio) pocketsphinx.js pour la Anglais. Maintenant je veux trouver le fichier pocketsphinx.js et CMUdict pour la langue francaise.

pouvez vous me aider avec un lien.

Merci... Wilfredo Víctor

wikijm commented 7 years ago

Hi @facturaenruta,

You can speak in english here, If you find that useful and easier ;-) Did you get any answer, or see that Snowboy seems to be a better alternative for hotword detection?

wikijm commented 7 years ago

Pas d'avancée sur le sujet pour le moment.

@alexylem Je clôture cette issue, mais l'ai intégré au projet Jarvis Core histoire que tu en garde une trace.