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
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