jarvis icon indicating copy to clipboard operation
jarvis copied to clipboard

Utilisation d'une instance de PocketSphinx sur serveur distant

Open alexylem opened this issue 8 years ago • 32 comments

Proposé par Physicien: 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 avatar Jun 23 '16 17:06 alexylem

C'est plutôt un détail que je veux apporter pour le moment, mais les modèles et dictionaires les plus à jour sont ceux directement accessible sur le site du LIUM. Dans précédemment, nous avons essayé avec les anciens modèles du LIUM de 62000 mots, alors que les nouveaux en contiennent environ 70000 mots. Tant qu'à utiliser un serveur avec un bon PC, autant avoir les meilleurs modèles disponibles!

physicien avatar Jun 23 '16 19:06 physicien

Ça doit être bon signe ça! capture d ecran - 2016-06-27 - 18 03 33

physicien avatar Jun 27 '16 22:06 physicien

C'est quoi exactement? un instance de pocketsphinx sur un autre serveur?

alexylem avatar Jun 27 '16 22:06 alexylem

C'est pocketsphinx sur Debian avec le français comme langue.

physicien avatar Jun 27 '16 22:06 physicien

ok et ca donne quoi niveau performances en reconnaissance continue? Ca serait bien que tu indiques les specs de la bécane à côté du résultat 😄

alexylem avatar Jun 27 '16 22:06 alexylem

Là je suis en train d'essayer de lui link mon micro de Webcam avec -adcdev plughw:0,0 -inmic yes et je dois simplement trouver comment. Pour les specs du PC, c'est certain que je vais mettre ça à côté!

physicien avatar Jun 27 '16 22:06 physicien

Ok bon déjà tu as la bonne commande, j'ai réussi à le faire marcher avec la même, voir #7

alexylem avatar Jun 27 '16 22:06 alexylem

Au pire je vais test avec un .wav vu que c'est ce qu'on va lui passer à distance de toute façon.

physicien avatar Jun 27 '16 22:06 physicien

J'ai envoyé un .wav et voici l'output. J'ai visiblement un setting qui n'est pas bon, je vais donc lire attentivement l'output! output.txt

physicien avatar Jun 27 '16 22:06 physicien

la traduction extraite de ton fichier:

000000000: the moon
141567 last
000000001: we are as a hand on

