#include #include #include #include #include #include #include #include "SpkDiarizationDialog.h" SpkDiarizationDialog::SpkDiarizationDialog(const QString &title, bool local, bool view, QWidget *parent) : QDialog(parent), m_dist(UtteranceTree::Mahal), m_agrCrit(UtteranceTree::Ward), m_partMeth(UtteranceTree::Silhouette), m_base(false), m_refSpk(false), m_sigma(false), m_local(local) { setWindowTitle(title); QGroupBox *methBox = new QGroupBox("Local clustering method:"); QRadioButton *hier = new QRadioButton("Bottom-Up hierarchical clustering"); QRadioButton *base = new QRadioButton("Baseline"); QRadioButton *refSpk = new QRadioButton("Reference speakers"); hier->setChecked(true); QGridLayout *methLayout = new QGridLayout; methLayout->addWidget(hier, 0, 0); methLayout->addWidget(base, 1, 0); methLayout->addWidget(refSpk, 2, 0); methBox->setLayout(methLayout); m_ubm = new QCheckBox(tr("New GMM/UBM")); m_ubm->hide(); QGroupBox *distBox = new QGroupBox("Distance between utterance vectors:"); m_l2 = new QRadioButton("L2"); m_mahal = new QRadioButton("Mahalanobis"); m_mahal->setChecked(true); QGridLayout *distLayout = new QGridLayout; distLayout->addWidget(m_l2, 0, 0); distLayout->addWidget(m_mahal, 0, 1); distBox->setLayout(distLayout); m_norm = new QCheckBox(tr("Normalize vectors")); m_norm->setChecked(true); QGroupBox *covBox = new QGroupBox("Covariance matrix:"); QChar sigmaChar(0xa3, 0x03); QRadioButton *sigma = new QRadioButton(sigmaChar); QRadioButton *w = new QRadioButton("W"); w->setChecked(true); QGridLayout *covLayout = new QGridLayout; covLayout->addWidget(sigma, 0, 0); covLayout->addWidget(w, 0, 1); covBox->setLayout(covLayout); QGroupBox *agrBox = new QGroupBox("Aggregation criterion:"); QRadioButton *min = new QRadioButton("Min."); QRadioButton *max = new QRadioButton("Max."); QRadioButton *mean = new QRadioButton("Mean"); QRadioButton *ward = new QRadioButton("Ward"); ward->setChecked(true); QGridLayout *agrLayout = new QGridLayout; agrLayout->addWidget(min, 0, 0); agrLayout->addWidget(max, 0, 1); agrLayout->addWidget(mean, 0, 2); agrLayout->addWidget(ward, 0, 3); agrBox->setLayout(agrLayout); QGroupBox *partBox = new QGroupBox("Method used to select the best partition:"); QRadioButton *sil = new QRadioButton("Silhouette"); QRadioButton *bip = new QRadioButton("Bipartition"); sil->setChecked(true); QGridLayout *partLayout = new QGridLayout; partLayout->addWidget(sil, 0, 0); partLayout->addWidget(bip, 0, 1); partBox->setLayout(partLayout); m_weight = new QCheckBox(tr("Weight Utterances")); QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel); QGridLayout *gridLayout = new QGridLayout; gridLayout->addWidget(methBox, 0, 0); gridLayout->addWidget(m_ubm, 1, 0); gridLayout->addWidget(distBox, 2, 0); gridLayout->addWidget(covBox, 3, 0); gridLayout->addWidget(m_norm, 4, 0); gridLayout->addWidget(agrBox, 5, 0); gridLayout->addWidget(partBox, 6, 0); gridLayout->addWidget(m_weight, 7, 0); gridLayout->addWidget(buttonBox, 8, 0, 1, 2, Qt::AlignHCenter); setLayout(gridLayout); // hide options in case of view request if (view) { methBox->hide(); distBox->hide(); covBox->hide(); m_norm->hide(); agrBox->hide(); partBox->hide(); m_weight->hide(); } // connecting signals to corresponding slots connect(m_l2, SIGNAL(clicked()), this, SLOT(activL2())); connect(m_l2, SIGNAL(clicked(bool)), covBox, SLOT(setDisabled(bool))); connect(m_mahal, SIGNAL(clicked()), this, SLOT(activMahal())); connect(m_mahal, SIGNAL(clicked(bool)), covBox, SLOT(setEnabled(bool))); connect(sigma, SIGNAL(clicked()), this, SLOT(activSigma())); connect(w, SIGNAL(clicked()), this, SLOT(activW())); connect(min, SIGNAL(clicked()), this, SLOT(activMin())); connect(max, SIGNAL(clicked()), this, SLOT(activMax())); connect(mean, SIGNAL(clicked()), this, SLOT(activMean())); connect(ward, SIGNAL(clicked()), this, SLOT(activWard())); connect(sil, SIGNAL(clicked()), this, SLOT(activSilhouette())); connect(bip, SIGNAL(clicked()), this, SLOT(activBipartition())); connect(base, SIGNAL(clicked()), this, SLOT(activBase())); connect(hier, SIGNAL(clicked()), this, SLOT(activHier())); connect(refSpk, SIGNAL(clicked()), this, SLOT(activRefSpk())); connect(base, SIGNAL(clicked(bool)), m_ubm, SLOT(setDisabled(bool))); connect(base, SIGNAL(clicked(bool)), distBox, SLOT(setDisabled(bool))); connect(base, SIGNAL(clicked(bool)), covBox, SLOT(setDisabled(bool))); connect(base, SIGNAL(clicked(bool)), m_norm, SLOT(setDisabled(bool))); connect(base, SIGNAL(clicked(bool)), agrBox, SLOT(setDisabled(bool))); connect(base, SIGNAL(clicked(bool)), partBox, SLOT(setDisabled(bool))); connect(base, SIGNAL(clicked(bool)), m_weight, SLOT(setDisabled(bool))); connect(refSpk, SIGNAL(clicked(bool)), m_ubm, SLOT(setDisabled(bool))); connect(refSpk, SIGNAL(clicked(bool)), distBox, SLOT(setDisabled(bool))); connect(refSpk, SIGNAL(clicked(bool)), covBox, SLOT(setDisabled(bool))); connect(refSpk, SIGNAL(clicked(bool)), m_norm, SLOT(setDisabled(bool))); connect(refSpk, SIGNAL(clicked(bool)), agrBox, SLOT(setDisabled(bool))); connect(refSpk, SIGNAL(clicked(bool)), partBox, SLOT(setDisabled(bool))); connect(refSpk, SIGNAL(clicked(bool)), m_weight, SLOT(setDisabled(bool))); connect(hier, SIGNAL(clicked(bool)), m_ubm, SLOT(setEnabled(bool))); connect(hier, SIGNAL(clicked(bool)), distBox, SLOT(setEnabled(bool))); connect(hier, SIGNAL(clicked(bool)), covBox, SLOT(setEnabled(bool))); connect(hier, SIGNAL(clicked(bool)), m_norm, SLOT(setEnabled(bool))); connect(hier, SIGNAL(clicked(bool)), agrBox, SLOT(setEnabled(bool))); connect(hier, SIGNAL(clicked(bool)), partBox, SLOT(setEnabled(bool))); connect(hier, SIGNAL(clicked(bool)), m_weight, SLOT(setEnabled(bool))); connect(buttonBox, SIGNAL(accepted()), this, SLOT(accept())); connect(buttonBox, SIGNAL(rejected()), this, SLOT(reject())); } /////////////// // accessors // /////////////// QString SpkDiarizationDialog::getSpeakersFName() const { return m_speakersFName; } UtteranceTree::DistType SpkDiarizationDialog::getDist() const { return m_dist; } UtteranceTree::AgrCrit SpkDiarizationDialog::getAgrCrit() const { return m_agrCrit; } UtteranceTree::PartMeth SpkDiarizationDialog::getPartMeth() const { return m_partMeth; } bool SpkDiarizationDialog::getBase() const { return m_base; } bool SpkDiarizationDialog::getRefSpk() const { return m_refSpk; } bool SpkDiarizationDialog::getNorm() const { return m_norm->isChecked(); } bool SpkDiarizationDialog::getWeight() const { return m_weight->isChecked(); } bool SpkDiarizationDialog::getSigma() const { return m_sigma; } bool SpkDiarizationDialog::getUbm() const { return m_ubm->isChecked(); } /////////// // slots // /////////// void SpkDiarizationDialog::setSpeakersFName() { m_speakersFName = QFileDialog::getOpenFileName(this, tr("Open characters labels file"), tr("/home/xavier/Dropbox/tv_series_proc_tool/tools/spkDiarization/ivecs"), tr("Data File (*.csv)")); } void SpkDiarizationDialog::activL2() { m_dist = UtteranceTree::L2; } void SpkDiarizationDialog::activMahal() { m_dist = UtteranceTree::Mahal; } void SpkDiarizationDialog::activSigma() { m_sigma = true; } void SpkDiarizationDialog::activW() { m_sigma = false; } void SpkDiarizationDialog::activMin() { m_agrCrit = UtteranceTree::Min; } void SpkDiarizationDialog::activMax() { m_agrCrit = UtteranceTree::Max; } void SpkDiarizationDialog::activMean() { m_agrCrit = UtteranceTree::Mean; } void SpkDiarizationDialog::activWard() { m_agrCrit = UtteranceTree::Ward; update(); } void SpkDiarizationDialog::activSilhouette() { m_partMeth = UtteranceTree::Silhouette; } void SpkDiarizationDialog::activBipartition() { m_partMeth = UtteranceTree::Bipartition; } void SpkDiarizationDialog::activBase() { m_base = true; m_refSpk = false; } void SpkDiarizationDialog::activHier() { m_base = false; m_refSpk = false; } void SpkDiarizationDialog::activRefSpk() { m_base = false; m_refSpk = true; }