enroll_list
时间: 2024-01-08 18:21:04 浏览: 36
enroll_list是一个CSV文件,用于存储注册(enroll)的音频文件的信息。每一行代表一个注册音频文件,包含以下信息:
- 音频文件的路径(path to enroll wav)
- 注册音频文件对应的说话人(speaker)
你可以根据需要修改enroll_list.csv文件,将其中的路径指向你本地的注册音频文件。然后,运行评估脚本scoring.py,该脚本会根据enroll_list.csv中的注册音频文件和test_list.csv中的测试音频文件进行评估,并将结果存储在res/results.csv文件中。
范例:<<引用:修改cfg/enroll_list.csv和cfg/test_list.csv以指向您本地的注册/测试 wav 文件 运行评估: python3 scoring.py 结果将存储在res/results.csv。>>
你可以通过修改enroll_list.csv文件来指定你本地的注册音频文件。然后,运行评估脚本scoring.py来进行评估,并将结果存储在results.csv文件中。
相关问题
wav_list = glob.glob("C:\ResNet\TIMIT\TEST\*\*\*.wav") print(f'找到{len(wav_list)}个训练音频') speaker_name_list = [] all_wav_list = [] speaker_wav_dict = dict({}) enroll_list = [] for wav in wav_list: wav_split = wav.split('\\') d_r = wav_split[-3] speaker_name = wav_split[-2] wav_name = wav_split[-1] speaker_name_list.append(speaker_name) wav_path = f"{d_r}\{speaker_name}\{wav_name}" all_wav_list.append(wav_path) if speaker_name in speaker_wav_dict: speaker_wav_dict[speaker_name].append(wav_path) else: speaker_wav_dict[speaker_name] = [wav_path] enroll_list.append(wav_path) SpeakerNameList = set(speaker_name_list) f = open("TIMIT-testlist.txt", 'w') num_pairs = 4000 for i in range(num_pairs): if i % 2 == 0: # label==1 wav1 = random.sample(enroll_list, 1)[0] id1 = wav1.split('\\')[-2] wav2 = random.sample(speaker_wav_dict[id1], 1)[0] label = 1 else: # label==0 wav1 = random.sample(enroll_list, 1)[0] id1 = wav1.split('\\')[-2] wav2 = random.sample(all_wav_list, 1)[0] id2 = wav2.split('-')[0] if id1 == id2: continue label = 0 f.write("{} .\{} .\{}\n".format(label, wav1, wav2)) f.close()
这段代码是在使用TIMIT数据集创建一份测试集清单文件(TIMIT-testlist.txt),其中包含4000对音频(wav1, wav2)以及它们的标签(label)。具体流程如下:
1. 使用glob模块匹配TIMIT数据集TEST文件夹中所有的.wav文件,并统计数量。
2. 遍历所有.wav文件,将它们的路径存入all_wav_list列表中,并将每个speaker的第一条音频加入enroll_list列表中。
3. 构建speaker_wav_dict字典,键为说话人ID,值为该说话人的所有音频路径列表。
4. 遍历num_pairs次,每次随机选择两个音频wav1和wav2,并给它们标上0或1的标签。
5. 如果标签为1,则从enroll_list列表中随机选择一个音频作为wav1,再从该说话人的所有音频中随机选择一个作为wav2。
6. 如果标签为0,则从enroll_list列表中随机选择一个音频作为wav1,再从all_wav_list列表中随机选择一个作为wav2。要求wav2所属的说话人与wav1不同。
7. 将每对wav1和wav2以及它们的标签写入TIMIT-testlist.txt文件中。
这份测试集清单文件可以用于测试说话人识别模型的准确率。
#include "myapp.h" myapp::myapp(QObject *parent) : QObject(parent) { //创建并打开SQLite数据库 this->mydb = new SqOperator; mydb->openDb(); //创建数据表 mydb->createTable(); //这里分别新建的是登录和注册两个对象 this->login = new mylogin; this->login->show(); this->enroll = new myenroll; this->face = new chatInterface; this->tip = new tips; connect(login,&mylogin::sig_login,this,&myapp::judge); connect(login,&mylogin::sig_enroll,this,&myapp::show_enroll_face); connect(enroll,&myenroll::sig_enroll_info,this,&myapp::insertdb); } bool myapp::judge(QString usrname, QString usrpass) { qDebug()<<usrname<<usrpass; //查询全部数据,并且放入list中 QList<QString> list; mydb->queryTable(list); int i = 0; //当存在两个账号的时候,这里循环里面的if必定会进去,错误和正确都会提示,应该在正确之后直接结束判断,而错误提示则应该放在循环结束 for(i = 0 ; i < list.size() ; i=i+2) { if(usrname == list[i] || usrpass == list[i+1]) { this->face->show(); return true; } } this->tip->loginfail(); return false; } void myapp::show_enroll_face() { this->enroll->show(); } void myapp::insertdb(QString usrname,QString usrpass) { qDebug()<<usrname<<usrpass; info info1; info1.usrname = usrname; info1.usrpass = usrpass; if(mydb->singleInsertData(info1)) { this->tip->insertok(); } }用C++解释每一行代码的语法和作用
#include "myapp.h" //引入myapp.h头文件
myapp::myapp(QObject *parent) : QObject(parent) { //myapp类的构造函数,继承自QObject类,传入一个QObject类型的parent参数
//创建并打开SQLite数据库
this->mydb = new SqOperator; //创建SqOperator类的实例对象mydb
mydb->openDb(); //调用mydb对象的openDb()函数,打开SQLite数据库
//创建数据表
mydb->createTable(); //调用mydb对象的createTable()函数,创建数据表
//这里分别新建的是登录和注册两个对象
this->login = new mylogin; //创建mylogin类的实例对象login
this->login->show(); //调用login对象的show()函数,显示登录窗口
this->enroll = new myenroll; //创建myenroll类的实例对象enroll
this->face = new chatInterface; //创建chatInterface类的实例对象face
this->tip = new tips; //创建tips类的实例对象tip
//连接信号和槽
connect(login,&mylogin::sig_login,this,&myapp::judge); //将login对象的sig_login信号连接到myapp类的judge槽函数
connect(login,&mylogin::sig_enroll,this,&myapp::show_enroll_face); //将login对象的sig_enroll信号连接到myapp类的show_enroll_face槽函数
connect(enroll,&myenroll::sig_enroll_info,this,&myapp::insertdb); //将enroll对象的sig_enroll_info信号连接到myapp类的insertdb槽函数
}
bool myapp::judge(QString usrname, QString usrpass) { //myapp类的judge函数,返回值为bool类型,传入两个QString类型的参数usrname和usrpass
qDebug()<<usrname<<usrpass; //输出usrname和usrpass参数的值
//查询全部数据,并且放入list中
QList<QString> list; //创建QList<QString>类型的实例对象list
mydb->queryTable(list); //调用mydb对象的queryTable()函数,将查询结果存储到list对象中
int i = 0; //定义一个int类型的变量i并初始化为0
//当存在两个账号的时候,这里循环里面的if必定会进去,错误和正确都会提示,应该在正确之后直接结束判断,而错误提示则应该放在循环结束
for(i = 0 ; i < list.size() ; i=i+2) { //循环遍历list中的数据,每次循环i的值增加2
if(usrname == list[i] || usrpass == list[i+1]) { //如果usrname等于list[i]或usrpass等于list[i+1]
this->face->show(); //调用face对象的show()函数,显示聊天窗口
return true; //返回true
}
}
this->tip->loginfail(); //调用tip对象的loginfail()函数,弹出登录失败的提示框
return false; //返回false
}
void myapp::show_enroll_face() { //myapp类的show_enroll_face函数,无返回值,无参数
this->enroll->show(); //调用enroll对象的show()函数,显示注册窗口
}
void myapp::insertdb(QString usrname,QString usrpass) { //myapp类的insertdb函数,无返回值,传入两个QString类型的参数usrname和usrpass
qDebug()<<usrname<<usrpass; //输出usrname和usrpass参数的值
info info1; //创建info结构体的实例对象info1
info1.usrname = usrname; //将usrname赋值给info1结构体的usrname成员变量
info1.usrpass = usrpass; //将usrpass赋值给info1结构体的usrpass成员变量
if(mydb->singleInsertData(info1)) { //如果调用mydb对象的singleInsertData()函数插入数据成功
this->tip->insertok(); //调用tip对象的insertok()函数,弹出插入成功的提示框
}
}