示例#1
0
class MainWindow(QtGui.QMainWindow):
    def __init__(self):
        super(MainWindow, self).__init__()
        self.setWindowTitle("supervisor Interface")
        self.__mutex__ = QtCore.QMutex()

        self.__log__()
        self.__setting__()
        self.createActions()
        self.createMenus()
        self.__rpc__ = None
        self.centralWidget = CentralWidget(None, (self.settings, self.__mutex__) )

        self.statusBar().showMessage("Ready")


    def __setting__(self):
        print "get setting"
        #self.settings = QSettings(QSettings.IniFormat,QSettings.SystemScope, '__ILLUSTRABOT2OO', '__settings')
        self.settings = QSettings(QSettings.IniFormat,QSettings.UserScope, '__ILLUSTRABOT2OO', '__settings')
        self.settings.setFallbacksEnabled(False)    # File only, not registry or or.
        
        self.__mutex__.lock()
        self.settings.beginGroup("Main")
        self.resize(self.settings.value("size", QtCore.QSize(1024, 850)))
        self.move(self.settings.value("pos", QtCore.QPoint(50, 50)))
        self.ip = self.settings.value("ip",  r'172.25.195.58')
        print "previous IP=",self.ip
        
        self.settings.endGroup()
        self.__mutex__.unlock()


    def __log__(self):
        self.windowlog = {}


    def rpc(self):
        # Try to connect to a board
        print self.ip
        text, ok = QtGui.QInputDialog.getText(self, self.tr("Board IP"),
                                              self.tr("IP address:"), QtGui.QLineEdit.Normal,
                                              self.ip)

        if ok and not (len(text) ==0):
            try:
                self.__rpc__ = xmlrpclib.ServerProxy("http://%s:8000"%str(text))
                self.statusBar().showMessage("Connected...")
                self.centralWidget.setrpc(self.__rpc__) 
                self.__get_level__()
                self.setCentralWidget(self.centralWidget)
                self.ip= str(text)
            except Exception,e:
                self.statusBar().showMessage("Failed to connect to %s"%text)
                sys.stderr.write( str(e))
                traceback.print_exc(file=sys.stderr)
                pass
            

        return
示例#2
0
class MainWindow(QtGui.QMainWindow):
    def __init__(self):
        super(MainWindow, self).__init__()
        self.setWindowTitle("supervisor Interface")
        self.__mutex__ = QtCore.QMutex()

        self.__log__()
        self.__setting__()
        self.createActions()
        self.createMenus()
        self.__rpc__ = None
        self.centralWidget = CentralWidget(None,
                                           (self.settings, self.__mutex__))

        self.statusBar().showMessage("Ready")

    def __setting__(self):
        print "get setting"
        self.settings = QSettings(QSettings.IniFormat, QSettings.SystemScope,
                                  '__SUPERVISOR', '__settings')
        self.settings.setFallbacksEnabled(
            False)  # File only, not registry or or.

        self.__mutex__.lock()
        self.settings.beginGroup("Main")
        self.resize(self.settings.value("size", QtCore.QSize(1024, 850)))
        self.move(self.settings.value("pos", QtCore.QPoint(50, 50)))
        self.ip = self.settings.value("ip", r'172.25.195.58')
        print "previous IP=", self.ip

        self.settings.endGroup()
        self.__mutex__.unlock()

    def __log__(self):
        self.windowlog = {}

    def rpc(self):
        # Try to connect to a board
        print self.ip
        text, ok = QtGui.QInputDialog.getText(self, self.tr("Board IP"),
                                              self.tr("IP address:"),
                                              QtGui.QLineEdit.Normal, self.ip)

        if ok and not (len(text) == 0):
            try:
                self.__rpc__ = xmlrpclib.ServerProxy("http://%s:8000" %
                                                     str(text))
                self.statusBar().showMessage("Connected...")
                self.centralWidget.setrpc(self.__rpc__)
                self.__get_level__()
                self.setCentralWidget(self.centralWidget)
                self.ip = str(text)
            except Exception, e:
                self.statusBar().showMessage("Failed to connect to %s" % text)
                sys.stderr.write(str(e))
                traceback.print_exc(file=sys.stderr)
                pass

        return
