#1 Le 28/01/2012, à 17:36
[Script] reconnaissance vocale avec google
Bienvenue à vous
![]()
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 $Textpar
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 $Textpar 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
exitNaviguer 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
exitDerniè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 typeen 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 typeensuite 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 10ce 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 10en 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.txtil faudrait faire
echo "CMD=$TEXTE" > $HOME/.gnome2/nautilus-scripts/vocale/commande.txtcar 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.txtavec 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
- Accueil
- » Forum
- » Trucs, astuces et scripts utiles
- » [Script] reconnaissance vocale avec google
