Skip to content
Snippets Groups Projects
main.py 5.47 KiB
Newer Older
Benoit Favre's avatar
Benoit Favre committed
#!/usr/bin/env python2

import sys
import os
Benoit Favre's avatar
Benoit Favre committed
import glob, re
Benoit Favre's avatar
Benoit Favre committed

# set to location of libgstkaldionline2.so
directory = os.path.dirname(__file__) or '.'
os.environ['GST_PLUGIN_PATH'] = directory + '/asr/'
Benoit Favre's avatar
Benoit Favre committed
os.environ['GTK_THEME'] = 'light'
print 'gst plugin path =', os.environ['GST_PLUGIN_PATH']
Benoit Favre's avatar
Benoit Favre committed

# import gtk stuff
from threading import Thread
import gi
gi.require_version('Gst', '1.0')
from gi.repository import GObject, Gst, Gtk, Gdk
GObject.threads_init()
Gdk.threads_init()
Gst.init(None)

# make sure ctrl-c works
import signal
signal.signal(signal.SIGINT, signal.SIG_DFL)

# import local stuff
import confirm, asr, actions, xmlview_widgets
import sections
import levenstein, SLU, osc
Benoit Favre's avatar
Benoit Favre committed

class ScriptedASR(Gtk.Window):
    def __init__(self, xml_filename, asr_config_file, osc_host, osc_port):
Benoit Favre's avatar
Benoit Favre committed
        super(ScriptedASR, self).__init__()

        osc.setup(osc_host, osc_port)

Benoit Favre's avatar
Benoit Favre committed
        self.connect("destroy", self.quit)
        self.set_default_size(1024, 768)
Benoit Favre's avatar
Benoit Favre committed
        self.set_border_width(10)
        self.set_title('ASR Transcript [xml=%s asr=%s osc=%s:%s]' % (xml_filename, asr_config_file, osc_host, osc_port))
Benoit Favre's avatar
Benoit Favre committed
        vbox = Gtk.VBox()

        self.sections = sections.SectionManager()
Benoit Favre's avatar
Benoit Favre committed
        vbox.pack_start(self.sections, False, True, 5)
Benoit Favre's avatar
Benoit Favre committed

        self.xmlview = xmlview_widgets.XmlView(xml_filename)
        vbox.pack_start(self.xmlview, True, True, 5)
        self.lines = [x for x in self.xmlview.get_line_iterator()]
        self.current_line = -1
Benoit Favre's avatar
Benoit Favre committed
        self.xmlview.set_action_clicked_handler(self.keyword_clicked)
Benoit Favre's avatar
Benoit Favre committed
        self.confirmer = confirm.ConfirmationBox()
        vbox.pack_start(self.confirmer, False, True, 5)
        #self.actions = action.ActionView()
        #vbox.pack_start(self.actions, False, True, 5)
Benoit Favre's avatar
Benoit Favre committed
        self.sections.set_confirmer(self.confirmer)
        #self.actions.set_confirmer(self.confirmer)
Benoit Favre's avatar
Benoit Favre committed
        self.sections.set_highlight(self.xmlview)
        self.sections.set_section(1)

Benoit Favre's avatar
Benoit Favre committed
        # transcript view
Benoit Favre's avatar
Benoit Favre committed
        self.asr = asr.ASR(asr_config_file, self.hyp_changed, self.hyp_changed)
Benoit Favre's avatar
Benoit Favre committed
        vbox.pack_start(self.asr, False, True, 5)

Benoit Favre's avatar
Benoit Favre committed
        # slu
        prefix = 'slu/automate/homeostasis_25nov_%s'
        self.slu = {}
        for section_fst in glob.glob(prefix % 'section*.fst'):
            found = re.search('section(\d+)\.fst$', section_fst)
            if found:
                print section_fst
                section_id = int(found.group(1))
                self.slu[section_id] = SLU.SLU(prefix % 'dico_word.txt', prefix % 'dico_action.txt', section_fst, prefix % 'clean_tail.fst')

