Newer
Older
class SLU:
#/src.new/rocio_slu -word "$prefix"_dico_word.txt -action "$prefix"_dico_action.txt -fstmodel "$prefix".fst -fstclean "$prefix"_clean_tail.fst
def __init__(self, word_lexicon, action_lexicon, model_fst, cleaner_fst, library='slu/src/librocio_slu.so'):
if _backend == None:
_backend = cdll.LoadLibrary(library)
# slu_t* init_slu(char* chfileword, char* chfileaction, char* chfilemodel, char* chfileclean);
_backend.init_slu.argtypes = [c_char_p, c_char_p, c_char_p, c_char_p]
_backend.init_slu.restype = c_void_p
# int run_slu(slu_t* slu, char** words, int num_words, int prevn, char* prevword);
_backend.run_slu.argtypes = [c_void_p, POINTER(c_char_p), c_int, c_int, c_char_p]
_backend.run_slu.restype = c_void_p # c_char_p with manual memory management
# int num_actions(slu_t* slu)
_backend.num_actions.argtypes = [c_void_p]
_backend.num_actions.restype = c_int
# int get_actions(slu_t* slu)
_backend.get_actions.argtypes = [c_void_p]
_backend.get_actions.restype = c_void_p
# int get_action(slu_t* slu, int index)
_backend.get_action.argtypes = [c_void_p, c_int]
_backend.get_action.restype = c_char_p
# void reset_slu(slu_t* slu);
_backend.reset_slu.argtypes = [c_void_p]
_backend.reset_slu.restype = None
# void free_slu(slu_t* slu);
_backend.free_slu.argtypes = [c_void_p]
_backend.free_slu.restype = None
# void free(void*) from libc
_backend.free.argtypes = [c_void_p]
_backend.free.restype = None
_semaphore = threading.Semaphore()
_semaphore.acquire()
thread = threading.Thread(target=self._init_thread, args=[word_lexicon, action_lexicon, model_fst, cleaner_fst])
thread.daemon = True
thread.start()
def _init_thread(self, word_lexicon, action_lexicon, model_fst, cleaner_fst):
global _backend, _semaphore
self.slu = _backend.init_slu(word_lexicon, action_lexicon, model_fst, cleaner_fst)
def process(self, words, old_words, callback, async=True):
if async:
thread = threading.Thread(target=self._process_thread, args=[words, old_words, callback])
thread.daemon = True
thread.start()
else:
self._process_thread(words, old_words, callback)
def _process_thread(self, words, old_words, callback):
c_output = _backend.run_slu(self.slu, c_words, len(words), -1, old_words)
output = cast(c_output, c_char_p).value
_backend.free(c_output)
global _backend, _semaphore
output = _backend.num_actions(self.slu)
return output
def get_actions(self):
global _backend, _semaphore
c_output = _backend.get_actions(self.slu)
output = cast(c_output, c_char_p).value
_backend.free(c_output)
return output
global _backend, _semaphore
output = _backend.get_action(self.slu, index)
return output
def reset_slu(self):
global _backend, _semaphore
_semaphore.acquire()
_backend.reset_slu(self.slu)
_semaphore.release()
_backend.free_slu(self.slu)
if __name__ == '__main__':
prefix = 'slu/automate/homeostasis_25nov_%s'
slu = SLU(prefix % 'dico_word.txt', prefix % 'dico_action.txt', prefix % 'section6.fst', prefix % 'clean_tail.fst')
slu.process(open('slu/homeostasis_25nov.asr/sect6.ref').read().strip().split(), lambda x: sys.stdout.write('%s\n' % x))