# 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 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' } } } def get_mem_info(tag): meminfo = file('/proc/meminfo').readlines() return int([i for i in meminfo if i.startswith(tag)][0].split()[1]) # load Standard AIML set for restricted systems if get_mem_info('MemTotal:') < 524288: mem_free = get_mem_info('MemFree:') + get_mem_info('Cached:') if mem_free < 102400: BOTS[_('English')]['brain'] = None else: 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 not None: text = _kernel.respond(text) if _kernel is None or not text: text = _("Sorry, I can't understand what you are asking about.") return 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 = aiml.Kernel() if brain['brain'] is None: warning = _("Sorry, there is no free memory to load my " \ "brain. Close other activities and try once more.") activity.face.say_notification(warning) return 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'm 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