class MainWindow(QMainWindow):
    def __init__(self):
        super(MainWindow, self).__init__()
        self.setMinimumSize(1000, 800)

        self.settings = QSettings('settings.ini',QSettings.IniFormat)
        self.settings.setFallbacksEnabled(False)

        self.resize(self.settings.value('size', QSize(270, 225)))
        self.move(self.settings.value('pos', QPoint(50, 50)))
        self.speakerTable = TableWidget(self)
        self.dialogTable = TableWidget(self)
        self.tokenTable = TableWidget(self)
        self.speakerTable.setSortingEnabled(True)
        self.speakers = SpeakerTable()
        self.dialogs = DialogTable()
        self.tokens = WordTokenTable()
        self.speakerTable.setModel(self.speakers)
        self.dialogTable.setModel(self.dialogs)
        self.tokenTable.setModel(self.tokens)
        speakerSelectionModel = QItemSelectionModel(self.speakers)
        speakerSelectionModel.selectionChanged.connect(self.lookupDialogs)
        self.speakerTable.setSelectionModel(speakerSelectionModel)
        dialogSelectionModel = QItemSelectionModel(self.dialogs)
        dialogSelectionModel.selectionChanged.connect(self.lookupTokens)
        self.dialogTable.setSelectionModel(dialogSelectionModel)
        self.wrapper = QWidget()
        layout = QHBoxLayout(self.wrapper)
        layout.addWidget(self.speakerTable)
        layout.addWidget(self.dialogTable)
        layout.addWidget(self.tokenTable)
        self.wrapper.setLayout(layout)
        self.setCentralWidget(self.wrapper)

        self.engine_string = self.settings.value('engine_string','sqlite:///dev.db')
        self.engine = create_engine(self.engine_string)
        self.setUpCorpus()

        self.setWindowTitle("Exemplar Network Explorer")
        self.createActions()
        self.createMenus()
        
        #self.loadWordTokens()

    def lookupDialogs(self,sel):
        ind = sel.indexes()
        
        if len(ind) == 1:
            DBSession = sessionmaker(bind=self.engine)
            session = DBSession()
            s = self.speakerTable.model().query[ind[0].row()]
            print(s)
            qs = session.query(Dialog).filter_by(speaker_id=s.id).all()
            print(session.query(Dialog).all())
            print(qs)
            self.dialogTable.setModel(DialogTable(query=qs))
            
    def lookupTokens(self,sel):
        ind = sel.indexes()
        
        if len(ind) == 1:
            DBSession = sessionmaker(bind=self.engine)
            session = DBSession()
            d = self.dialogTable.model().query[ind[0].row()]
            qs = session.query(WordToken).filter_by(dialog_id=d.id).all()
            self.tokenTable.setModel(WordTokenTable(query=qs))
        

    def createActions(self):

        self.loadCorpusAct = QAction( "&Load corpus from folder",
                self, shortcut=QKeySequence.Open,
                statusTip="Load corpus from folder", triggered=self.loadCorpus)
                
        self.exportTokensAct = QAction( "&Export tokens to folder",
                self, shortcut=QKeySequence.Save,
                statusTip="Export tokens to folder", triggered=self.exportTokens)

        #self.editPreferencesAct = QAction( "&Preferences...",
        #        self,
        #        statusTip="Edit preferences", triggered=self.editPreferences)

        #self.specgramAct = QAction( "&View token spectrogram",
                #self,
                #statusTip="View token spectrogram", triggered=self.specgram)

        #self.detailsAct = QAction( "&View token details",
                #self,
                #statusTip="View token details", triggered=self.details)

        #self.envelopeAct = QAction( "&View token envelopes",
                #self,
                #statusTip="View token amplitude envelopes", triggered=self.envelope)

        #self.playfileAct = QAction( "&Play token",
                #self,
                #statusTip="Play token", triggered=self.playfile)

        self.quitAct = QAction("&Quit", self, shortcut="Ctrl+Q",
                statusTip="Quit the application", triggered=self.close)

        self.aboutAct = QAction("&About", self,
                statusTip="Show the application's About box",
                triggered=self.about)

    def exportTokens(self):
        export_path = QFileDialog.getExistingDirectory(self,
                "Choose a directory")
        if not export_path:
            return
        corpus_path = self.settings.value('path','')
        DBSession = sessionmaker(bind=self.engine)
        session = DBSession()
        qs = session.query(WordToken)
        print(qs)
        qs = qs.join(WordToken.wordtype)
        print(qs)
        qs = qs.join(WordToken.dialog)
        print(qs)
        qs = qs.filter(WordType.orth.in_(GOOD_WORDS)).order_by(Dialog.id)
        cur_dialog = ''
        for wt in qs:
            #if not wt.wordtype.is_word():
            #   continue
            if cur_dialog != wt.dialog.number:
                apath = os.path.join(corpus_path,'Processed','%sa.wav' % wt.dialog.number)
                bpath = os.path.join(corpus_path,'Processed','%sb.wav' % wt.dialog.number)
                if os.path.exists(apath):
                    sr, a = wavfile.read(apath)
                else:
                    a = None
                if os.path.exists(bpath):
                    sr, b = wavfile.read(bpath)
                else:
                    b = None
            filename = os.path.join(export_path,'%s_%s%s_%s_%d.wav' % (wt.dialog.speaker.number,
                                            wt.dialog.number,
                                            wt.dialog_part,
                                            wt.wordtype.orth,
                                            wt.id))
            
            begin = int(wt.begin * sr)
            end = int(wt.end * sr)
            if wt.dialog_part == 'a':
                out = a[begin:end]
            else:
                out = b[begin:end]
            newsr = 16000
            if newsr != sr:
                numt = int((wt.end - wt.begin) * 16000)
                out = resample(out,numt)
            wavfile.write(filename,sr,out)

    def loadCorpus(self):
        corpus_path = QFileDialog.getExistingDirectory(self,
                "Choose a directory")
        if not corpus_path:
            return
        self.settings.setValue('path',corpus_path)
        self.setUpCorpus()
        
    def setUpCorpus(self):
        if os.path.exists(os.path.split(self.engine_string)[1]):
            DBSession = sessionmaker(bind=self.engine)
            session = DBSession()
            q = session.query(Speaker).all()
            self.speakerTable.model().setQuery(q)
            return
        corpus_path = self.settings.value('path','')
        if corpus_path == '':
            return
        cat_file = os.path.join(corpus_path,'CategoryInfo.txt')
        speaker_file = os.path.join(corpus_path,'SpeakerInfo.txt')
        segment_file = os.path.join(corpus_path,'SegmentInfo.txt')
        if not os.path.exists(cat_file):
            return
        if not os.path.exists(speaker_file):
            return
        if not os.path.exists(segment_file):
            return
        Base.metadata.drop_all(self.engine)
        Base.metadata.create_all(self.engine)
        DBSession = sessionmaker(bind=self.engine)
        session = DBSession()
        speakers = parse_file(speaker_file)
         
        for s in speakers:
         
            new_speaker = Speaker(number=s['Number'],age=s['Age'],gender=s['Gender'])
            session.add(new_speaker)
        session.flush()
        q = session.query(Speaker).all()
        self.speakerTable.model().setQuery(q)
        #self.speakerTable.resizeColumnsToContents()
        
        categories = parse_file(cat_file)
        for c in categories:
            new_cat = Category(cat = c['Label'],
                                description = c['Description'],
                                categorytype = c['Type'])
            session.add(new_cat)
        session.flush()
        
        segs = parse_file(segment_file)
        for s in segs:
            new_st = SegmentType(phon = s['Label'],
                                syllabic = bool(int(s['Syllabic'])),
                                obstruent = bool(int(s['Obstruent'])),
                                nasal = bool(int(s['Nasal'])),
                                vowel = bool(int(s['Vowel'])))
            session.add(new_st)
        session.commit()
        
        for s in q:
            print(s.number)
            s.load_data(os.path.join(corpus_path,'Processed'),self.engine_string)
        
        

    def about(self):
        QMessageBox.about(self, "About Exemplar Network Explorer",
                "Placeholder "
                "Go on... ")

    #def editPreferences(self):
    #    dialog = PreferencesDialog(self,self.settings)
    #    result = dialog.exec_()
    #    if result:
    #        self.settings = dialog.settings
    #        self.loadWordTokens()

    def createMenus(self):
        self.fileMenu = self.menuBar().addMenu("&File")
        self.fileMenu.addAction(self.loadCorpusAct)
        self.fileMenu.addAction(self.exportTokensAct)
        self.fileMenu.addSeparator()
        self.fileMenu.addAction(self.quitAct)

        self.editMenu = self.menuBar().addMenu("&Edit")
        #self.editMenu.addAction(self.editPreferencesAct)

        self.viewMenu = self.menuBar().addMenu("&View")

        self.menuBar().addSeparator()

        self.helpMenu = self.menuBar().addMenu("&Help")
        self.helpMenu.addAction(self.aboutAct)


    def closeEvent(self, e):
        self.settings.setValue('size', self.size())
        self.settings.setValue('pos', self.pos())
        e.accept()
