Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 28/01/2012, à 16:36

Compte supprimé

[Script] reconnaissance vocale avec google

1390835962.png
google2ubuntu

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.


Gestion des commandes
1390836889.png

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.


Ajouter des commandes
1390721059.png

L'utilisateur peut en cliquant sur la petite flèche ajouter différents types de commandes via un menu.


1390721157.png

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

1390721314.png

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

1390721205.png

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.

1390839438.png


Ensuite, une nouvelle ligne apparait dans les commandes, il suffit de modifier la phrase clé.

1390721260.png

Vidéo

google2ubuntu 1

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)