IJCAI-信也科技杯全球AI大赛-华东师范大学亚军队伍分享

作者:彭欣怡(找不到工作版) 华东师范大学; 马千里(搬砖版) 虾皮;
指导:闫怡搏(科研版) 华东师范大学
比赛链接:https://ai.ppdai.com/mirror/goToMirrorDetailSix?mirrorId=34

前言

这是我们首次参加语音领域的比赛,最初只是抱着试一试的心态,想借此机会打磨一下DL的基本功。凭借一点点运气,我们最终斩获了亚军。同时,我们也有幸向包括来自小米AI实验室的冠军团队在内的众多优秀团队学习,收获颇丰。
非常庆幸能在如此大规模的语音比赛中拿到名次,我们也在IJCAI workshop (2024) 中分享了方案(还见到了周志华大佬,非常激动)。接下来,我们将从语音领域初学者的视角,分享一些在比赛中的方案与心得,希望能为大家带来一些启发,也期望能激励更多人工智能爱好者勇敢参与比赛,探索更多的可能性。

赛题背景

本次比赛的赛题聚焦于语音deepfake技术的深入研究,这是一项能够生成逼真伪造语音的前沿技术,但其背后潜藏的隐患不容忽视,对个人隐私和信息安全构成了严峻挑战。此次赛题由信也科技发起,旨在通过模拟真实场景,推动对伪造语音检测技术的研究与发展。在本题中,选手需要建模预测每条语音是否伪造。

数据描述

比赛数据集由真语音和假语音构成。真语音被定义为由一次录音生成的原始语音。假语音则是利用一种或多种技术手段,对真语音进行干预后产生的语音。为了更贴近现实世界的复杂性,主办方精心设计了一个多维度的数据集,涵盖了以下几个核心要点:
1.多语音:数据集中包含了多种不同来源的语音样本(约10+语种),模拟了信也在现实世界中可能遇到的多样化语音环境。
2.多来源:伪造方法非常多样,涵盖了从物理伪造到模型伪造的广泛手段。使用了数不胜数的TTS、VC伪造模型生成数据。
3.混杂对抗:为了模拟真实世界中的攻击场景,数据集中包含了各种对抗性样本,要求模型能够识别出这些经过特殊处理的伪造语音。测试集语音往往由多条连续录音/伪造样本进行混杂构成,以提高鉴别难度。
混杂对抗

数据样例
链接:https://pan.baidu.com/s/1yYLVc1dnPJLhmm0yrDJXxw?pwd=uifi
提取码:uifi

评价指标

本次比赛采用了异常检测领域中最常用的F1指标作为评价标准。由于测试集中正负样本的比例为1:1,因此未对recall和precision进行加权。然而,这道题目存在一项特殊的挑战:选手需要通过调整推理阈值,才能获得更高的F1得分。在quantile0.5决策平面附近的样本极具挑战性,难以准确区分,进一步增加了比赛的复杂性和竞争的激烈程度。

数据理解

针对比赛数据集,我们进行了深入细致的研究。测试集的语言分布相当广泛,涵盖了来自欧洲、亚洲等国家和地区的多种语言。此外,为了检验模型的实际应用价值,主办方在数据集中掺杂了大量由大模型生成的语音数据(我们甚至在测试集中听到了生成的丁真语音)。更为复杂的是,我们发现测试集中的大部分语音样本是由多种语言组合而成,有的甚至还混入了动物叫声和纯噪声数据。
数据分析

根据对数据的深入分析,我们展开了系统的思考,并为四种关键情况量身设计了解决方案。
① 为了让模型更好地适应多语言环境,利用Common Voice数据集填补了空缺,特别是加入了西班牙语、法语等测试集中出现频率较高的语言,并且使用了在多语言数据上预训练过的模型,从而增强模型的泛化能力。
② 为了提升模型在新数据上的表现,引入少量的multi-tts开源数据,旨在将问题从zero-shot转化为few-shot,从而为模型提供更多学习机会。
③ 面对异常样本严重不足的挑战,参考one-class分类理论,通过加入大量正常样本,使模型能够深入理解什么才是“正常”的语音特征,从而提高异常检测的准确性。
④ 为了有效应对混杂对抗样本(最关键的一步),我们精心设计了一套复杂的数据增强策略,旨在让模型在面对高度混杂的样本时,仍能保持卓越的辨识能力。