class Settings(object):

    key_to_ini = {'path': ('general/path',''),
                    'size':('size', QSize(270, 225)),
                    'pos': ('pos', QPoint(50, 50)),
                    'rep': ('general/Representation','mfcc'),
                    'freq_lims': [('general/MinFreq',80),('general/MaxFreq',7800)],
                    'win_len': ('general/WindowLength',0.025),
                    'time_step': ('general/TimeStep',0.01),
                    'num_cores': ('general/NumCores',1),
                    'num_coeffs': ('mfcc/NumCC',20),
                    'mfcc_filters': ('mfcc/NumFilters',26),
                    'use_power': ('mfcc/UsePower',False),
                    'envelope_bands': ('envelopes/NumBands',4),
                    'use_gammatone': ('envelopes/UseGammatone',False),
                    'use_window': ('envelopes/UseWindow',False),
                    'dist_func': ('network/DistanceFunction','dtw'),
                    'cluster_alg': ('network/ClusterAlgorithm','complete'),
                    'one_cluster': ('network/OneCluster',False),
                    'threshold': ('network/Threshold',0),
                    'spec_win_len':('spectrogram/WindowLength',0.005),
                    'spec_win_type':('spectrogram/WindowType','gaussian'),
                    'spec_freq_steps':('spectrogram/FreqSteps',250),
                    'spec_time_steps':('spectrogram/TimeSteps',1000),
                    'spec_autoscale':('spectrogram/Autoscale',True),
                    'spec_dynamic_range':('spectrogram/DynamicRange',70),
                    'spec_max':('spectrogram/Maximum',100),
                    'spec_alpha':('spectrogram/PreEmphAlpha',0.97)}

    rep_setting_keys = ['rep','freq_lims','win_len','time_step','num_coeffs',
                'mfcc_filters','envelope_bands','use_power','num_cores',
                'use_gammatone', 'use_window']

    asim_kwarg_keys = ['rep','freq_lims','win_len','time_step','num_coeffs',
                'num_filters','use_power','num_cores','dist_func']

    network_setting_keys = ['dist_func', 'cluster_alg', 'one_cluster', 'threshold']

    specgram_setting_keys = ['spec_win_len','spec_win_type','spec_freq_steps',
                            'spec_time_steps','spec_autoscale', 'spec_dynamic_range',
                            'spec_max','spec_alpha']

    def __init__(self):
        self.qs = QSettings('settings.ini',QSettings.IniFormat)
        self.qs.setFallbacksEnabled(False)

    def __getitem__(self, key):
        if key == 'num_filters':
            if self['rep'] == 'mfcc':
                return self['mfcc_filters']
            elif self['rep'] == 'envelopes':
                return self['envelope_bands']

        mapped_key = self.key_to_ini[key]
        if isinstance(mapped_key, list):
            return tuple(type(d)(self.qs.value(k,d)) for k, d in mapped_key)
        else:
            inikey, default = mapped_key
            return type(default)(self.qs.value(inikey,default))

    def __setitem__(self, key, value):
        mapped_key = self.key_to_ini[key]
        if isinstance(mapped_key, list):
            if not isinstance(value,list) and not isinstance(value,tuple):
                raise(KeyError)
            if len(mapped_key) != len(value):
                raise(KeyError)
            for i,(k, d) in enumerate(mapped_key):
                self.qs.setValue(k,value[i])
        else:
            inikey, default = mapped_key
            self.qs.setValue(inikey,value)


    def update(self,setting_dict):
        for k,v in setting_dict.items():
            self[k] = v

    def acousticsim_kwarg(self):
        out = {x: self[x] for x in self.asim_kwarg_keys}
        out['return_rep'] = True
        return out

    def get_rep_settings(self):
        out = {x: self[x] for x in self.rep_setting_keys}
        return out

    def get_network_settings(self):
        out = {x: self[x] for x in self.network_setting_keys}
        return out

    def get_specgram_settings(self):
        out = {x: self[x] for x in self.specgram_setting_keys}
        return out