diff options
Diffstat (limited to 'jasper.py')
| -rwxr-xr-x | jasper.py | 121 |
1 files changed, 121 insertions, 0 deletions
diff --git a/jasper.py b/jasper.py new file mode 100755 index 0000000..cd51960 --- /dev/null +++ b/jasper.py @@ -0,0 +1,121 @@ +#!/usr/bin/env python2 +import os +import sys +import traceback +import shutil +import yaml + +# 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) + +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:]: + from client.local_mic import Mic +else: + from client.mic import Mic + +# Change CWD to $JASPER_HOME/jasper/client +client_path = os.path.join(os.getenv("JASPER_HOME"), "jasper", "client") +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 + +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) + +if __name__ == "__main__": + + print "===========================================================" + print " JASPER The Talking Computer " + print " Copyright 2013 Shubhro Saha & Charlie Marsh " + print "===========================================================" + + speaker.say("Hello.... I am Jasper... Please wait one moment.") + testConnection() + configure() + + profile = yaml.safe_load(open("profile.yml", "r")) + + try: + api_key = profile['keys']['GOOGLE_SPEECH'] + except KeyError: + api_key = None + + 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() |
