WebkitSpeechRecognition interception before programAB

Hi ! Program AB doesn't like quotes ( ex: I'M A BOT ) it must be ( I M A BOT ) I think

And I want to correct some ear values.

So how can i intercept WebkitSpeechRecognition  and replace some characters before ProgramAB read it.

Thanks !

beetlejuice's picture

Hi !Here is a quick exemple

Hi !

Here is a quick exemple ( mayby not the better, but that work ! )

Runtime.createAndStart("chatBot", "ProgramAB") 
sleep (1)
chatBot.startSession( "default", "wikidataFR") 
Runtime.createAndStart("ear", "WebkitSpeechRecognition") 
mouth=Runtime.createAndStart("mouth", "AcapelaSpeech")
htmlFilter=Runtime.createAndStart("htmlFilter", "HtmlFilter")

sleep(1)
ear.addListener("publishText", python.name, "talk") 
# Add route from Program AB to html filter
chatBot.addTextListener(htmlFilter)
# Add route from html filter to mouth
htmlFilter.addListener("publishText", python.name, "say");
mouth.setLanguage("FR");
mouth.setVoice("Antoine");
ear.setLanguage("fr-FR")
Runtime.createAndStart("webGui", "WebGui") 

def say(data):
	mouth.speakBlocking(data)
	print "chatbot :", data
	
def talk(data):
	if data!="":
		data = data.replace("\'", " ") # Replace quote by a blank space
		chatBot.getResponse(data) # Ask the chatBot 
  		print "chatbot :", data

 

You need to have this category in your aiml file.

<category>
<pattern>SAY *</pattern>
<template><star /></template>

</category>

beetlejuice's picture

But ProgramAB work with

But ProgramAB work with quotes, you have to use UTF-8, have a look here:


#file : /home/beetlejuice/wikiDataFetcher%2BAB%2BFR.py edit raw
# Ce programme introduit les bases d'utilisation du service wikidatafetcher

import random
import codecs
import socket
from java.lang import String

chatBot=Runtime.createAndStart("chatBot", "ProgramAB")
ear=Runtime.createAndStart("ear", "WebkitSpeechRecognition")
mouth=Runtime.createAndStart("mouth", "AcapelaSpeech")
htmlFilter=Runtime.createAndStart("htmlFilter", "HtmlFilter")
webgui=Runtime.createAndStart("webgui", "WebGui")

chatBot.startSession("ProgramAB", "default", "wikidata")
wdf=Runtime.createAndStart("wdf", "WikiDataFetcher") # WikiDataFetcher cherche des données sur les sites wiki
wdf.setLanguage("fr") # on cherche en français
wdf.setWebSite("frwiki") # On fait des recherches sur le site français de wikidata
sleep(2)
mouth.setLanguage("FR") # on parle francais !
mouth.setVoice("Antoine") # on choisis une voix ( voir la liste des voix sur http://www.acapela-group.com/?lang=fr
ear.addTextListener(chatBot) # On creer une liaison de webKitSpeechRecognition vers Program AB
ear.setLanguage("fr-FR")
chatBot.addTextListener(htmlFilter) # On creer une liaison de Program AB vers html filter
htmlFilter.addListener("publishText", python.name, "talk") # On creer une liaison de htmlfilter vers mouth



def talk(data): # cette fonction "dit" vocalement le texte qu'elle reçoit (data)
	if data!="":
		mouth.speak(data)
  		print "chatbot :", data
  		
def askWiki(query): # retourne la description du sujet (query)
	query = unicode(query,'utf-8')# on force le format de police UTF-8 pour prendre en charge les accents
	if query[1]== "\'" : # Si le sujet contient un apostrophe , on efface tout ce qui est avant ! ( "l'été" -> "été")
		query2 = query[2:len(query)]
		query = query2
	print query # petit affichage de contrôle dans la console python ..
	word = wdf.cutStart(query) # on enlève le derminant ("le chat" -> "chat")
	start = wdf.grabStart(query) # on garde que le déterminant ( je ne sais plus pourquoi j'ai eu besoin de ça, mais la fonction existe ...)
	wikiAnswer = wdf.getDescription(word) # récupère la description su wikidata
	answer = ( query + " est " + wikiAnswer)
	if wikiAnswer == "Not Found !": # Si le document n'ai pas trouvé , on réponds "je ne sais pas"
		answer = "Je ne sais pas"
	chatBot.getResponse("say " + answer) #on demande a programAB de faire le perroquet !

def getProperty(query, what): # retourne la valeur contenue dans la propriété demandée (what)
	query = unicode(query,'utf-8')
	what = unicode(what,'utf-8')
	if query[1]== "\'" :
		query2 = query[2:len(query)]
		query = query2
	if what[1]== "\'" :
		what2 = what[2:len(what)]
		what = what2
		print "what = " + what + " - what2 = " + what2
	ID = "error"
	# le fichier propriété.txt contient les conversions propriété -> ID . wikidata n'utilise pas des mots mais des codes (monnaie -> P38)
	f = codecs.open(u"C:/Users/papa/git/pyrobotlab/home/beetlejuice/propriétés_ID.txt",'r',"utf-8") # set you propertiesID.txt path
	
	for line in f:
    		line_textes=line.split(":")
    		if line_textes[0]== what:
	    		ID= line_textes[1]
	f.close()
	print "query = " + query + " - what = " + what + " - ID = " + ID
	wikiAnswer= wdf.getData(query,ID) # récupère la valeur de la propriété si elle existe dans le document
	answer = ( what +" de " + query + " est " + wikiAnswer)
	
	if wikiAnswer == "Not Found !":
		answer = "Je ne sais pas"
	chatBot.getResponse("say " + answer)
	return answer

def getDate(query, ID):# Cette fonction permet d'afficher une date personnalisée (mardi, le 10 juin, 1975, 12h38 .....)
	answer = ( wdf.getTime(query,ID,"day") +" " +wdf.getTime(query,ID,"month") + " " + wdf.getTime(query,ID,"year"))
	print " La date est : " + answer
	chatBot.getResponse("say Le " + answer)
def getIp(): # cette fonction annonce l'adresse IP locale, elle n'ai pas dans le fichier aiml wikidata, a vous de l'ajouter ;) 
	ip = str(socket.gethostbyname(socket.gethostname()))
	ip = ip.replace('.',' point ')
	chatBot.getResponse("say Mon adresse IP est  " + ip)
	

moz4r's picture

merci beetle !!!! I will try

merci beetle !!!!

I will try it

moz4r's picture

Correct me if i wrong but It

Correct me if i wrong but It works but not really :) , why  :

QUEL EST LE fruit DE L'abricotier

the paterne called is :

<category><pattern>QUEL EST LE * DE *</pattern>

AND NOT

<category><pattern>QUEL EST LE * DE L'*</pattern>

I want to use this outside the wikidata service in classic aiml pattern

So the talk function is not called at this time. I need to intercept the data before ProgramAB fetch it . Any idea ?

moz4r's picture

I foundt it

this is the tip : ( remove chatbot listener )

#ear.addTextListener(chatBot) 

def onText(text):
 print text.replace("'", " ")
 chatBot.getResponse(text.replace("'", " "))
 
python.subscribe(ear.getName(),"publishText")