解题技巧

整体框架

在深入探讨技术细节之前,想先与大家分享一下我们整体的策略。这一策略可以用一句古老的智慧来概括——“三个臭皮匠,赛过诸葛亮”。正是秉持这种集思广益的理念,我们构建了一个由两个主要部分组成的框架。

整体框架

首先,我们构建了whisper的支线,它由经过微调的模型组成。我们特别挑选了whisper作为主要模型,因为它的聪明才智——也就是它的能力——经过在三个不同难度级别上精心设计的数据集微调后,表现得尤为出色。我们还通过引入voting机制,进一步提升模型的表现力,具体细节将在后续内容中详细介绍。(这一支线是最大贡献者。)
接下来是 “笨皮匠”部分,由MMS和AST模型以及决策树组成。虽然这两个模型没有经过微调,但它们在理解大量正常样本方面具有独特的优势。我们直接利用它们提取数据的特征表示,并基于这些信息训练我们的决策树模型。这种方法不仅简化了工程复杂度,同时也充分发挥了这些模型的长处,有助于提升我们最终方案的性能上限。
最终,将三组经过微调的whisper模型与预训练的决策树模型相结合,通过voting机制集成它们的预测结果,得出了最终的检测结果,使得模型在识别语音deepfake方面更加稳健和可靠。

技术细节

接下来,我们将深入探讨我们的关键技术细节,这些技术是我们这些语音小白的主要上分点。值得一提的是,部分技术其实是从其他领域迁移而来的,但经过巧妙的调整和应用,在语音任务中展现出了意想不到的效果。

关键技术1:数据增强

我们首先引入了频域和时域的数据增强技术,这是在语音竞赛中广受欢迎的策略。通过应用频域遮蔽(Freq Mask)和时域遮蔽(Time Mask),我们有效地迫使模型去学习更加鲁棒的特征,而这一点在本次赛题中显得尤为关键。这些技术通过对输入数据进行遮蔽和扭曲操作,不仅丰富了训练数据的多样性,还拓展了模型的数据分布,使得模型在面对从未见过的新数据时,依然能够保持出色的表现。
mask

关键技术2:Mixup数据增强

接下来要介绍的是Mixup数据增强方式,它为我们的模型性能带来了近2%的显著提升,我们得分的关键点。Mixup通过对不同样本进行凸组合,创造出新的虚拟样本,不仅增强了模型在语言切换场景中的适应能力,还从理论上优化了对近邻风险的建模,使得模型的判别边界更加平滑,从而大大提升了抗噪能力。
Mixup是我们在此次比赛中最重要的得分点,引入Mixup让模型在判别边界上不再过于紧凑,因而在应对噪声和对抗样本时表现得更加稳健。此外,从实践角度来看,测试集中包含大量语言切换样本,Mixup的操作让模型更好地适应了这一复杂场景,从而显著提升了最终得分。

我们的数据增强代码如下,在Mixup的设计上花了许多心思。

