Reconnaissance vocale et de la parole
Partie 1 : les bases
je vais coller à la
doc et tenter d'aller un peu plus loin
Cela n'est qu'une partie car le travail supplémentaire consiste à adapter les fichiers de dictionnaires et de grammaires pour améliorer PocketSphinx... mais c'est pas gagné !
synopsis
on va utiliser PocketSphinx pour la première partie. L'idée est d'arriver à quelque chose de fonctionnel (comme la doc) et d'aller un petit peu plus loin (programmation de la première couche de compréhension).
Il reste encore des améliorations à faire car, par exemple, si on lance un processus, la reconnaissance est accaparée et, donc, impossible de fermer ce processus avec une commande vocale... mais cela viendra.
Installations
Créez un dossier bin dans votre dossier personnel pour y mettre les scripts suivants :
mkdir $HOME/bin
maintenant ouvrez un terminal (ctrl + alt + t)
copiez d'un bloc ces lignes
pour faire l'installation des logiciels, des dictionnaires et fichiers accessoires.
ou passer par un fichier script :
#!/bin/bash
# installation de pocketsphinx
# Depuis la doc Ubuntu
# https://doc.ubuntu-fr.org/pocketsphinx
sudo apt-get install python-pocketsphinx libpocketsphinx1 gstreamer0.10-pocketsphinx python-pyaudio
wget -O lium_french_f0.tar.gz http://sourceforge.net/projects/cmusphinx/files/Acoustic%20and%20Language%20Models/Archive/French%20F0%20Broadcast%20News%20Acoustic%20Model/lium_french_f0.tar.gz/download
tar -xvzf lium_french_f0.tar.gz
cd lium_french_f0/
sudo mkdir -p $(pkg-config --variable=modeldir pocketsphinx)/hmm/fr_FR/french_f0
sudo mv * $(pkg-config --variable=modeldir pocketsphinx)/hmm/fr_FR/french_f0
wget -O french3g62K.lm.dmp http://sourceforge.net/projects/cmusphinx/files/Acoustic%20and%20Language%20Models/French%20Language%20Model/french3g62K.lm.dmp/download
sudo mkdir -p $(pkg-config --variable=modeldir pocketsphinx)/lm/fr_FR/
sudo mv french3g62K.lm.dmp $(pkg-config --variable=modeldir pocketsphinx)/lm/fr_FR/
wget -O frenchWords62K.dic http://sourceforge.net/projects/cmusphinx/files/Acoustic%20and%20Language%20Models/French%20Language%20Model/frenchWords62K.dic/download
sudo mv frenchWords62K.dic $(pkg-config --variable=modeldir pocketsphinx)/lm/fr_FR/
wget -O lium_french_f2.tar.gz http://sourceforge.net/projects/cmusphinx/files/Acoustic%20and%20Language%20Models/Archive/French%20F2%20Telephone%20Acoustic%20Model/lium_french_f2.tar.gz/download
echo "# Pour tester exécuter cette ligne dans une console
pocketsphinx_continuous -dict /usr/share/pocketsphinx/model/FR/frenchWords62K.dic -hmm /usr/share/pocketsphinx/model/FR/ -lm /usr/share/pocketsphinx/model/FR/french3g62K.lm.dmp
"
Les Modules
1. Ecoute
2. Parser-ecoute
3. Traite-parseur
4. Parse_dico
On va créer des fichiers et les rendre exécutable puis utiliser un script pour lancer "ecoute" dans un terminal et "parser-ecoute" dans un autre.
1. Ecoute
c'est pocketsphinx et sa configuration de base (dictionnaire plein… trop même !)
il en ressort un fichier texte que l'on va lire au fur et à mesure qu'il sera écrit
2. Parser-ecoute
On lit ligne par ligne et en continu le fichier issu de la reconnaissance de Ecoute
3. Traite-parseur
le premier traitement des instructions
ici seront les commandes communes et les changements de mode à ajouter plus tard.
4. Parse_dico
deuxième niveau du traitement si le mot ou la phrase n’appartiennent pas à traite-parseur, on va chercher plus loin en fonction du mode de recherche
Les scripts en bash
1. Ecoute
créez le fichier : ecoute
(pas de majuscule ni d'accent ni d'espace ou d’extension)
> $HOME/bin/ecoute
chmod +x $HOME/bin/ecoute
puis éditez le (avec l'éditeur de votre choix ; ici gedit) :
gedit $HOME/bin/ecoute
#!/bin/bash
#*************************************#
#~ NOM : ecoute
#~ FONCTION :
#~ VERSION="alpha"
#~ NOTES DE VERSIONS
#
#*************************************#
echo "initialisation"
ps="$(pkg-config --variable=modeldir pocketsphinx)"
ledict="$ps/lm/fr_FR/frenchWords62K.dic"
#~ lagramm="$ps/lm/fr_FR/grammaire.gram"
lehmm="$ps/hmm/fr_FR/french_f0"
lelm="$ps/lm/fr_FR/french3g62K.lm.dmp"
lefichier="reconnaissances.txt"
echo "début de la reconnaissance... patientez"
echo "Pour arrêter le serveur faites Ctrl + C dans ce terminal"
pocketsphinx_continuous -inmic yes -agc noise -hmm $lehmm -lm $lelm -dict $ledict 2>/dev/null > $lefichier
echo "serveur arrêté"
exit 0
2. Parser-ecoute
créez le fichier : parser-ecoute
(pas de majuscule ni d'accent ni d'espace ou d’extension)
> $HOME/bin/parser-ecoute
chmod +x $HOME/bin/parser-ecoute
puis éditez le (avec l'éditeur de votre choix ; ici gedit) :
gedit $HOME/bin/parser-ecoute
#!/bin/bash
#*************************************#
# NOM :
# FONCTION :
# VERSION="alpha"
# NOTES DE VERSIONS
#
#*************************************#
# echo "parser-ecoute -----------------"
file="reconnaissances.txt"
tail -f -n 1 $file | while read line;do
./traite-parseur "$line"
done
exit 0
3. Traite-parseur
créez le fichier : traite-parseur
(pas de majuscule ni d'accent ni d'espace ou d’extension)
> $HOME/bin/traite-parseur
chmod +x $HOME/bin/traite-parseur
puis éditez le (avec l'éditeur de votre choix ; ici gedit) :
gedit $HOME/bin/traite-parseur
#!/bin/bash
#*************************************#
# NOM :
# FONCTION :
# VERSION="alpha"
# NOTES DE VERSIONS
#
#*************************************#
# echo "traite-parseur -----------------"
une_phrase="$1"
# echo "
# *********************************
# *********** MODE TEST ***********
# *********************************"
# une_phrase="000000001: radio"
#* echo "je test l'entrée : "
#* echo "$une_phrase"
# d'abord on traite les commandes de retour de PocketSphinx
case "$une_phrase" in
"READY....")
echo "Prêt..."
exit
;;
"Listening...")
echo "..." #"j'écoute !!!"
exit
;;
"Stopped listening, please wait...")
echo "..." #"attends !!!"
exit
;;
*)
# retire tout ce qu'il y a avant le ": "
la_phrase="${une_phrase##*: }"
# echo "$la_phrase"
esac
# ici on va intercepter les phrases ou mots les plus importants ou répétitifs
case "$la_phrase" in
"au repos")
echo "Tranquille"
;;
"au boulot")
echo "vas y, je te rejoint !"
;;
"quelle heure est -il")
# "heure")
echo "je donne l'heure"
echo $(date)
exit 1
;;
*)
echo "dico spécifique $la_phrase"
./parse_dico "test" $la_phrase
# retour=parse_dico "test" $la_phrase
esac
exit
4. Parse_dico
créez le fichier : parse_dico
(pas de majuscule ni d'accent ni d'espace ou d’extension)
> $HOME/bin/parse_dico
chmod +x $HOME/bin/parse_dico
puis éditez le (avec l'éditeur de votre choix ; ici gedit) :
gedit $HOME/bin/parse_dico
#!/bin/bash
#*************************************#
# NOM :
# FONCTION :
# VERSION="alpha"
# NOTES DE VERSIONS
#
#*************************************#
# echo "parse_dico -----------------"
function mode_test {
# zenity --info --text="mode test"
case "$1" in
"bonjour" )
echo "bonjour $USER"
return 1
exit
;;
"musique" )
vlc &
return 1
exit
;;
"fermé musique" )
killall vlc
return 1
exit
;;
"courrier" )
thunderbird &
return 1
exit
;;
"fermé courrier" )
killall thunderbird
return 1
exit
;;
"internet" )
firefox &
return 1
exit
;;
"fermé internet" )
killall firefox
return 1
exit
;;
"fichier" )
nautilus &
return 1
exit
;;
"fermé fichier" )
killall nautilus
return 1
exit
;;
"radio" )
vlc "http://streaming.radio.funradio.fr/rtl2-1-44-128" &
return 1
exit
;;
*) :
return 0
exit
;;
esac
}
exit 0
maintenant un lanceur pour mettre tout cela en marche :
> $HOME/bin/rdlp
chmod +x $HOME/bin/rdlp
puis éditez le (avec l'éditeur de votre choix ; ici gedit) :
gedit $HOME/bin/rdlp
#!/bin/bash
# lance "ecoute" dans un terminal et "parser-ecoute" dans un autre.
LETERMINAL="xterm -e"
$LETERMINAL "./ecoute;read" &
$LETERMINAL "./parser-ecoute;read" &
exit 0
maintenant, testons cette installation :
faites des réglages de votre entrée de micro dans les propriétés système, allez dans audio puis entrée
et vérifiez que le vue mêtre monte lorque vous parlez et soit le plus bas possible lorsque vous êtes dans le calme...
puis dans un terminal (ctrl + alt +t), faites
cd $HOME/bin
./rdlp
écartez les deux terminal et parlez...
"
bonjour" est un bon début ! 😉
pour aller plus loin, je reprend le
post de emile 197
NB : juste une première ébauche d'un todo pour créer des fichiers dic et gram
j'ai mis en
bleu les passages qui demandent à être clarifiés
emile 197 a écrit
on
fait un fichier txt de mots un tour sur Sphinx Knowledge Base Tool -- VERSION 3
c'est juste pour avoir un schéma si vous voulez utiliser le fichier .lm
pour le .dic vous
remplacez les mots par ce que vous recherchez dans les fichiers .dic téléchargés
dans .lm
même punition
si vous voulez remplacer le . lm par une grammaire
faite un fichier .gram
#JSGF V1.0;
grammar command;
<item> = salon ;
<mots> = lalumière |allume | la ;
<keyphrase> = dis emma ;
public <greet> = <item> | <mots> | <keyphrase> ;
puis
pocketsphinx_continuous -dict emmaFR.dic -hmm /usr/local/share/pocketsphi
nx/model/fr_FR/french_f0/ -jsgf emmaFR.gram -inmic yes
mot ou la phrase choisie et ignore tout le reste
faire un fichier .list
ici le fichier est emmaFR.list
emma /1e-8/
réglage autoriser de /1e-1/ a /1e-50
puis
pocketsphinx_continuous -dict emmaFR.dic -hmm /usr/local/share/pocketsphi
nx/model/fr_FR/french_f0/ -kws emmaFR.list -inmic yes
pour mémo
La liaison implique la prononciation d’un phonème de liaison entre deux mots.
Pour donner un exemple : les mots “les oiseaux” se prononcent séparément “l e” et “w a
z o” (en notation API), alors qu’ensemble ils se prononcent “l e z w a z o”