From 0ebdd82b4fba0fa59dba25b6c68c295726e224a8 Mon Sep 17 00:00:00 2001 From: schneefux Date: Fri, 12 Sep 2014 19:46:27 +0200 Subject: Using argparse module --- jasper.py | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) (limited to 'jasper.py') diff --git a/jasper.py b/jasper.py index cd51960..b02f7be 100755 --- a/jasper.py +++ b/jasper.py @@ -4,6 +4,7 @@ import sys import traceback import shutil import yaml +import argparse # Set $JASPER_HOME jasper_home = os.getenv("JASPER_HOME") @@ -19,7 +20,13 @@ from client.diagnose import Diagnostics from client import vocabcompiler, stt from client import speaker as speak from client.conversation import Conversation -if len(sys.argv) > 1 and "--local" in sys.argv[1:]: + +parser = argparse.ArgumentParser(description='Test suite for the Jasper client code.') +parser.add_argument('--local', action='store_true', help='Use text input instead of a real microphone') +parser.add_argument('--no-network-check', action='store_true', help='Disable the network connection check') +args = parser.parse_args() + +if args.local: from client.local_mic import Mic else: from client.mic import Mic @@ -92,8 +99,10 @@ if __name__ == "__main__": print " Copyright 2013 Shubhro Saha & Charlie Marsh " print "===========================================================" + speaker.say("Hello.... I am Jasper... Please wait one moment.") - testConnection() + if not args.no_network_check: + testConnection() configure() profile = yaml.safe_load(open("profile.yml", "r")) -- cgit v1.3.1 From dade948e9e392476e3cb60c46f3002356f890d7c Mon Sep 17 00:00:00 2001 From: schneefux Date: Fri, 12 Sep 2014 20:14:12 +0200 Subject: make jasper a class and use logging --- jasper.py | 126 ++++++++++++++++++++++++++++---------------------------------- 1 file changed, 56 insertions(+), 70 deletions(-) (limited to 'jasper.py') diff --git a/jasper.py b/jasper.py index b02f7be..75af2f0 100755 --- a/jasper.py +++ b/jasper.py @@ -3,6 +3,10 @@ import os import sys import traceback import shutil +import logging +logging.basicConfig() +logger = logging.getLogger() + import yaml import argparse @@ -24,8 +28,12 @@ from client.conversation import Conversation parser = argparse.ArgumentParser(description='Test suite for the Jasper client code.') parser.add_argument('--local', action='store_true', help='Use text input instead of a real microphone') parser.add_argument('--no-network-check', action='store_true', help='Disable the network connection check') +parser.add_argument('--debug', action='store_true', help='Show debug messages') args = parser.parse_args() +if args.debug: + logger.setLevel(logging.DEBUG) + if args.local: from client.local_mic import Mic else: @@ -48,49 +56,40 @@ else: path = "/usr/local/lib/" os.environ["PATH"] = path -speaker = speak.newSpeaker() - - -def testConnection(): - if Diagnostics.check_network_connection(): - print "CONNECTED TO INTERNET" - else: - print "COULD NOT CONNECT TO NETWORK" - speaker.say( - "Warning: I was unable to connect to a network. Parts of the system may not work correctly, depending on your setup.") - - -def fail(message): - traceback.print_exc() - speaker.say(message) - sys.exit(1) - - -def configure(): - try: - print "COMPILING DICTIONARY" - vocabcompiler.compile( - "sentences.txt", "dictionary.dic", "languagemodel.lm") - print "STARTING CLIENT PROGRAM" - - except OSError: - print "BOOT FAILURE: OSERROR" - fail( - "There was a problem starting Jasper. You may be missing the language model and associated files. Please read the documentation to configure your Raspberry Pi.") - - except IOError: - print "BOOT FAILURE: IOERROR" - fail( - "There was a problem starting Jasper. You may have set permissions incorrectly on some part of the filesystem. Please read the documentation to configure your Raspberry Pi.") - - except: - print "BOOT FAILURE" - fail( - "There was a problem starting Jasper. Please read the documentation to configure your Raspberry Pi.") - -old_client = os.path.abspath(os.path.join(os.pardir, "old_client")) -if os.path.exists(old_client): - shutil.rmtree(old_client) +class Jasper(object): + def __init__(self): + # Read config + config_file = os.path.abspath(os.path.join(client_path, 'profile.yml')) + logger.debug("Trying to read config file: '%s'", config_file) + with open(config_file, "r") as f: + self.config = yaml.safe_load(f) + + try: + api_key = self.config['keys']['GOOGLE_SPEECH'] + except KeyError: + api_key = None + + try: + stt_engine_type = self.config['stt_engine'] + except KeyError: + logger.warning("stt_engine not specified in profile, defaulting to 'sphinx'") + stt_engine_type = "sphinx" + + # Compile dictionary + sentences, dictionary, languagemodel = [os.path.abspath(os.path.join(client_path, filename)) for filename in ("sentences.txt", "dictionary.dic", "languagemodel.lm")] + vocabcompiler.compile(sentences, dictionary, languagemodel) + + # Initialize Mic + self.mic = Mic(speak.newSpeaker(), stt.PocketSphinxSTT(), stt.newSTTEngine(stt_engine_type, api_key=api_key)) + + def run(self): + addendum = "" + if 'first_name' in self.config: + addendum = ", %s" % self.config["first_name"] + self.mic.say("How can I be of service%s?" % addendum) + + conversation = Conversation("JASPER", self.mic, self.config) + conversation.handleForever() if __name__ == "__main__": @@ -99,32 +98,19 @@ if __name__ == "__main__": print " Copyright 2013 Shubhro Saha & Charlie Marsh " print "===========================================================" - - speaker.say("Hello.... I am Jasper... Please wait one moment.") - if not args.no_network_check: - testConnection() - configure() - - profile = yaml.safe_load(open("profile.yml", "r")) - - try: - api_key = profile['keys']['GOOGLE_SPEECH'] - except KeyError: - api_key = None + if not args.no_network_check and not Diagnostics.check_network_connection(): + logger.warning("Network not connected. This may prevent Jasper from running properly.") try: - stt_engine_type = profile['stt_engine'] - except KeyError: - print "stt_engine not specified in profile, defaulting to PocketSphinx" - stt_engine_type = "sphinx" - - mic = Mic(speaker, stt.PocketSphinxSTT(), - stt.newSTTEngine(stt_engine_type, api_key=api_key)) - - addendum = "" - if 'first_name' in profile: - addendum = ", %s" % profile["first_name"] - mic.say("How can I be of service%s?" % addendum) - - conversation = Conversation("JASPER", mic, profile) - conversation.handleForever() + app = Jasper() + except IOError: + logger.exception("Can't read config file.") + sys.exit(1) + except OSError: + logger.exception("Language model or associated files missing.") + sys.exit(1) + except Exception(): + logger.exception("Unknown error occured") + sys.exit(1) + + app.run() -- cgit v1.3.1 From a79d8e1178417a2f0efbb4c6e3527d63d8dc8290 Mon Sep 17 00:00:00 2001 From: schneefux Date: Fri, 12 Sep 2014 20:41:46 +0200 Subject: Small cleanup in jasper.py --- jasper.py | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) (limited to 'jasper.py') diff --git a/jasper.py b/jasper.py index 75af2f0..a0e298c 100755 --- a/jasper.py +++ b/jasper.py @@ -72,8 +72,8 @@ class Jasper(object): try: stt_engine_type = self.config['stt_engine'] except KeyError: - logger.warning("stt_engine not specified in profile, defaulting to 'sphinx'") stt_engine_type = "sphinx" + logger.warning("stt_engine not specified in profile, defaulting to '%s'", stt_engine_type) # Compile dictionary sentences, dictionary, languagemodel = [os.path.abspath(os.path.join(client_path, filename)) for filename in ("sentences.txt", "dictionary.dic", "languagemodel.lm")] @@ -83,10 +83,8 @@ class Jasper(object): self.mic = Mic(speak.newSpeaker(), stt.PocketSphinxSTT(), stt.newSTTEngine(stt_engine_type, api_key=api_key)) def run(self): - addendum = "" - if 'first_name' in self.config: - addendum = ", %s" % self.config["first_name"] - self.mic.say("How can I be of service%s?" % addendum) + salutation = "How can I be of service, %s?" % self.config["first_name"] if 'first_name' in self.config else "How can I be of service?" + self.mic.say(salutation) conversation = Conversation("JASPER", self.mic, self.config) conversation.handleForever() -- cgit v1.3.1 From f9ea5957e5d484c91668a19765cff2e709f9e3c9 Mon Sep 17 00:00:00 2001 From: schneefux Date: Mon, 15 Sep 2014 09:48:37 +0200 Subject: Fix wrong argparser name --- jasper.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'jasper.py') diff --git a/jasper.py b/jasper.py index a0e298c..ebc528d 100755 --- a/jasper.py +++ b/jasper.py @@ -25,7 +25,7 @@ from client import vocabcompiler, stt from client import speaker as speak from client.conversation import Conversation -parser = argparse.ArgumentParser(description='Test suite for the Jasper client code.') +parser = argparse.ArgumentParser(description='Jasper Voice Control Center') parser.add_argument('--local', action='store_true', help='Use text input instead of a real microphone') parser.add_argument('--no-network-check', action='store_true', help='Disable the network connection check') parser.add_argument('--debug', action='store_true', help='Show debug messages') -- cgit v1.3.1 From 85ea0f6d955188a5ad8c51815c623767f08b4055 Mon Sep 17 00:00:00 2001 From: schneefux Date: Mon, 15 Sep 2014 09:50:57 +0200 Subject: Autodetection of JASPER_HOME --- jasper.py | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) (limited to 'jasper.py') diff --git a/jasper.py b/jasper.py index ebc528d..159d962 100755 --- a/jasper.py +++ b/jasper.py @@ -11,14 +11,8 @@ import yaml import argparse # Set $JASPER_HOME -jasper_home = os.getenv("JASPER_HOME") -if not jasper_home or not os.path.exists(jasper_home): - if os.path.exists("/home/pi"): - jasper_home = "/home/pi" - os.environ["JASPER_HOME"] = jasper_home - else: - print("Error: $JASPER_HOME is not set.") - sys.exit(0) +if not os.getenv('JASPER_HOME'): + os.environ["JASPER_HOME"] = os.path.abspath(os.path.join(os.path.dirname(__file__), os.pardir)) from client.diagnose import Diagnostics from client import vocabcompiler, stt -- cgit v1.3.1 From 41cb3666f4d845c2d1a228cf36487cd92fe46129 Mon Sep 17 00:00:00 2001 From: schneefux Date: Mon, 15 Sep 2014 09:53:01 +0200 Subject: Remove redefinition of $LD_LIBRARY_PATH AND $PATH --- jasper.py | 11 ----------- 1 file changed, 11 deletions(-) (limited to 'jasper.py') diff --git a/jasper.py b/jasper.py index 159d962..9736c6b 100755 --- a/jasper.py +++ b/jasper.py @@ -39,17 +39,6 @@ os.chdir(client_path) # Add $JASPER_HOME/jasper/client to sys.path sys.path.append(client_path) -# Set $LD_LIBRARY_PATH -os.environ["LD_LIBRARY_PATH"] = "/usr/local/lib" - -# Set $PATH -path = os.getenv("PATH") -if path: - path = os.pathsep.join([path, "/usr/local/lib/"]) -else: - path = "/usr/local/lib/" -os.environ["PATH"] = path - class Jasper(object): def __init__(self): # Read config -- cgit v1.3.1 From 182dd9e5aa2e765c3ddbe558d48691e909c80ebd Mon Sep 17 00:00:00 2001 From: schneefux Date: Mon, 15 Sep 2014 19:50:44 +0200 Subject: Use logging.getLogger(__name__) in jasper.py --- jasper.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'jasper.py') diff --git a/jasper.py b/jasper.py index 9736c6b..e025d14 100755 --- a/jasper.py +++ b/jasper.py @@ -5,7 +5,7 @@ import traceback import shutil import logging logging.basicConfig() -logger = logging.getLogger() +logger = logging.getLogger(__name__) import yaml import argparse -- cgit v1.3.1 From a6b13909b87983bf9dcc2eb22bcd83aaf7494eaf Mon Sep 17 00:00:00 2001 From: schneefux Date: Mon, 15 Sep 2014 19:53:17 +0200 Subject: Changed IOError logger message in jasper.py --- jasper.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'jasper.py') diff --git a/jasper.py b/jasper.py index e025d14..4e00fa2 100755 --- a/jasper.py +++ b/jasper.py @@ -85,7 +85,7 @@ if __name__ == "__main__": try: app = Jasper() except IOError: - logger.exception("Can't read config file.") + logger.exception("Can't read profile file.") sys.exit(1) except OSError: logger.exception("Language model or associated files missing.") -- cgit v1.3.1 From 41068df7e4355df48fd71aebd76237a725ace91d Mon Sep 17 00:00:00 2001 From: schneefux Date: Tue, 16 Sep 2014 20:13:22 +0200 Subject: Style fix for salutation in jasper.py --- jasper.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) (limited to 'jasper.py') diff --git a/jasper.py b/jasper.py index 4e00fa2..346617f 100755 --- a/jasper.py +++ b/jasper.py @@ -66,7 +66,10 @@ class Jasper(object): self.mic = Mic(speak.newSpeaker(), stt.PocketSphinxSTT(), stt.newSTTEngine(stt_engine_type, api_key=api_key)) def run(self): - salutation = "How can I be of service, %s?" % self.config["first_name"] if 'first_name' in self.config else "How can I be of service?" + if 'first_name' in self.config: + salutation = "How can I be of service, %s?" % self.config["first_name"] + else: + salutation = "How can I be of service?" self.mic.say(salutation) conversation = Conversation("JASPER", self.mic, self.config) -- cgit v1.3.1