From 6e82c5964e31f3cc937911069709af9830071338 Mon Sep 17 00:00:00 2001 From: Aleksey Lim Date: Fri, 25 Dec 2009 15:34:56 +0000 Subject: Use only one directory level for sources --- (limited to 'brain.py') diff --git a/brain.py b/brain.py new file mode 100644 index 0000000..579d716 --- /dev/null +++ b/brain.py @@ -0,0 +1,116 @@ +# HablarConSara.activity +# A simple hack to attach a chatterbot to speak activity +# Copyright (C) 2008 Sebastian Silva Fundacion FuenteLibre sebastian@fuentelibre.org +# +# Style and structure taken from Speak.activity Copyright (C) Joshua Minor +# +# HablarConSara.activity is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# HablarConSara.activity is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with HablarConSara.activity. If not, see . + +import gtk +import gobject +from gettext import gettext as _ + +import logging +logger = logging.getLogger('speak') + +from toolkit.combobox import ComboBox + +import bot.aiml +import voice + +BOTS = { + _('Spanish'): { 'name': 'Sara', + 'brain': 'bot/sara.brn', + 'predicates': { 'nombre_bot': 'Sara', + 'botmaster': 'la comunidad Azucar' } }, + _('English'): { 'name': 'Alice', + 'brain': 'bot/alice.brn', + 'predicates': { 'name': 'Alice', + 'master': 'the Sugar Community' } } } + +# load Standard AIML set for restricted systems +if int([i for i in file('/proc/meminfo').readlines() + if i.startswith('MemTotal:')][0].split()[1]) < 524288: + BOTS[_('English')]['brain'] = 'bot/alisochka.brn' + +_kernel = None +_kernel_voice = None + + +def get_default_voice(): + default_voice = voice.defaultVoice() + if default_voice.friendlyname not in BOTS: + return voice.allVoices()[_('English')] + else: + return default_voice + + +def get_voices(): + voices = ComboBox() + for lang in sorted(BOTS.keys()): + voices.append_item(voice.allVoices()[lang], lang) + return voices.get_model() + + +def respond(voice, text): + if _kernel is None: + return text + else: + return _kernel.respond(text) + + +def load(activity, voice, sorry=None): + if voice == _kernel_voice: + return False + + old_cursor = activity.get_cursor() + activity.set_cursor(gtk.gdk.WATCH) + + def load_brain(): + global _kernel + global _kernel_voice + + is_first_session = _kernel is None + + try: + brain = BOTS[voice.friendlyname] + logger.debug('Load bot: %s' % brain) + + kernel = bot.aiml.Kernel() + kernel.loadBrain(brain['brain']) + for name, value in brain['predicates'].items(): + kernel.setBotPredicate(name, value) + + if _kernel is not None: + del _kernel + _kernel = None + import gc + gc.collect() + + _kernel = kernel + _kernel_voice = voice + finally: + activity.set_cursor(old_cursor) + + if is_first_session: + hello = _("Hello, I'am a robot \"%s\". Ask me any question.") \ + % BOTS[voice.friendlyname]['name'] + if sorry: + hello += ' ' + sorry + activity.face.say_notification(hello) + elif sorry: + activity.face.say_notification(sorry) + + gobject.idle_add(load_brain) + return True -- cgit v0.9.1