J'ai regardé la config il semble que tu n'ai pas de `-lm

-lextreedump    0       0
-lifter     0       0
-lm             
-lmctl              
-lmname     default     default

Commence par ca 😄

alexylem avatar Jun 27 '16 22:06 alexylem

J'ai utilisé un .lm.bin.

physicien avatar Jun 27 '16 22:06 physicien

Ok mais il n'est pas passé en paramètre car dans le header de config c'est vide. Essayes:

pocketsphinx_continuous -lm ton_language_model.lm.bin ...

alexylem avatar Jun 27 '16 22:06 alexylem

Voici le résultat... capture d ecran - 2016-06-27 - 18 54 59

physicien avatar Jun 27 '16 22:06 physicien

Ok, je crois que c'est la version Debian de PocketSphinx qui est outdated... Je vais essayer d'arranger ça.

physicien avatar Jun 27 '16 22:06 physicien

Bon, j'ai réussi à patenter quelque chose, mais il parle français. Il dit n'importe quoi, mais en français et très rapidement.

physicien avatar Jun 27 '16 23:06 physicien

Je pense commencer à me pencher la dessus, j'aimerai avoir une approche suffisamment générique. L'idée est de proposer un stt remote qui puisse convenir à une instance de PocketSphinx, mais aussi pourquoi pas Kaldi ou d'autre moteur de reconnaissance vocale sur machine distante. Ainsi cela couvrira l'implémentation de #25 .

L'appel sera une requête POST http, donc il faudra qu'un serveur web (apache, nginx, python...) tourne sur la machine distante. L'URL complète sera configurable (host/IP + path + variables). Le retour par contre devra être du json, on pourra aussi paramétrer l'attribut à lire.

remote stt settings:
  host_url: "http://192.168.1.10/pocketsphinxweb?action=recognize"
  attribute_name: "transcript"

request:
  curl -X POST "http://192.168.1.10/pocketsphinxweb?action=recognize" \
       -H "Content-Type: audio/wav; samplerate=16000" \
       --data-binary "@$audiofile"

response:
  {transcript:"ca marche", confidence:1234}

alexylem avatar Jul 30 '16 16:07 alexylem

Si je me souviens bien, la dernière fois que j'ai travaillé avec Kaldi, je pouvais lui donner un .wav et il essayait de l'écrire en anglais. J'en étais rendu à l'entraîner pour comprendre le français. L'entraînement en tant que tel n'est pas difficile à réaliser. Ce qui est un peu plus difficile, c'est la préparation des données.

En effet, afin de l'entraîner, il faut préparer de petits extraits audio ainsi que la retranscription de ce qui y est dit. Étant donné que nous voulons une grande variété de voix et un vocabulaire développé, les meilleurs données disponibles sont les livres audio de LibriVox. Cette méthode a déjà été appliqué pour l'anglais, donnant ainsi LibriSpeech.

La difficulté de la préparation des données réside dans la segmentation des fichiers audios et l'alignement du texte sur ces fichiers audio. Un article décrit la technique utilisée pour LibriSpeech.

physicien avatar Jul 30 '16 17:07 physicien

Ok @physicien , sinon un commentaire sur l'approche générique d'implémentation choisie? (voir mon post juste au dessus).

alexylem avatar Jul 30 '16 17:07 alexylem

@alexylem C'était globalement comme ça que je voyais l'implémentation de mon côté. Envoyer un .wav à transcrire et retourner la transcription. Je ne peux que donner mon appui :+1:

physicien avatar Jul 30 '16 17:07 physicien

Je viens de tomber sur un lien qui détaille globalement ce que nous voulons faire, avec des commentaires sur les difficultés rencontrées, les solutions trouvées et les performances globales.

physicien avatar Aug 04 '16 17:08 physicien

Super ca va nous aider. J'en ai profité pour laissé un commentaire sur leur site car ils ont "oublié" de mentionner le projet Jarvis 😄

alexylem avatar Aug 05 '16 19:08 alexylem

Je pense proposer dans un premier temps un "template" de STT de manière à faciliter la création de nouveau moteurs de reconnaissance vocale (ou connecteur comme ici) par la communauté.

alexylem avatar Sep 13 '16 18:09 alexylem

Salut,

Je bute sur l'installation de pocketsphinx_continuous sur Respeaker, mais je toute façon j'ai un doute sur le fait que ça tourne correctement. Donc la solution "serveur distant" me plait bien, avez vous avancé dessus ? Merci !

Oliv4945 avatar Apr 18 '17 21:04 Oliv4945

Non mais je peux fournir un template très rapidement. Tu aimerais faire tourner pocketsphinx sur un serveur distant? Pour la reconnaissance des commandes j'imagine? En français?

alexylem avatar Apr 19 '17 07:04 alexylem

@alexylem : tout juste ! Je suis entrain de regarder pour utiliser le script Python de détection de hotword fourni par Seeedstudio, mais je pense que la reconnaissance des commandes gagnerai à être faite sur une machine plus pêchue, même si Bing fonctionne bien pour l'instant

Oliv4945 avatar Apr 23 '17 10:04 Oliv4945

@Oliv4945 ok je te laisse t'occuper de la partie serveur et je m'occupe de l'intégration à Jarvis. Que proposes-tu pour la communication?

  • Serveur web (RestAPI)
  • SSH
  • Autre?

alexylem avatar Apr 23 '17 11:04 alexylem

Ce que tu décris ici me paraît plutôt bien, reste à voir d'un point de vue sécurité mais on peut s'en sortir avec une règle iptables. Du coup je peux faire le serveur, mais pas tout de suite, j'aimerai avancer l'application Android et la publier, puis faire fonctionner les hotword respeaker.

Oliv4945 avatar Apr 23 '17 16:04 Oliv4945

@Oliv4945 ok ça marche!

alexylem avatar Apr 23 '17 17:04 alexylem

Bonjour,

Peut-on envisager d'avoir PocketSphinx (ou autre) installé chez framasoft.org ? On pourrai avoir la puissance d'une grosse machine avec le respect de la vie privée, à voir avec eux évidement.

domotic-fr avatar Nov 15 '17 13:11 domotic-fr

à voir avec eux évidement.

Bonsoir @domotic-29 , je pense que tu as effectivement trouvé le premier pas à faire :)

Oliv4945 avatar Nov 15 '17 17:11 Oliv4945