def clip(wave, min_length = 0.7, max_length = 0.9, sr = 16000):if len(wave) <= 15 * sr / 8:return wavelength = np.random.randint(int(len(wave) * min_length), int(len(wave) * max_length))start_idx = np.random.randint(0, len(wave) - length)return wave[start_idx:start_idx + length]def add_back_noise(wave, sr = 16000):noise, _ = librosa.load(np.random.choice(noise_paths), sr=sr)noise = np.tile(noise, 2 + int(np.ceil(len(wave) / len(noise))))return wave + noise[:len(wave)]def add_white_noise(wave):white_noise = np.random.randn(len(wave)) * np.random.uniform(0.001, 0.02)return wave + white_noisedef add_noise(wave):return add_back_noise(wave) if np.random.rand() < 0.8 else add_white_noise(wave)def pitch_shift(wave, sr = 16000):steps = 0while -1e-3 <= steps <= 1e-3:steps = np.random.uniform(-4, 4)return librosa.effects.pitch_shift(wave, sr=sr, n_steps=steps)def echo(wave, sr = 16000):delay = np.random.uniform(0.1, 0.5)attenuation = np.random.uniform(0.1, 0.5)delay_samples = int(delay * sr)echo_filter = np.zeros(delay_samples + 1)echo_filter[0] = 1echo_filter[-1] = attenuationreturn lfilter(echo_filter, 1, wave)def mixup(wave, other):if other is None:return waveother = clip(other)return np.concatenate((wave, other)) if np.random.rand() < 0.5 else np.concatenate((other, wave))def speedup(wave):rate = 1while (1 - 1e-3) < rate < (1 + 1e-3):rate = np.random.uniform(0.9, 1.1)return librosa.effects.time_stretch(wave, rate=rate)def resample(wave, orig_sr = 16000, mid_sr = 8000):wave = librosa.resample(wave, orig_sr=orig_sr, target_sr=mid_sr)wave = librosa.resample(wave, orig_sr=mid_sr, target_sr=orig_sr)return waveclass Collation():def __init__(self, train=True):self.train = trainself.feature_extractor = AutoFeatureExtractor.from_pretrained(dirs)def collate_fn(self, batch):sr = 16000labels, inputs, mixups = [], [], []for item in batch:wave, path, label, mixcnt = item['audio']['array'], item['audio']['path'], item['label'], 0if self.train:while len(wave) >= 15 * sr / 2:wave = clip(wave)# 单样本数据增强if np.random.rand() < 0.1:wave = clip(wave)if np.random.rand() < 0.1:wave = echo(wave)if np.random.rand() < 0.2:wave = add_noise(wave)if np.random.rand() < 0.2:wave = resample(wave)if np.random.rand() < 0.1:wave = pitch_shift(wave) if np.random.rand() < 0.5 else speedup(wave)label, mixcnt = 0, 1# mixup增强if len(wave) <= 15 * sr / 4 and mixcnt == 0 and np.random.rand() < 0.3:mixcnt = np.random.randint(1,4)for _ in range(mixcnt):if len(wave) >= 15 * sr / 2:breakif np.random.rand() < 0.9:pos = get_data(inputs, labels, mixups, 1)wave = mixup(wave, pos)else:neg = get_data(inputs, labels, mixups, 0)wave = mixup(wave, neg)label = 0while len(wave) >= 15 * sr / 2:wave = clip(wave)labels.append(label)inputs.append(wave)mixups.append(mixcnt)inputs = self.feature_extractor(inputs, sampling_rate=sr, return_tensors='pt')inputs['labels'] = torch.tensor(labels)return inputs

关键技术3:注意力增强


注意力增强的策略是我们在比赛中灵光一闪的发现。经典的语言模型如whisper通常处理长达30秒的输入,而在分析后发现,训练数据的长度往往较短。基于这一观察,我们大胆地将模型的输入长度从30秒压缩至15秒。简单看,这一操作将计算复杂度从30的平方降至15的平方,极大地提升了计算效率。更为重要的是,当切除输入的后半段内容时,模型的注意力得以更加集中地作用于前半段,使得这一部分的参数得到了更充分的训练。这一调整最终为我们带来了关键的1个百分点精度提升。在实际操作中,我们采用了简(tou)单(le)直(ge)接(lan)的方式——将训练样本的长度截断至15秒,从而实现了这一“注意力增强”的策略。

关键技术4:模型集成

最后要介绍的是比赛中最常用的策略——模型集成。我们采用了三个不同构造的whisper模型,每个模型各有侧重:第一个模型专注于异常样本,旨在深入理解伪造细节;第二个模型则以均衡的输入样本为基础,追求稳健的中庸表现;第三个模型则专注于学习大量正常样本,以确保对正样本的准确识别。我们将这三个whisper模型与决策树模型进行集成,利用bagging和voting等集成方法的优势。通过加权平均有效地降低了基模型的方差,进而提升了整体的精度。

总结

作为语音领域的初学者,我们主要比赛中做了四方面的努力,得到最终成果

  1. 深入分析:我们对音频的基础统计量进行了细致的分析,包括音频长度、语言分布等。这些深入的分析帮助我们设计出针对性的解决方案,奠定了成功的基础。
  2. 模型应用:我们尝试并使用了三种多语言预训练模型,以whisper为核心,采用voting算法将不同严格程度的模型进行融合,达到了“三个臭皮匠顶一个诸葛亮”的效果。
  3. 技巧创新:针对测试集中复杂多样的数据结构,我们精心设计了复杂的数据增强策略。这不仅丰富了数据的多样性,还有效缓解了分布偏移问题,使模型表现更加稳健。
  4. 数据选择:我们选取了大量多语言伪造数据和真实数据,特别是最新的伪造样本,以确保模型能够更贴近测试集的分布,提升了模型的实际表现。
    所以说,即使是“小白”,只要敢于尝试,把自己的想法付诸实践,就有可能取得意想不到的收获。
    最后,要特别感谢信也科技提供的这个平台,让我们有机会在实践中打磨技术、验证思路。同时,衷心感谢比赛中的答疑大佬强哥,让我们感受到了比赛背后的温度与关怀。
    希望我们的分享能为大家带来一些见解和启发。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/53238.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C语言程序设计 笔记代码梳理 重制版