Benoit Favre's avatar
Benoit Favre committed
        self.add(vbox)
        self.show_all()

Benoit Favre's avatar
Benoit Favre committed
        self.confirmer.hide()
Benoit Favre's avatar
Benoit Favre committed

        # load css style
        style_provider = Gtk.CssProvider()
        style_provider.load_from_data(open('data/style.css', 'rb').read())
        Gtk.StyleContext.add_provider_for_screen( Gdk.Screen.get_default(), style_provider, Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION)

    def line_clicked(self, widget, event):
        if self.current_line >= 0:
            self.lines[self.current_line].highlight(False)
        for i, line in enumerate(self.lines):
            if widget is line:
                self.current_line = i
                self.lines[self.current_line].highlight(True)

Benoit Favre's avatar
Benoit Favre committed
    def keyword_clicked(self, action):
        self.confirmer.confirm('Force action \"%s\"?' % action, 3, None)

Benoit Favre's avatar
Benoit Favre committed
    def hyp_changed(self, hyp):
        #hyp = ' '.join(hyp).replace('[noise]', ' ').split()
        words = hyp[-1].strip().replace('_', ' ').split()
Benoit Favre's avatar
Benoit Favre committed
        section_id = self.sections.get_section()
        print section_id, self.slu.keys()
        if section_id in self.slu:
            print 'SLU: ', section_id
            slu = self.slu[section_id]
            previous_actions = slu.num_actions()
            slu.process(words)
            for action_id in range(previous_actions, slu.num_actions()):
                action = slu.get_action(action_id)
                self.confirmer.confirm('Perform action \"%s\"?' % action, 3, None)

        #if self.current_line >= len(self.lines) - 1:
        #    print "FINISHED"
        #    return
        #line = self.lines[self.current_line + 1].text.split()
        #import levenstein
        #num_errors, num_ref, alignment, score = levenstein.align(line, words)
        #num_matches = 0
        #for ref_word, hyp_word in alignment:
        #    if ref_word == hyp_word and ref_word != None:
        #        num_matches += 1
        #score = float(num_matches) / max(len(line), len(words))
        #print 'ASR:', hyp[-1], 'REF:', self.lines[self.current_line + 1].text, 'score:', score
        #levenstein.print_alignment(alignment)
        #if score >= 0.5:
        #    if self.current_line >= 0:
        #        self.lines[self.current_line].highlight(False)
        #    self.current_line += 1
        #    self.lines[self.current_line].highlight(True)
Benoit Favre's avatar
Benoit Favre committed

    def quit(self, window):
Benoit Favre's avatar
Benoit Favre committed
        for slu in self.slu.values():
            slu.shutdown()
Benoit Favre's avatar
Benoit Favre committed
        Gtk.main_quit()


if __name__ == '__main__':
Benoit Favre's avatar
Benoit Favre committed
    import selector
    xml_filename = 'data/homeostasis_25nov.xml'
Benoit Favre's avatar
Benoit Favre committed
    asr_config_file = 'asr/mika-fred-1.cfg'
Benoit Favre's avatar
Benoit Favre committed
    asr_config_file = 'asr/fisher-benoit-1.cfg'
Benoit Favre's avatar
Benoit Favre committed
    if len(sys.argv) > 1:
        xml_filename = sys.argv[1]
    if len(sys.argv) > 2:
Benoit Favre's avatar
Benoit Favre committed
        asr_config_file = sys.argv[2]
    xml_filename, asr_config_file, osc_host, osc_port = selector.ModelSelector(xml_filename, asr_config_file).run()
    if xml_filename == None or asr_config_file == None or osc_host == None or osc_port == None:
Benoit Favre's avatar
Benoit Favre committed
        sys.exit(0)
    app = ScriptedASR(xml_filename, asr_config_file, osc_host, osc_port)
Benoit Favre's avatar
Benoit Favre committed
    Gtk.main()