#1 Le 28/01/2012, à 16:36
- Compte supprimé
[Script] reconnaissance vocale avec google
Voilà pas mal de temps que le projet avait été lancé (2012) mais je n'avais pas les compétences et le temps pour amener le projet là où je le désirais. J'ai donc repris tout le projet à 0 afin de fournir un système beaucoup plus souple et rapide de prise en main.
Principe
google2ubuntu a pour but de fournir un utilitaire qui va utiliser la reconnaissance de Google pour transcrire ce que vous dîtes en texte. google2ubuntu acquiert donc votre jolie voix pendant 5 secondes et l'envoie à Google. Celui-ci retourne alors le résultat et google2ubuntu trouve la commande que vous avez associée à ces quelques mots.
Comparer à la précédente version, la gestion des actions possibles est beaucoup plus simple. Plutôt que de devoir gérer des actions "codées", c'est à dire programmer certaines actions par défaut. google2ubuntu laisse la possibilité à l'utilisateur de faire ce qu'il veut et de choisir les commande qu'il veux exécuter. Ainsi, l'utilisateur va créer un "dictionnaire" liant des mots à des actions.
Installation
Le projet est disponible sur Github.
Il est également dispoonible sur Launchpad
Pour installer le projet, il suffit de taper ces quelques lignes de commande:
sudo add-apt-repository ppa:benoitfra/google2ubuntu
sudo apt-get update
sudo apt-get install google2ubuntu
Fonctionnement de la reconnaissance
Le fonctionnement de google2ubuntu est très simple, on lance l'application, on parle quand la notification nous le dit et on attend que l'action s'exécute. Le tout est vraiment plaisant lorsque l'on associe un raccourci à l'application.
Structure des commandes
Une commande est une ligne de ce type:
[O/o]uvre*documents=xdg-open ~/Documents
La première partie est la "phrase clé", les termes entre [] permettent de prendre en compte à la fois les majuscules et minuscules en début de mot. les * permettent de remplacer les espaces et mots inutiles. La seconde partie de la ligne est la commande à exécuter.
Afin de gérer au mieux l'ensemble des commandes entrées par l'utilisateur, un gestionnaire graphique a été écrit en Python + Gtk3. Celui-ci se veut aussi très simple et fonctionnel. Par défaut, un fichier d'action est inclut et permet à l'utilisateur de se familiariser avec les commandes et l'interface.
L'utilisateur peut en cliquant sur la petite flèche ajouter différents types de commandes via un menu.
Des commandes externes
Ce sont des commandes que l'utilisateur ajoute dans le gui ci dessus. On voit par exemple, la demande pour ouvrir la messagerie. Toute commande peut être ajoutée.
Pour ajouter une commande basique, il suffit de cliquer sur "ajouter" et remplir la ligne qui apparait en remplaçant <votre clé> par le texte que vous allez prononcer et <votre commande> par la commande qui sera appelée.
Des commandes internes
Les commandes internes sont des commandes qui font appel à des fonctions codées au sein de google2ubuntu le but étant d'en avoir le moins possible. Pour l'instant, il y en a que 2, obtenir l'heure et la batterie. Voici un exemple d'appel à la commande interne permettant de dire l'heure:
[Q/q]uelle*heure=interne/heure
Ainsi, dans le gui, quand la ligne apparaît, l'utilisateur doit modifier <phrase clé> par la phrase qu'il va proconcer pour demander l'heure et interne/<mot> en interne/heure. Pour l'instant, on peut appeler les commandes :
interne/heure
interne/batterie
Des modules
Les modules sont des scripts qui vont recevoir une partie du texte que vous prononcé en argument. Tout script shell, python,... peut être ajouté. Un module est aussi constitué d'un fichier nommé "args" permettant de distinguer l'appel à un module des paramètres à lui envoyer. Il permet également de savoir si l'on doit remplacer les espaces en + dans le texte à envoyer au module.
Lors de l'ajout un fenêtre de sélection s'ouvre et il suffit de cliquer sur l'exécutable du module
Le programme se charge alors de vérifier si le fichier "args" existe. Si oui, il copie le dossier du module dans :
~/.config/google2ubuntu/modules
Si non, il vous accompagne pour créer ce fichier et le place au bon endroit.
Ensuite, une nouvelle ligne apparait dans les commandes, il suffit de modifier la phrase clé.
Vidéo
Dernière modification par benoitfra (Le 28/01/2014, à 17:54)
#2 Le 28/01/2012, à 16:47
- pingouinux
Re : [Script] reconnaissance vocale avec google
Bonjour,
Essayer en remplaçant
echo $Text
par
tr -d '"' <<<"$Text"
Hors ligne
#3 Le 28/01/2012, à 16:54
- Compte supprimé
Re : [Script] reconnaissance vocale avec google
Waoou
Rapide, efficace bravo pingouinux et Merci
RÉSOLU
Dernière modification par benoitfra (Le 28/01/2012, à 16:55)
#4 Le 28/01/2012, à 17:55
- pingouinux
Re : [Script] reconnaissance vocale avec google
Il y a peut-être moyen de simplifier. Quel est le résultat de cette commande ?
wget -q -U "Mozilla/5.0" --post-file fichier.flac --header="Content-Type: audio/x-flac; rate=16000" -O - "http://www.google.com/speech-api/v1/recognize?lang=fr&client=chromium"
Hors ligne
#5 Le 28/01/2012, à 17:58
- Compte supprimé
Re : [Script] reconnaissance vocale avec google
Voilà le résultat quand je prononce "bonjour" :
{"status":0,"id":"cf3f9cc6062a1b406ff8a29539d8ba6d-1","hypotheses":[{"utterance":"bonjour","confidence":0.37993312}]}
#6 Le 28/01/2012, à 18:13
- pingouinux
Re : [Script] reconnaissance vocale avec google
Ce n'est pas très lisible, mais on doit pouvoir remplacer ces deux lignes :
Text=`wget -q -U "Mozilla/5.0" --post-file fichier.flac --header="Content-Type: audio/x-flac; rate=16000" -O - "http://www.google.com/speech-api/v1/recognize?lang=fr&client=chromium" | cut -f2 -d"[" | cut -f1 -d"," | cut -f2 -d":"`;
echo $Text
par celle-ci :
wget -q -U "Mozilla/5.0" --post-file fichier.flac --header="Content-Type: audio/x-flac; rate=16000" -O - "http://www.google.com/speech-api/v1/recognize?lang=fr&client=chromium" | sed 's/^.*\[{.*:"\(.*\)",".*$/\1/'
Hors ligne
#7 Le 28/01/2012, à 18:59
- Compte supprimé
Re : [Script] reconnaissance vocale avec google
Retour d'expérience...c'est plus compact et ça marche nikel, je dis "bonjour" pour tester, le script retourne : bonjour
voilà ce que ça donne:
#!/bin/bash
## Variable ##
HEURE=`date '+%H'`
MINUTE=`date '+%M'`
BATTERIE=`acpi -b | grep "Battery 0" | awk '{ print $4}' |cut -f1 -d% `_
## Acquisition ##
rec -d tmp.flac & zenity --info --title="Enregistrement" --text="Cliquez sur valider pour arreter" ;
killall rec;
sox tmp.flac -r 16000 fichier.flac
#Text=`wget -q -U "Mozilla/5.0" --post-file fichier.flac --header="Content-Type: audio/x-flac; rate=16000" -O - "http://#www.google.com/speech-api/v1/recognize?lang=fr&client=chromium"` ;
Text=`wget -q -U "Mozilla/5.0" --post-file fichier.flac --header="Content-Type: audio/x-flac; rate=16000" -O - "http://www.google.com/speech-api/v1/recognize?lang=fr&client=chromium" | sed 's/^.*\[{.*:"\(.*\)",".*$/\1/'`
case $Text in
heure ) pico2wave -l fr-FR -w test.wav "il est $HEURE heure et $MINUTE minute"; aplay test.wav;;
batterie ) if [[ "$BATTERIE" != "_" ]]; then
{
pico2wave -l fr-FR -w test.wav "il reste $BATTERIE% de batterie"; aplay test.wav
}
else
{
pico2wave -l fr-FR -w test.wav "L'ordinateur est branché au secteur"; aplay test.wav
}
fi;;
esac;
## efface ##
rm fichier.flac
rm tmp.flac
rm test.wav
exit
Naviguer dans nautilus:
#!/bin/bash
## acquiere qq info ##
LISTED=`ls -d */ | cut -f1 -d"/"`
LISTEF=`ls -F | grep -v '/$'`
## acuiere la voix ##
rec -d tmp.flac & zenity --info --title="Acquisition" --text="Acquisition" --timeout=2 ;
killall rec;
sox tmp.flac -r 16000 fichier.flac
ACTION=`wget -q -U "Mozilla/5.0" --post-file fichier.flac --header="Content-Type: audio/x-flac; rate=16000" -O - "http://www.google.com/speech-api/v1/recognize?lang=fr&client=chromium" | sed 's/^.*\[{.*:"\(.*\)",".*$/\1/'`
sleep 2 ;
## ouvrir rapidement un fichier ##
for fichier in $LISTEF ;
do
{
if [[ "$fichier" = "$ACTION" ]]; then
{
xdotool type "$fichier";
xdotool key "Return";
rm tmp.flac
rm fichier.flac
exit;
}
fi
}
done
## ouvrir un dossier ##
for dossier in $LISTED ;
do
{
if [[ "$dossier" = "$ACTION" ]]; then
{
xdotool type "$dossier";
xdotool key "Return";
xdotool key "Alt+S";
}
fi
}
done
## Naviguer ##
case "$ACTION" in
haut | goo ) xdotool key "Up"; xdotool key "Alt+s" ;;
bas | bah ) xdotool key "Down"; xdotool key "Alt+s" ;;
droite ) xdotool key "Right"; xdotool key "Alt+s" ;;
gauche ) xdotool key "Left"; xdotool key "Alt+s";;
entrée ) xdotool key "Return"; xdotool key "Alt+s";;
tabulation ) xdotool key "Tab"; xdotool key "Alt+s" ;;
* ) rm tmp.flac
rm fichier.flac
exit ;;
esac;
## Nettoyage et fermeture ##
rm tmp.flac
rm fichier.flac
exit
Dernière modification par benoitfra (Le 29/01/2012, à 11:50)
#8 Le 30/01/2012, à 20:46
- Compte supprimé
Re : [Script] reconnaissance vocale avec google
J'ai fait un système de reconnaissance vocale pour Ubuntu, mais pour les curieux qui viennent lire ce poste et qui peut être seront intéressés, je tiens à les prévenir celle ci utilise la reconnaissance vocale de Google, elle nécessite donc une connexion internet.
Diverses options sont disponibles et j'ai essayé d'expliquer au mieux l'INSTALL De plus, il est très facile de rajouter des options.
Si un éventuel testeur a des idées pour rendre l’exécution plus rapide ou des idées de nouvelles fonctionnalités... je suis à l'écoute.
Voici le lien de téléchargement:
GoogleV2T
Dernière modification par benoitfra (Le 31/01/2012, à 21:24)
#9 Le 31/01/2012, à 00:57
- n3o51
Re : [Script] reconnaissance vocale avec google
Bonsoir compiz est-il indispensable
Ensuite comment cela fonctionne , il faut appuyer sur un raccourci pour pouvoir ensuite donner la commande vocale ?
Pourrais tu preciser un peut s'il te plait
Quelles sont les actions possible , vocalement je parle
Par avance merci
Dernière modification par n3o51 (Le 31/01/2012, à 02:10)
Welcome to the real world
________________________________
Hors ligne
#10 Le 31/01/2012, à 12:19
- Compte supprimé
Re : [Script] reconnaissance vocale avec google
SALUT
bon, j'ai tout modifié normalement il n'y a plus besoin de Compiz.
Pour voir ce que l'on peut faire avec ces scripts tu peux regarder dans le READ-ME.
GoogleV2T
DEPENDANCES:
xdotool
yad
sox
READ-ME:
Ces scripts ont pour but de permettre au utilisateur disposant d'une connexion internet ;ce qui de nos jours est de plus en plus aisé ; d'accéder à un système de reconnaissance vocale.
Le système repose entièrement sur l'excellente api de reconnaissance vocale dévellopée par Google et accéssible depuis n'importe quel script bash.
Le système est constitué de cinq/six scripts shell qui permettent d'éxécuter différentes actions sur l'ordinateur.
les actions possibles sont :
- la prise de note rapide (numéro de téléphone, rendez-vous)
dire => "note", une fenêtre yad s'ouvre cliquer sur le bouton pour stopper la prise de note
- le mouvement dans les dossiers
dire => haut, bas, gauche, droite, entrée, tabulation (j'ai rajouté des variantes pour les mots mals reconnus)
- l'ouverture de fichier et autre
dire => "entrée" (j'essaye de voir comment appeler directement un fichier)
- naviguer entre les différents panneau via tabulation
dire => "tabulation"
- gestion des fenêtre (Maximiser/Fermer ect...)
dire => "maximiser | minimiser | fermer | redimensionner | monter | descendre" ( monter/descendre = scroll up/down)
- lancement direct d'une application via dictionnaire d'application
dire => "internet | éditeur de texte" (on peut en rajouter d'autre facilement)
- la gestion du redémarrage et de l'extinction du pc.
dire => "éteindre | redémarrer"
- lecture de certains paramètres systèmes comme l'heure ou la batterie
dire => "batterie | heure"
- support de la connextion internet avec deux optiques en priorité :
- les emails via gmail
- la météo
- (peut-être) les actus
dire => "message | météo"
TO DO :
- la possibilité de séléctionner un ou plusieur éléments dans un dossier
- l'appel direct d'un éléments d'un dossier
- l'accès au menu
- mettre en pause le script
HOW-TO INSTALL:
Commencer par rendre éxécutable le script INSTALL. pour cela taper :
cd $HOME/"répertoire de téléchargement"/ # ici répertoire de téléchargement est le nom du dossier ou se trouve les scripts
chmod +x INSTALL.sh
Pour lancer la reconnaissance vocale, double cliquer sur système.sh dans $HOME/.gnome2/nautilus-scripts/GoogleV2T/
Afin de rendre cela plus facile ou plus accessible, créer un raccourci sur le bureau pour lancer système.sh
UTILISATION
lancer système.sh et parler quand une notification apparait vous disant "parler maintenant"
dite "quitter" pour quitter le script
Je cherche un moyen de mettre le script en pause, car pour le moment il tourne en boucle
il ne cèsse de se rappeler et vous demande une nouvelle commande.
Dernière modification par benoitfra (Le 31/01/2012, à 21:23)
#11 Le 31/01/2012, à 12:40
- n3o51
Re : [Script] reconnaissance vocale avec google
merci beaucoup je vais essayer cela pour la boite mail il faut dire mail ?
Ensuite je vient de lancer install et j'ai
./INSTALL.sh: line 15: Erreur de syntaxe dans une expression conditionnelle
./INSTALL.sh: line 15: Erreur de syntaxe près de « ] »
./INSTALL.sh: line 15: `[[ -z $( which xdotool ) ] && DEP="${DEP}xdotool "'
donc faut modifier la ligne 15 en
[[ -z $( which xdotool ) ]] && DEP="${DEP}xdotool"
maintenant j'ai
acquisition des droits d'éxécution
copie des scripts dans le dossier de script
cp: impossible de créer le fichier standard «~/.gnome2/nautilus-scripts/GoogleV2T/»: Aucun fichier ou dossier de ce type
cp: impossible de créer le fichier standard «~/.gnome2/nautilus-scripts/GoogleV2T/»: Aucun fichier ou dossier de ce type
cp: impossible de créer le fichier standard «~/.gnome2/nautilus-scripts/GoogleV2T/»: Aucun fichier ou dossier de ce type
cp: impossible de créer le fichier standard «~/.gnome2/nautilus-scripts/GoogleV2T/»: Aucun fichier ou dossier de ce type
cp: impossible de créer le fichier standard «~/.gnome2/nautilus-scripts/GoogleV2T/»: Aucun fichier ou dossier de ce type
cp: impossible de créer le fichier standard «~/.gnome2/nautilus-scripts/GoogleV2T/»: Aucun fichier ou dossier de ce type
cp: impossible de créer le fichier standard «~/.gnome2/nautilus-scripts/GoogleV2T/»: Aucun fichier ou dossier de ce type
cp: impossible de créer le fichier standard «~/.gnome2/nautilus-scripts/GoogleV2T/»: Aucun fichier ou dossier de ce type
cp: impossible de créer le fichier standard «~/.gnome2/nautilus-scripts/GoogleV2T/»: Aucun fichier ou dossier de ce type
cp: impossible de créer le fichier standard «~/.gnome2/nautilus-scripts/GoogleV2T/»: Aucun fichier ou dossier de ce type
en plus visiblement il devrait aussi être dans un dossier vocale car quand je lance système a la main il donne en retour
line 14: /home/n3o-chacha/.gnome2/nautilus-scripts/vocale/système.sh: Aucun fichier ou dossier de ce type
ensuite si je lance internet sans passer par système directement dans le terminal il ne se lance pas.
Il doit avoir besoin du dossier vocale et aussi d'un fichier vocale/commande.txt car il s'arrette la
Dernière modification par n3o51 (Le 31/01/2012, à 13:06)
Welcome to the real world
________________________________
Hors ligne
#12 Le 31/01/2012, à 18:51
- Compte supprimé
Re : [Script] reconnaissance vocale avec google
Merci à toi pour le problème avec xdotool.
J'ai rajouté une dépendance curl (nécessaire pour accéder à Gmail, pour connaitre le nombre de messages reçus)
Il n'y a pas besoin de dossier "vocale", c'était le dossier d'origine sur mon pc.
Ensuite, le problème de copie est dû au symbole ~, je l'ai remplacé par $HOME.
Il ne faut pas lancer directement internet.sh, il faut d'abord lancer système.sh.
En gros, système.sh est un aiguilleur. il appel racine.sh qui acquière votre voix et le transforme via google en texte, lequel est enregistré dans commande.txt (fichier crée au moment de l'enregistrement, il ne manque pas). Ensuite, système.sh lit la commande que vous avez dite et ouvre le bon script ie internet.sh move.sh ...
Voici un nouveau lien: GoogleV2T
j'ai rajouté une fonction pause, qui affiche une notification dans la zone de notification. Cliquer sur l'icone afin de relancer la reconnaissance vocale. À oui pour lancer la pause, il suffit de dire "pause"
EDIT: j'ai oublié une dépendance, svox-pico, je le rajoute ou pas ?
moi je l'utilise pour me notifier le nombre de message ou la météo en anglais (j'ai pas trouvé de site en français)
Si je dois l'enlever, il faut que je modifie le script internet.sh...car pour l'instant si tu dis "message" que tu entre ton CODE et ton identifiant gmail, tu n'auras rien en retour
Dernière modification par benoitfra (Le 31/01/2012, à 21:22)
#13 Le 31/01/2012, à 19:49
- n3o51
Re : [Script] reconnaissance vocale avec google
Oui pour la dependance tous cela ne sera pas pour moi.Je vais tester la derniere version pour les emails y a ce script python qui peut etre pas mal
#!/usr/bin/env python
# -*- coding: utf-8 -*-
###############################################################################
# conkyEmail.py is a simple python script to gather
# details of email inboxes use in conky.
#
# Author: Kaivalagi
# Created: 16/05/2008
#
#Modified:
# 25/08/2008 Switched to using "UNSEEN" IMAP search filter instead of "RECENT"
# 25/08/2008 Added mailinfo feature for both POP and IMAP, details of the from address and subject are output if requested, option ignored in template mode!
# 25/08/2008 Connection timeouts are valid in the template now
# 26/08/2008 Tidied up mailinfo output, removed trailing email address from !from" and put in numbers
# 27/08/2008 Updated regex for date stripping to handle unratified email data (thanks yahoo)
# 29/08/2008 Added header decoding for sender and subject, to handle multiple character sets used
# 02/09/2008 Updated regex to use groups now to pick out the date from the recieved date string, should cope with all timezone data in mail message (+0100 or GMT)
# 03/09/2008 Updated error and info handling and logging
# 04/09/2008 Fixed bug with template based output
# 04/09/2008 Added --version option to output version of script and exit
# 02/10/2008 Updated script to use new template methods from conkyForecast
# 02/10/2008 Updated script to now use "[" and "]" as template brackets rather than "{" and "}" so that the execp/execpi conky command can be used, this enables the use of $font, $color options in the template which conky will then make adjustments for in the output!
# 02/10/2008 Added mailinfo option to template functionality
# 04/10/2008 Updated help for template option
# 20/10/2008 Updated date regex to cope better with message date text -> date variable conversion, will mean sorting is correct now
# 25/10/2008 Changed imap fetch to use '(BODY.PEEK[HEADER])' option rather than '(RFC822)' in an attempt to stop marking items as read
# 28/10/2008 Added folder option for imap emails, so a folder can be specified, if not set the default "Inbox" is used.
# 03/11/2008 Updated code to cope with varied message date formats, no one seems to follow the rfcs!
# 10/11/2008 Added --errorlog and --infolog options to log data to a file
# 24/11/2008 Updated to convert mailinfo and connectiontimeout to correct datatype to stop strange behaviour
# 02/01/2009 Fixed email sort to be reversed so newest is first
# 14/01/2009 Use default values for message date/subject/sender if nothing can be obtained from the email headers, there should always be a date value and the sort should work regardless of the email date format...
# 01/03/2009 Added --maxwidth option to wrap text to set widths, and --nowrap to only output one line of mailinfo
# 16/03/2008 Added --port option to use alternative port numbers other than the defaults
# 29/03/2009 Added traceback calls in error handling to get more info and updated sort method to handle no recvdate
# 18/05/2009 Updated to expand ~ based template paths
# 27/06/2009 Updated to make safe the output, replacing "${exec" text with "$e!noexec!", to stop unwanted conky execution
from datetime import datetime
from email.header import decode_header
from optparse import OptionParser
import sys
import poplib
import imaplib
import socket
import re
import textwrap
import traceback
import codecs
import os
class CommandLineParser:
parser = None
def __init__(self):
self.parser = OptionParser()
self.parser.add_option("-m","--servertype", dest="servertype", default="POP", type="string", metavar="SERVERTYPE", help=u"servertype to check [default: %default] The server type options are POP or IMAP")
self.parser.add_option("-s","--servername", dest="servername", default="pop.mail.yahoo.co.uk", type="string", metavar="SERVERNAME", help=u"server name to access [default: %default] The server name should be either a domain name or ip address")
self.parser.add_option("-o","--port",dest="port", type="int", metavar="NUMBER", help=u"Define an alternative port number to use other than the default for the protocol/ssl")
self.parser.add_option("-f","--folder",dest="folder", type="string", metavar="FOLDER", default="Inbox", help=u"[default: %default] IMAP folder to check, not applicable for POP mail checks")
self.parser.add_option("-e","--ssl", dest="ssl", default=False, action="store_true", help=u"Use an SSL based connection.")
self.parser.add_option("-u","--username",dest="username", type="string", metavar="USERNAME", help=u"username to login with")
self.parser.add_option("-p","--password",dest="password", type="string", metavar="PASSWORD", help=u"Password to login with")
self.parser.add_option("-t","--template",dest="template", type="string", metavar="FILE", help=u"define a template file to generate output in one call. A displayable item in the file is in the form [--servertype=IMAP --ssl --servername=imap.gmail.com --folder=Inbox --username=joebloggs --password=letmein, --connectiontimeout=10]. Note that the short forms of the options are not currently supported! None of these options are applicable at command line when used in templates.")
self.parser.add_option("-i","--mailinfo", dest="mailinfo", type="int", default=0, metavar="NUMBER", help=u"[default: %default] The number of newest emails to output 'from' and 'subject' information for. Not applicable at command line when using templates.")
self.parser.add_option("-w","--maxwidth",dest="maxwidth", default=80, type="int", metavar="NUMBER", help=u"[default: %default] Define the number of characters to output per line")
self.parser.add_option("-l","--linelimit", dest="linelimit", default=0, type="int", metavar="NUMBER", help=u"[default: %default] If above zero this limits the number of lines output for mail info")
self.parser.add_option("-q","--quote", dest="quote", default="\"", type="string", metavar="CHAR", help=u"[default: %default] The character to use for quotations around the subject line")
self.parser.add_option("-c","--connectiontimeout",dest="connectiontimeout", type="int", default=10, metavar="NUMBER", help=u"[default: %default] Define the number of seconds before a connection timeout can occur. Not applicable at command line when using templates.")
self.parser.add_option("-v","--verbose", dest="verbose", default=False, action="store_true", help=u"request verbose output, not a good idea when running through conky!")
self.parser.add_option("-V", "--version", dest="version", default=False, action="store_true", help=u"Displays the version of the script.")
self.parser.add_option("--errorlogfile", dest="errorlogfile", type="string", metavar="FILE", help=u"If a filepath is set, the script appends errors to the filepath.")
self.parser.add_option("--infologfile", dest="infologfile", type="string", metavar="FILE", help=u"If a filepath is set, the script appends info to the filepath.")
def parse_args(self):
(options, args) = self.parser.parse_args()
return (options, args)
def print_help(self):
return self.parser.print_help()
class EmailData:
def __init__(self, servername, folder, username, num, sender, subject, recvdate, messageid):
self.servername = servername
self.folder = folder
self.username = username
self.num = num
self.sender = sender
self.subject = subject
self.recvdate = recvdate
self.messageid = messageid
def __cmp__(self, other):
return cmp(self.getRecvDate(self.recvdate), self.getRecvDate(other.recvdate))
def getRecvDate(self, recvdate):
if recvdate is None:
return datetime.now()
else:
return recvdate
class EmailInfo:
IMAP_SEARCH_OPTION = "UNSEEN" # "RECENT"
POP_FETCH_OPTION = "TOP" # "RETR"
emaillist = []
def __init__(self,options):
self.options = options
def getTemplateList(self,template):
templatelist = []
for template_part in template.split("{"):
if template_part != "":
for template_part in template_part.split("}"):
if template_part != "":
templatelist.append(u""+template_part)
return templatelist
def getOutputData(self,servertype,servername,port,folder,ssl,username,password,connectiontimeout,mailinfo):
try:
output = u""
socket.setdefaulttimeout(connectiontimeout)
if servertype == "POP":
count = self.getPOPEmailData(servername,port,folder,ssl,username,password,mailinfo)
elif servertype == "IMAP":
count = self.getIMAPEmailData(servername,port,folder,ssl,username,password,mailinfo)
else:
if self.options.verbose == True:
self.logError("Unknown server type of %s requested"%servertype)
if count == -1:
output = "?"
elif count == 0:
output = "pas de nouveau message"
else:
if mailinfo > 0:
output = "%s Nouveau message(s)"%count
counter = 0
self.emaillist.sort(reverse=True)
for emaildata in self.emaillist:
counter = counter + 1
if mailinfo >= counter:
bullet = "%s. "%(counter)
text = "%s: %s%s%s"%(emaildata.sender,self.options.quote,emaildata.subject,self.options.quote)
text = bullet + self.getWrappedText(text, self.options.maxwidth, len(bullet), self.options.linelimit)
output = output + "\n" + text
else:
output = str(count)
return output
except Exception, e:
self.logError("getOutputData:Unexpected error:" + traceback.format_exc())
return "?"
def getTemplateItemOutput(self, template_text):
# keys to template data
SERVERTYPE_KEY = "servertype"
SERVERNAME_KEY = "servername"
PORT_KEY = "port"
FOLDER_KEY = "folder"
SSL_KEY= "ssl"
USERNAME_KEY = "username"
PASSWORD_KEY = "password"
CONNECTION_TIMEOUT_KEY = "connectiontimeout"
MAILINFO_KEY = "mailinfo"
servertype = self.options.servertype
servername = None
port = None
folder = self.options.folder
ssl = self.options.ssl
username = None
password = None
connectiontimeout = self.options.connectiontimeout
mailinfo = self.options.mailinfo
for option in template_text.split('--'):
if len(option) == 0 or option.isspace():
continue
# not using split here...it can't assign both key and value in one call, this should be faster
x = option.find('=')
if (x != -1):
key = option[:x].strip()
value = option[x + 1:].strip()
if value == "":
value = None
else:
key = option.strip()
value = None
try:
if key == SERVERTYPE_KEY:
servertype = value
elif key == SERVERNAME_KEY:
servername = value
elif key == PORT_KEY:
port = int(value)
elif key == FOLDER_KEY:
folder = value
elif key == SSL_KEY:
ssl = True
elif key == USERNAME_KEY:
username = value
elif key == PASSWORD_KEY:
password = value
elif key == CONNECTION_TIMEOUT_KEY:
connectiontimeout = int(value)
elif key == MAILINFO_KEY:
mailinfo = int(value)
else:
self.logError("Unknown template option: " + option)
except (TypeError, ValueError):
self.logError("Cannot convert option argument to number: " + option)
return u""
if servername != None:
return self.getOutputData(servertype,servername,port,folder,ssl,username,password,connectiontimeout,mailinfo)
else:
self.logError("Template item does not have servername defined")
return u""
def getOutputFromTemplate(self, template):
output = u""
end = False
a = 0
# a and b are indexes in the template string
# moving from left to right the string is processed
# b is index of the opening bracket and a of the closing bracket
# everything between b and a is a template that needs to be parsed
while not end:
b = template.find('[', a)
if b == -1:
b = len(template)
end = True
# if there is something between a and b, append it straight to output
if b > a:
output += template[a : b]
# check for the escape char (if we are not at the end)
if template[b - 1] == '\\' and not end:
# if its there, replace it by the bracket
output = output[:-1] + '['
# skip the bracket in the input string and continue from the beginning
a = b + 1
continue
if end:
break
a = template.find(']', b)
if a == -1:
self.logError("Missing terminal bracket (]) for a template item")
return u""
# if there is some template text...
if a > b + 1:
output += self.getTemplateItemOutput(template[b + 1 : a])
a = a + 1
return output
def getEmailData(self,servername,folder,username,num,lines):
try:
self.logInfo("Processing email data to determine 'From', 'Subject' and 'Received Date'")
sender = None
subject = None
recvdate = None
messageid = None
for line in lines:
if sender is None and line.find("From: ") >= 0:
text = line.replace("From: ","").strip("\r ")
try:
text = self.decodeHeader(text)
except Exception, e:
sender = text
self.logError("getEmailData:Unexpected error when decoding sender:" + e.__str__())
sender = re.sub('<.*?@.*?>','',text).strip().lstrip('"').rstrip('"') # remove trailing email in <>
if sender is None:
sender = "Unknown"
elif subject is None and line.find("Subject: ") >= 0:
text = line.replace("Subject: ","").strip("\r\" ")
try:
subject = self.decodeHeader(text)
except Exception, e:
subject = text
self.logError("getEmailData:Unexpected error when decoding subject:" + e.__str__())
if subject is None:
subject = "Unknown"
elif recvdate is None and line.find("Date: ") >= 0:
text = line.replace("Date: ","").strip("\r ")
try:
text = re.match(r"(.*\s)(\d{1,2}\s\w{3}\s\d{4}\s\d{1,2}:\d{1,2}:\d{1,2})(\s.*)"," "+text+" ").group(2) # intentional space at the front and back of text to allow for groups when missing
recvdate = datetime.strptime(text,"%d %b %Y %H:%M:%S") # convert to proper datetime
except Exception, e:
recvdate = datetime.now()
self.logError("getEmailData:Unexpected error when converting receive date to datetime:" + e.__str__())
elif messageid is None and line.find("Message-ID: ") >= 0:
text = line.replace("Message-ID: ","").strip("\r ")
messageid = text
if messageid is None:
messageid = 0
if sender is not None and \
subject is not None and \
recvdate is not None and \
messageid is not None:
break
if subject is None:
subject = ""
emaildata = EmailData(servername, folder, username, num, sender, subject, recvdate, messageid)
return emaildata
except Exception, e:
self.logError("getEmailData:Unexpected error:" + traceback.format_exc())
return None
def getPOPEmailData(self,servername,port,folder,ssl,username,password,mailinfo):
try:
self.logInfo("Logging on to POP server: "+ servername)
if port == None:
if ssl == True:
pop = poplib.POP3_SSL(servername)
else:
pop = poplib.POP3(servername)
else:
if ssl == True:
pop = poplib.POP3_SSL(servername, port)
else:
pop = poplib.POP3(servername, port)
pop.user(username)
pop.pass_(password)
self.logInfo("Getting message count from POP server: "+ servername)
count = len(pop.list()[1])
if count > 0 and mailinfo > 0:
self.logInfo("Extracting message data from POP server \"%s\""%servername)
self.emaillist = []
for num in range(count):
if self.POP_FETCH_OPTION == "TOP":
lines = pop.top(num+1,1)[1]
else:
lines = pop.retr(num+1,1)[1] #more robust but sets message as seen!
emaildata = self.getEmailData(servername,folder,username,num,lines)
if emaildata is not None:
self.emaillist.append(emaildata)
self.logInfo("Logging off from POP server: "+ servername)
pop.quit()
return count
except Exception, e:
self.logError("getPOPEmailData:Unexpected error:" + traceback.format_exc())
return -1
def getIMAPEmailData(self,servername,port,folder,ssl,username,password,mailinfo):
try:
self.logInfo("Logging on to IMAP server: "+ servername)
if port == None:
if ssl == True:
imap = imaplib.IMAP4_SSL(servername)
else:
imap = imaplib.IMAP4(servername)
else:
if ssl == True:
imap = imaplib.IMAP4_SSL(servername, port)
else:
imap = imaplib.IMAP4(servername, port)
imap.login(username, password)
self.logInfo("Searching for new mail on IMAP server \"%s\" in folder \"%s\""%(servername,folder))
imap.select(folder)
typ, data = imap.search(None, self.IMAP_SEARCH_OPTION)
for item in data:
if item == '':
data.remove(item)
if len(data) > 0:
nums = data[0].split()
count = (len(nums))
else:
count = 0
if count > 0 and mailinfo > 0:
self.logInfo("Extracting message data for IMAP server: "+ servername)
self.emaillist = []
for num in nums:
typ, message = imap.fetch(num, '(BODY.PEEK[HEADER])')
lines = message[0][1].split("\n") # grab the content we want and split out lines
emaildata = self.getEmailData(servername,folder,username,num,lines)
if emaildata is not None:
self.emaillist.append(emaildata)
self.logInfo("Logging of from IMAP server: "+ servername)
imap.close()
imap.logout()
imap.shutdown()
return count
except Exception, e:
self.logError("getIMAPEmailData:Unexpected error:" + traceback.format_exc())
return -1
def writeOutput(self):
if self.options.template != None:
#load the file
try:
fileinput = codecs.open(os.path.expanduser(self.options.template),encoding='utf-8')
template = fileinput.read()
fileinput.close()
except Exception, e:
self.logError("Error loading template file: " + e.__str__())
else:
output = self.getOutputFromTemplate(template)
else:
output = self.getOutputData(self.options.servertype,self.options.servername,self.options.port,self.options.folder,self.options.ssl,self.options.username,self.options.password,self.options.connectiontimeout,self.options.mailinfo)
output = self.getMadeSafeOutput(output)
print output.encode("utf-8")
def decodeHeader(self,header_text):
text,encoding = decode_header(header_text)[0]
if encoding:
try:
return text.decode(encoding)
except: # fallback on decode error to windows encoding as this may be introduced by sloppy mail clients
return text.decode('cp1252')
else:
return text
def getWrappedText(self,text,width=40,indent=0,linelimit=0):
if len(text) > width:
wrappedtext = ""
indentchars = "".ljust(indent)
linecount = 0
lines = textwrap.wrap(text,width=width,expand_tabs=False,replace_whitespace=False,subsequent_indent=indentchars)
for line in lines:
linecount = linecount + 1
if linelimit == 0 or linecount <= linelimit:
wrappedtext = wrappedtext + line + "\n"
else:
break
return wrappedtext.rstrip("\n ")
else:
return text
def logInfo(self, text):
if self.options.verbose == True:
print >> sys.stdout, "INFO: " + text
if self.options.infologfile != None:
datetimestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
fileoutput = open(self.options.infologfile, "ab")
fileoutput.write(datetimestamp+" INFO: "+text+"\n")
fileoutput.close()
def logError(self, text):
print >> sys.stderr, "ERROR: " + text
if self.options.errorlogfile != None:
datetimestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
fileoutput = open(self.options.errorlogfile, "ab")
fileoutput.write(datetimestamp+" ERROR: "+text+"\n")
fileoutput.close()
def getMadeSafeOutput(self, text):
return text.replace("${exec","${!noexec!")
def main():
parser = CommandLineParser()
(options, args) = parser.parse_args()
if options.version == True:
print >> sys.stdout,"conkyEmail v.2.07"
else:
if options.verbose == True:
print >> sys.stdout, "*** INITIAL OPTIONS:"
print >> sys.stdout, " servertype:",options.servertype
print >> sys.stdout, " servername:",options.servername
print >> sys.stdout, " port:",options.port
print >> sys.stdout, " folder:",options.folder
print >> sys.stdout, " ssl:",options.ssl
print >> sys.stdout, " username:",options.username
print >> sys.stdout, " password:",options.password
print >> sys.stdout, " template:",options.template
print >> sys.stdout, " mailinfo:",options.mailinfo
print >> sys.stdout, " maxwidth:",options.maxwidth
print >> sys.stdout, " linelimit:",options.linelimit
print >> sys.stdout, " quote:",options.quote
print >> sys.stdout, " verbose:",options.verbose
print >> sys.stdout, " errorlogfile:",options.errorlogfile
print >> sys.stdout, " infologfile:",options.infologfile
# create new global weather object
emailinfo = EmailInfo(options)
emailinfo.writeOutput()
if __name__ == '__main__':
main()
sys.exit()
Qui s'utilise comme ça dans un terminal en supposant qu'il s'appelle email.py
email.py -m IMAP -s imap.gmail.com -e --username="toi@gmail.com" --password="tonpass" -i 10
ce qui es bien c'est qu'il affiche seulement les 10 derniers messages , c'est le parametre i qui definit cela ,sans celui ci il affiche seulement le nombre
Une bonne chose la pause oui car racine fait une boucle sinon.Ce qui serait pas la c'est la meme chose sans internet peut etre voir ce qu'utilise kiku ou Voice Control
Dernière modification par n3o51 (Le 31/01/2012, à 19:52)
Welcome to the real world
________________________________
Hors ligne
#14 Le 31/01/2012, à 20:17
- Compte supprimé
Re : [Script] reconnaissance vocale avec google
Je n'arrive pas à utiliser le script que tu m'as donné, j'essaye de le lancer mais il me dit commande introuvable malgré que je l'ai rendu exécutable.
Si ça marche chez toi, alors modifie le script internet.sh et change la commande à exécuter lorsque tu dis message | mail | ... ) ajoute ta commande ; rm .../ $HOME... ;;
Je ne peux pas t'aider sur la façon d'avoir ce que ton script va chercher sur ta boite mail puisque je ne sais pas ce qu'il affiche.
Dernière modification par benoitfra (Le 31/01/2012, à 20:21)
#15 Le 31/01/2012, à 20:22
- n3o51
Re : [Script] reconnaissance vocale avec google
pas de soucis , peut etre faut que tu le lance avec python devant ou essaie avec ./ devant donc ./mail.py cela devrait fonctionner.sinon c'est pas grave.Aussi svox-pico depends de quoi car je n'arrive pas as l'installer sous lucid ?
Welcome to the real world
________________________________
Hors ligne
#16 Le 31/01/2012, à 20:26
- Compte supprimé
Re : [Script] reconnaissance vocale avec google
python email.py ==>
Traceback (most recent call last):
File "email.py", line 39, in <module>
from email.header import decode_header
File "/home/benoit/Bureau/email.py", line 39, in <module>
from email.header import decode_header
ImportError: No module named header
./email.py ==>
from: can't read /var/mail/datetime
from: can't read /var/mail/email.header
from: can't read /var/mail/optparse
./email.py: ligne 41: import : commande introuvable
./email.py: ligne 42: import : commande introuvable
./email.py: ligne 43: import : commande introuvable
./email.py: ligne 44: import : commande introuvable
./email.py: ligne 45: import : commande introuvable
./email.py: ligne 46: import : commande introuvable
./email.py: ligne 47: import : commande introuvable
./email.py: ligne 48: import : commande introuvable
./email.py: ligne 49: import : commande introuvable
./email.py: ligne 51: class : commande introuvable
./email.py: ligne 53: parser : commande introuvable
./email.py: ligne 55: Erreur de syntaxe près du symbole inattendu « ( »
./email.py: ligne 55: ` def __init__(self):'
Sinon pour installer svox-pico, sudo apt-get install libttspico0
EDIT: je suis sous maverick, je sais pas si il est dans les dépots de Lucid...peut-être notify-osd serait mieux.
Dernière modification par benoitfra (Le 31/01/2012, à 21:22)
#17 Le 31/01/2012, à 20:48
- n3o51
Re : [Script] reconnaissance vocale avec google
lance le comme ça
./email.py -m IMAP -s imap.gmail.com -e --username="toi@gmail.com" --password="tonpass" -i 10
en remplacant par ton email et ton mot de pass.
Ensuite pour le script ca c'est bien installé il capte quand je dit heure mais rien ne se lance en plus il as créer un GoogleV2T avec les scripts et un dossier vocale avec les scripts aussi Visiblement systeme n'arrive pas as lancer les autres scripts en plus il ne se met pas en pause.As mon avis tu devrais essayer de le reinstaller de zero et voir ce qui ce passe la je comprends pas.
Le problème doit venir de
echo "CMD=$TEXTE" >> $HOME/.gnome2/nautilus-scripts/vocale/commande.txt
il faudrait faire
echo "CMD=$TEXTE" > $HOME/.gnome2/nautilus-scripts/vocale/commande.txt
car sinon le fichier est pas créer, doit y avoir d'autre erreur car fonctionne toujours pas.Ensuite tu met CMD=$TEXTE mais $TEXTE devrait suffir pour la verfication je vais tester.
Dernière modification par n3o51 (Le 31/01/2012, à 21:15)
Welcome to the real world
________________________________
Hors ligne
#18 Le 31/01/2012, à 21:21
- Compte supprimé
Re : [Script] reconnaissance vocale avec google
C'est bon normalement, j'avais oublié de remplacer /vocale/ par /GoogleV2T/ dans les scripts: erreur corrigée toute mes excuses.
GoogleV2T
Dernière modification par benoitfra (Le 31/01/2012, à 21:24)
#19 Le 31/01/2012, à 21:33
- n3o51
Re : [Script] reconnaissance vocale avec google
Pas de soucis j'ai corrigé aussi mais ça ne marche toujours pas , et je ne vois pas comment ca peut fonctionner car :
on lance syteme qui lance racine ensuite il lance exemple workspace mais qui avant de ce lancer , commande est supprimer par systeme ...En plus racine fait une boucle donc il recreer un commande.txt .Rien a faire ca ne fonctionne pas chez moi il faudrait que des gens essais , si ca fonctionne chez toi tiens moi au courant , je dois mal faire quelque chose.. A chaque fois il me dit vous avez dit heure mais en vain workspace ne ce lance pas pour donner l heure
Welcome to the real world
________________________________
Hors ligne
#20 Le 31/01/2012, à 21:43
- Compte supprimé
Re : [Script] reconnaissance vocale avec google
arg je vois pas d'où cela viens car la ligne dans système.sh montre bien que je supprime commande.txt après que workspace.sh ait terminé son affaire.
heure | batterie ) $HOME/.gnome2/nautilus-scripts/GoogleV2T/workspace.sh; rm $HOME/.gnome2/nautilus-scripts/GoogleV2T/commande.txt ; $HOME/.gnome2/nautilus-scripts/GoogleV2T/système.sh ;;
qq pistes :
as tu installé pico-svox car il est nécessaire pour que ton pc te dise l'heure.
ensuite as tu bien remplacé partout vocale par GoogleV2T. Dans la dernière version, j'ai refais tout le tour normalement il n'y a plus un seul vocale qui traîne.
#21 Le 31/01/2012, à 21:49
- n3o51
Re : [Script] reconnaissance vocale avec google
avec tout ça je me rends compte que je l'ai pas installé mais je ne vois pas comment
il ne trouve pas le paquet j ai essayé
sudo apt-get install libttspico0
aussi libttspico-utils et libttspico mais rien
Welcome to the real world
________________________________
Hors ligne
#22 Le 31/01/2012, à 21:52
- Compte supprimé
Re : [Script] reconnaissance vocale avec google
je crois qu'il n'est pas dans les dépôts de ubuntu 10.04
Dernière modification par benoitfra (Le 31/01/2012, à 21:52)
#23 Le 31/01/2012, à 22:13
- Compte supprimé
Re : [Script] reconnaissance vocale avec google
C'est bon j'ai trouvé l'erreur ...et c'est bizarre.
En fait c'est dans système.sh ( et les autres ) à priori une ligne vide empêche le lancement de racine.sh
J'ai rajouté un sleep 4 dans système.sh puis je le lance avec le terminal et là il me dit:
/système.sh: ligne 2: /home/benoit/.gnome2/nautilus-scripts/GoogleV2T /racine.sh: Aucun fichier ou dossier de ce type
Remarque l'espace qui apparait dans le termiinal, sans doute à cause de gedit quand j'ai fais remplacer tout (vocale >> GoogleV2T)
Comment corriger ça sant tout retaper ?
Dernière modification par benoitfra (Le 31/01/2012, à 22:14)
#24 Le 31/01/2012, à 22:15
- n3o51
Re : [Script] reconnaissance vocale avec google
effectivement je l'es pris dans git pour ce que sa interresse ,
apt-get install build-essential git automake autoconf autogen libtool libpopt-dev
Récupération des sources
git clone git://git.debian.org/collab-maint/svox.git pico
cd pico
git branch -a
git checkout -f origin/debian-squeeze
cd pico
./autogen.sh
./configure
make
make install
ldconfig
Ensuite on teste :
pico2wave -l fr-FR -w test.wav “Je fais un test avec pico”
Et c'est genial sa marche et bien je trouve.Bon faut ameliorer encore l'installation car sans verifier il installe yad surtout sans demander donc pas top.Apres a voir si moyen de faire un truc sans internet.
Merci monsieur , je vais essayer de l'ameliorer de mon coté
Par contre il faut mettre
echo "CMD=$TEXTE" > $HOME/.gnome2/nautilus-scripts/GoogleV2T/commande.txt
avec un chevron sinon le fichiers et pas créer ou dire au gens de le créer
Dernière modification par n3o51 (Le 31/01/2012, à 22:17)
Welcome to the real world
________________________________
Hors ligne
#25 Le 31/01/2012, à 22:24
- Compte supprimé
Re : [Script] reconnaissance vocale avec google
Bon c'est bon, enfin !!! foutu majuscule qui introduit au moment du remplacement un espace.
j'ai tout refait sans la majuscule en fin de nom GoogleV2T>>GoogleV2t
Testé sur mon pc et ça marche...
Merci pour yad, j'avais pas vu que je l'avais fait à la sauvage.
EDIT: Nouvelle archive avec la correction et une installation avec demande préalable de yad
GoogleV2t
EDIT: Normalement, on n'a pas besoin de le créer, j'ai essayé avec >> et > et les deux fonctionnent sans avoir de commande.txt au préalable dans le dossier.
Dernière modification par benoitfra (Le 31/01/2012, à 22:40)