前言 第1章 C语言的流程 1.C程序经历的六个阶段 编辑(Edit)预处理(Preprocess)编译(Compile)汇编(Assemble)链接(Link)执行(Execute) 2.C语言编写代码到运行 都是先编译&#xff0c;后链接&#xff0c;最后运行。&#xff08;.c ---> .obj --->.exe&#xff09;这个过…

开发适合el-dialog的拉伸拖拽自定义指令和适配自定义的图片查看组件

目录 一、应用场景 二、开发流程 1.自定义指令 2.功能原理 3.难点 三、详细开发 四、总结 一、应用场景 我之前有开发过一个图片查看的组件&#xff0c;这个组件可在单页面打开&#xff0c;也可以在弹窗里打开&#xff0c;但是弹窗因为是比较固定&#xff0c;所以有一些…

常见限流算法-固定窗口、滑动窗口、漏桶、令牌桶

为什么需要限流 限流可以认为服务降级的一种,限流就是限制系统的输入和输出流量已达到保护系统的目的。一般来说系统的吞吐量是可以被测算的,为了保证系统的稳定运行,一旦达到的需要限制的阈值,就需要限制流量并采取一些措施以完成限制流量的目的。比如:延迟处理,拒绝处理…

OpenCV颜色空间转换(1)颜色空间转换函数cvtColor()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 将图像从一个颜色空间转换到另一个颜色空间。 此函数将输入图像从一个颜色空间转换到另一个颜色空间。在进行 RGB 颜色空间之间的转换时&#x…

怎样查看电脑文件夹大小?文件夹数据丢失怎么找回

在日常使用电脑的过程中&#xff0c;‌我们经常需要查看文件夹的大小&#xff0c;‌以便更好地管理磁盘空间。‌然而&#xff0c;‌有时我们可能会遇到文件夹数据丢失的问题&#xff0c;‌这可能是由于误删除、‌系统错误或病毒感染等多种原因造成的。‌本文旨在介绍如何查看电…

【苍穹外卖】Day 7 地址簿、下单、定时处理

1 地址簿模块 地址簿实体对象&#xff1a; package com.sky.entity;import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor;import java.io.Serializable;/*** 地址簿*/ Data Builder NoArgsConstructor AllArgsCon…

001集——CAD—C#二次开发入门——开发环境基本设置

CAD C#二次开发首先需要搭建一个舒服的开发环境&#xff0c;软件安装后&#xff0c;需要修改相关设置。本文为保姆级入门搭建开发环境教程&#xff0c;默认已成功安装vs和cad 。 第一步&#xff1a;创建类库 第二步&#xff1a;进行相关设置&#xff0c;如图&#xff1a; 下一…

JavaEE:多线程进阶(CAS)

文章目录 CAS什么是 CASCAS 伪代码 CAS有哪些应用CAS的ABA问题什么是ABA问题ABA问题带来的BUG解决方案 CAS 什么是 CAS CAS: 全称Compare and swap&#xff0c;字面意思:”比较并交换“&#xff0c;一个 CAS 涉及到以下操作: 我们假设内存中的原数据V&#xff0c;旧的预期值A…

刷题记录(2)

1. HWOD机试 - 模拟消息队列(100) package com.yue.test;import org.junit.Test;import java.util.ArrayList; import java.util.Arrays; import java.util.LinkedList; import java.util.List;/*** Author: 夜雨* Date: 2021-12-08-10:31* Description:* Version 1.0*/ public…

【Android】ViewPager基本用法总结

文章目录 一、添加ViewPager控件二、构建适配器类三、在 MainActivity 中设置适配器示例一&#xff1a;图片切换适配器MainActivity 示例二&#xff1a;Fragment切换适配器FragmentMainActivity ViewPager 是 Android 中一个用于在同一屏幕上滑动不同页面&#xff08;通常是左右…

