Contenu | Rechercher | Menus

Annonce

Le forum rencontre en ce moment quelques soucis de charge, il est possible qu'une erreur soit affichée quand vous postez un message, ne rechargez pas la page au risque de poster une seconde fois votre message

Si vous rencontrez des soucis à rester connecté sur le forum (ou si vous avez perdu votre mot de passe) déconnectez-vous et reconnectez-vous depuis cette page, en cochant la case "Me connecter automatiquement lors de mes prochaines visites".

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

[Script] reconnaissance vocale avec google

Bienvenue à vous

icons

Je vous présente google2ubuntu, un outil que j'ai développé afin d'utiliser la reconnaissance vocale de Google sur Ubuntu.

Prinicipe

Cet outil nécessite une connexion Internet. On acquière votre voix dans un fichier audio et on l'envoi à Google qui nous retourne alors le texte prononcer.

Une fois ceci fait on peut alors lier certaines actions à certains mots.

Installation

Pour installer google2ubuntu, téléchargez le paquet deb disponible ci après:
google2ubuntu

Ensuite, il ne reste qu'a ouvrir le paquet deb.

Possibilités

Pour illustrer ce que l'on peut faire avec google2ubuntu, je poste ci après des liens de vidéos:

Playliste youtube google2ubuntu

Depuis que j'ai fait ces vidéos d'autres possibilités ce sont ajoutées à google2ubuntu. À titre d'exemple, on peut maintenant envoyer des messages par email, changer le fond d'écran, regarder la télé orange (un programme tv a été aussi ajouté). On peut également faire des recherches sur Youtube, Wikipedia et dans un dictionnaire en ligne, bien sur on peut faire des recherches sur google. Ensuite, on peut accéder à la météo sur trois jours, la météo s'affiche dans une infobulle.
google2ubuntu vous permet aussi de prendre de longue notes.

Remarquez enfin que j'ai refait toute l'interface avec glade2script pour plus de convivialité.

À termes je mettrai des captures d'écran.

Participation

Une fois que vous avez fait vos premiers tests avec google2ubuntu, si vous voyez un truc sympa
que l'on pourrait intégré dans google2ubuntu, venez posté sur le forum.

Par ailleurs google2ubuntu franchi un nouveau cap avec la modularité ie vous avez envie d'intégrer d'autre fonction à google2ubuntu mais vous n'avez pas envie fouiller dans le code...il suffit de placer votre module (script bash par ex) dans /usr/share/google2ubuntu/modules, votre module sera exécuté avec le texte que vous avez prononcé en argumeent. Orangetv est maintenant un module afin d'inviter les abonnés de free et bouygue à faire un module pour regarder la tv eux aussi.

De la même manière, si vous souhaitez participer, rendez vous sur la dernière page du forum.

Dernière modification par benoitfra (Le 06/09/2012, à 17:07)

Hors ligne

#2 Le 28/01/2012, à 17:47

Re : [Script] reconnaissance vocale avec google

Bonjour,
Essayer en remplaçant

echo $Text

par

tr -d '"' <<<"$Text"

Hors ligne

#3 Le 28/01/2012, à 17:54

Re : [Script] reconnaissance vocale avec google

Waoou
Rapide, efficace bravo pingouinux et Merci
RÉSOLU

Dernière modification par benoitfra (Le 28/01/2012, à 17:55)

Hors ligne

#4 Le 28/01/2012, à 18:55

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, à 18:58

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}]}

Hors ligne

#6 Le 28/01/2012, à 19:13

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, à 19:59

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, à 12:50)

Hors ligne

#8 Le 30/01/2012, à 21:46

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, à 22:24)

Hors ligne

#9 Le 31/01/2012, à 01:57

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, à 03:10)


Welcome to the real world
________________________________

Hors ligne

#10 Le 31/01/2012, à 13:19

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, à 22:23)

Hors ligne

#11 Le 31/01/2012, à 13:40

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, à 14:06)


Welcome to the real world
________________________________

Hors ligne

#12 Le 31/01/2012, à 19:51

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, à 22:22)

Hors ligne

#13 Le 31/01/2012, à 20:49

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, à 20:52)


Welcome to the real world
________________________________

Hors ligne

#14 Le 31/01/2012, à 21:17

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, à 21:21)

Hors ligne

#15 Le 31/01/2012, à 21:22

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, à 21:26

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, à 22:22)

Hors ligne

#17 Le 31/01/2012, à 21:48

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, à 22:15)


Welcome to the real world
________________________________

Hors ligne

#18 Le 31/01/2012, à 22:21

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, à 22:24)

Hors ligne

#19 Le 31/01/2012, à 22:33

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, à 22:43

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.

Hors ligne

#21 Le 31/01/2012, à 22:49

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, à 22:52

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, à 22:52)

Hors ligne

#23 Le 31/01/2012, à 23:13

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, à 23:14)

Hors ligne

#24 Le 31/01/2012, à 23:15

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, à 23:17)


Welcome to the real world
________________________________

Hors ligne

#25 Le 31/01/2012, à 23:24

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, à 23:40)

Hors ligne

Haut de page ↑