Closed alexylem closed 7 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
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
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.
Merci physicien, malheureusement c'est avec dictionnaire anglais, exécuté depuis un fichier wav d'input, et leur résultat est à... 90 secs... :)
Je progresse, j'arrive à reconnaitre directement depuis le micro avec:
pocketsphinx_continuous -adcdev plughw:1,0 -inmic yes
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!
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.
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...
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.
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)
.
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.
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)
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:
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
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.
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.
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.
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”.
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
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)
Et soudainement, mes yeux cessèrent de saigner :laughing:
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!
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é.
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
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?
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.
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.