OBS怎么设置录制配置?3个电脑录屏小技巧妥妥教会你

OBS Studio是一款广受好评的开源录屏和直播软件&#xff0c;它以其强大的功能和用户友好的操作界面而闻名。对于初次接触OBS的用户来说&#xff0c;可能会对软件的众多按钮感到困惑。本文将为你提供一份简洁明了的OBS录屏指南&#xff0c;帮助你快速上手。 演示机型&#xff1a…

Hive数据库与表操作全指南

目录 Hive数据库操作详解 创建数据库 1&#xff09;语法 2&#xff09;案例 查询数据库 1&#xff09;展示所有数据库 &#xff08;1&#xff09;语法 &#xff08;2&#xff09;案例 2&#xff09;查看数据库信息 &#xff08;1&#xff09;语法 &#xff08;2&#…

Simulink:循环计数器 Counter Free-Running

原文&#xff1a;Matlab生成stm32代码_matlab stm32-CSDN博客 使用“Counter Free-Running”模块进行计数&#xff0c;参数配置如下 此配置的意思为每0.5秒计数一次&#xff0c;计数的最大值为2^Nbits – 1&#xff0c;其中Nbits为所填的2&#xff0c;所以这里最大值为3。 示波…

【多线程】死锁

&#x1f970;&#x1f970;&#x1f970;来都来了&#xff0c;不妨点个关注叭&#xff01; &#x1f449;博客主页&#xff1a;欢迎各位大佬!&#x1f448; 文章目录 1. 死锁的三种情况1.1 一个线程一把锁&#xff08;同一个线程给同一个对象加两次锁的情况&#xff09;1.2 两…

彻底解决 node/npm, Electron下载失败相关问题, 从底层源码详解node electron 加速配置

最近玩了一下electron项目, 总是会遇到electron的下载失败问题, 于是看了一下node源码, 做一个记录. node/npm 加速配置 这个配置通过设置node配置里面的registry 这个配置项来完成加速. 配置方法 npm config set registry https://registry.npmmirror.com上面的命令就是将当…

【全网最全】2024年数学建模国赛C题超详细保奖思路+可视化图表+成品论文+matlab/python代码等(后续会更新

您的点赞收藏是我继续更新的最大动力&#xff01; 一定要点击如下的卡片&#xff0c;那是获取资料的入口&#xff01; 基于优化模型的农作物的种植策略 摘要 随着农业生产向集约化和智能化方向发展&#xff0c;优化种植策略以最大化经济收益成为当前农业研究中的重要问题。本…

车载测试协议:ISO-14229、ISO-15765、ISO-11898、ISO-26262【车企项目实操学习】②

FOTA模块中OTA的知识点&#xff1a;1.测试过程中发现哪几类问题&#xff1f; 可能就是一个单键的ecu&#xff0c;比如升了一个门的ecu&#xff0c;他的升了之后就关不上&#xff0c;还有就是升级组合ecu的时候&#xff0c;c屏上不显示进度条。 2.在做ota测试的过程中&#xff…

已入职华为!!关于我成功拿下华为大模型算法岗经验总结

方向:大模型算法工程师 整个面试持续了1小时10分钟&#xff0c;能够看出面试官是典型搞技术的&#xff0c;问的很专业又很细&#xff0c;全程感觉压力好大&#xff0c;面完后感觉丝丝凉意&#xff0c;不过幸好还是成功拿下了Offer 一面: 自我介绍 简历项目深度交流 1.项目的背…

Java笔试面试题AI答之JDBC(2)

文章目录 7. 列出Java应该遵循的JDBC最佳实践&#xff1f;8. Statement与PreparedStatement的区别,什么是SQL注入&#xff0c;如何防止SQL注入Statement与PreparedStatement的区别什么是SQL注入如何防止SQL注入 9. JDBC如何连接数据库&#xff1f;1. 加载JDBC驱动程序2. 建立数…

[网络原理]关于网络的基本概念 及 协议

文章目录 一. 关于网络的概念介绍1. 局域⽹LAN2. ⼴域⽹WAN3. 主机4. 路由器5. 交换机IP地址端口号 二. 协议协议分层TCP/IP五层模型(或四层)OSI七层模型封装分用 一. 关于网络的概念介绍 1. 局域⽹LAN 局域⽹&#xff0c;即 Local Area Network&#xff0c;简称LAN。 Local …