信息速览
听觉 EEG(auditory EEG)指人在听声音时从头皮记录到的脑电活动。它不是一张静态切片,而是一条与声波同步的连续时间序列:声音的包络起伏经过耳蜗、脑干、听觉皮层逐级传递,最终在电极上留下毫伏级、且被颅骨与头皮层层衰减的电位变化。这篇文章聚焦的,是这一类数据里用途最集中、问题也最尖锐的一支——听觉注意解码(auditory attention decoding,AAD):给一个人同时播放两段说话声,只凭脑电判断他此刻在听哪一段。
本文核到的具体数据集,是鲁汶大学(KU Leuven)ExpORL 与 ESAT 两个课题组联合采集、2026 年在 Zenodo 上以统一条目重新发布的标准 AAD 数据集。它包含 16 名听力正常被试、64 导 EEG、8192 Hz 原始采样、每人约 72 分钟的竞争言语任务。它不是这块领域里体量最大的一个(鲁汶后来的 SparrKULee 有 85 名被试),但它是被引用最多、被当作方法学标尺的那一个——原因不在于数据本身有多好,而在于它的发布方在记录说明里,把整个领域最要命的两类方法学陷阱写成了公开警示。
理解这个数据集,本质上是在理解一个听起来反直觉的事实:听觉 EEG 的难,不在「信号太小」这一层,而在「单试次」这一层。叠加平均可以把随机噪声压掉,但助听器要的是此刻、这一次、这一个人。一屏速览见下表。
| 维度 | 内容 |
|---|---|
| 正式名称 | Auditory Attention Detection Dataset KU Leuven |
| 发布机构 | KU Leuven ExpORL(神经科学系)与 ESAT(电气工程系) |
| 托管平台 | Zenodo,记录号 21415059 |
| DOI | 概念 DOI 10.5281/zenodo.3377910 |
| 许可 | CC BY-NC-SA 4.0(署名、非商业、相同方式共享) |
| 被试 | 16 名听力正常者,无患者 |
| 采集设备 | BioSemi ActiveTwo,64 导,8192 Hz |
| 发布采样率 | 128 Hz(高通 0.5 Hz 后降采样) |
| 每人时长 | 约 72 分钟 EEG,20 个试次 |
| 刺激 | 四段荷兰语儿童广播故事,男声 |
| 任务 | 双耳竞争言语,按提示注意一侧 |
| 呈现条件 | HRTF(模拟 90 度侧向)与 dry(双耳分听)两套 |
| 文件组织 | S1.mat 至 S16.mat,每文件一名被试 |
| 总下载量 | 约 5.2 GB |
| 官方警示 | 试次指纹与眼动偏倚两条 |
§1 它要解决的具体麻烦
1.1 助听器不知道你在听谁,这条数据就是为了补上这一步
助听器的传统工作是放大。它把环境里所有声音一起放大,患者听到的是一间更响的房间,而不是一句更清楚的话。鸡尾酒会问题(cocktail party problem)的难点从来不是分离声源——盲源分离在信号处理上已有成熟解法——而是决定该放大哪一个声源。声源分离算法可以同时输出三路干净语音,但助听器只有一个输出通道,它必须知道佩戴者此刻的注意焦点。
这个决策问题在临床上有明确的价值锚点:听力损失者最常抱怨的不是听不见,而是听不清、跟不上、在多人场合迅速疲劳。人工耳蜗使用者的这一困境更突出,因为植入体的频率分辨率远低于健康耳蜗。如果设备能读取佩戴者的注意状态,就可以只增强被注意的那一路,把信噪比从负值拉回正值。听觉注意解码研究的目标,就是把「读取注意状态」这件事从行为学问卷搬到神经信号上。
这条路线的物理基础是一件事:被注意语音的包络与脑电之间存在可测量的相关。人在听连续语音时,皮层活动会在 100 到 400 毫秒的延迟上跟随语音包络起伏。注意某一侧时,该侧语音包络与脑电的相关性会略高于未被注意侧。这个差异极其微弱,但方向稳定。整个 AAD 领域就是在放大这个差异。
1.2 三条常见的错误期待
第一条错误期待,是把 AAD 当成语音识别的一支。语音识别处理的是声音到文字的映射,输入是波形,输出是文本;AAD 处理的是神经到注意的映射,输入是脑电与候选声源,输出只是「哪一路」。它不解码语义,不解码词句,也不解码情绪,它只回答一个二分类或少数几分类的问题。把 AAD 的准确率与语音识别的词错率放在一起比较没有意义。
第二条错误期待,是把离线高准确率等同于可穿戴可用。文献里常见的数字是短片段上七八成甚至九成以上的二分类准确率,但这些数字通常建立在受控的隔声室、湿电极、64 导全头覆盖、以及被试整段时间内注意稳定不变的前提上。一旦换成干电极、少导联、被试边走边听、注意频繁切换,准确率会迅速退化到接近随机。设备形态的改变比算法改进更能决定实际可用性。
第三条错误期待,是把数据集之间的准确率直接横向比较。不同的 AAD 数据集在语料、呈现方式、试次长度、划分协议、包络提取方法上差异极大。同一算法在不同数据集上差十几个百分点是常态,而这个差异往往来自划分协议而不是模型能力。本文所讲的数据集之所以特殊,正是因为它的发布方把这一点公开写了出来。
1.3 它能给到的与给不到的
| 你的需求 | 它给的 | 够不够 |
|---|---|---|
| 练习跑通一条 AAD 基线流程 | 完整 EEG 加音频、官方预处理脚本 | 够,数据结构简单直接 |
| 复现经典线性解码器的对照数值 | 多个已发表工作在同一份数据上的结果 | 够,是这块领域的公共参照点 |
| 训练大模型需要的数据量 | 每人约 72 分钟、总共十几小时 | 不够,应转向 SparrKULee 等大集 |
| 做跨被试迁移 | 16 名被试,可做留一被试 | 勉强够,样本量偏小、统计功效有限 |
| 研究真实耳道与干电极场景 | 只有头戴式湿电极 64 导 | 不够,属实验级设备 |
| 研究听损人群的注意解码 | 全部为听力正常青年 | 不够,不能外推到患者 |
| 排除眼动捷径 | 官方明说本集眼动偏倚较强 | 不够,须换用凝视控制数据集 |
| 做语义或词汇级解码 | 只有整段音频与试次级标签 | 不够,无词级时间戳 |
| 做语言无关的泛化 | 只有荷兰语男声儿童故事 | 不够,语言与说话人单一 |
| 验证低延迟实时系统 | 全部离线,无在线回路 | 不够,只能做离线仿真 |
| 检查伪迹处理影响 | 发布版已做高通与 MWF 去伪迹 | 部分够,原始数据需另行申请 |
| 商业产品训练 | 许可为非商业 | 不够,须另行授权 |
表格的左列是需求而不是特性,
1.4 你的处境与它能帮到的事
| 你的处境 | 它能帮你什么 | 下一步该做什么 |
|---|---|---|
| 刚接手一个助听器或脑机接口项目,需要先判断这条路值不值得投入 | 用一份小而完整的数据跑通端到端流程,两天内能得到第一个数字 | 先按 §9.2 的最短流程跑通,再看数字是否足以支撑立项 |
| 论文里需要一个公认的对照点 | 这块领域多篇工作都在同一份数据上报过结果,可比性强 | 严格按留一试次划分,并同时报告线性基线与深度基线 |
| 手上有自己的 EEG,想知道跨数据集会不会崩 | 可作为外部验证集检验你的模型是不是过拟合了自家语料 | 训练用自家数据,测试用它,且只做单向评估 |
| 想评估少导联或干电极方案的可行性 | 64 导数据可做通道降采样实验,模拟导联减少后的退化 | 做通道子集扫描,并注明这是模拟而非真实干电极 |
| 想研究注意切换时的动态响应 | 每个试次被提示换耳,试次边界是天然的切换点 | 切出边界前后若干秒做时间分辨分析 |
| 正在做方法学批评或复现研究 | 官方说明里已有两条成文的陷阱清单,可直接引用 | 逐条复现两类陷阱造成的数值差异 |
| 教学场景需要一份能讲清楚的数据 | 结构简单、字段少、有官方预处理脚本 | 用 S1.mat 单被试做课堂演示 |
| 准备做商业产品的可行性验证 | 只能做原理验证 | 非商业许可下先签授权或改用可商用数据 |
1.5 一句话判断
它是听觉注意解码领域的方法学标尺,不是数据规模的答案:它的价值一半在数据,一半在发布方主动公开的那两条陷阱说明。
1.6 不适合谁:四条边界
听觉注意在听损人群中的神经表征可能与正常听力者存在系统性差异,尤其是在频率分辨率下降、动态范围压缩之后。用它训练的模型直接用于助听器验配人群,属于未经检验的外推。
第二条边界是场景。采集在隔声、电磁屏蔽的实验室内完成,被试静坐,头部由头托固定或仅有小幅自然运动,电极阻抗人工调制到较低水平。真实使用场景中的运动伪迹、电磁干扰、电极接触漂移在这份数据里几乎不存在。模型的鲁棒性无法在此检验。
第三条边界是设备。64 导湿电极全头帽是实验级别配置,临床与消费级设备通常只有 2 到 16 个干电极,且位置集中在耳周、乳突或耳道内。通道数从 64 降到 4 会改变解码器的整个设计空间,外部听觉皮层与额区信息在这份数据里贡献的权重无法平移到 ear-EEG 方案上。
第四条边界是语言与语料。四段荷兰语儿童广播故事,全部为男声旁白,句法简单、语速偏慢、情绪起伏小而稳定。这与成年人之间的自然对话差异极大。语音包络跟踪的强度对语速、韵律与说话人变化敏感,跨语言、跨说话人的泛化在此无法评估。
§2 数据构成与规格
2.1 一十四小时的脑电被切成三百二十个试次
规模要分两层看。被试层是 16 人,每人一个 MATLAB 文件;试次层是每人 20 个,合计三百二十个试次。官方记录给出的每人数据量是约 72 分钟,乘起来约十几小时的高密度 EEG。这个量级在 2016 年的语境下已经不小,但按今天的深度学习标准,它只够训练一个小型模型。
试次的形成逻辑值得说清。实验由三个 experiment 组成。experiment 1 和 2 各含四次呈现,每次呈现中两段故事同时播放,被试被要求注意其中一侧;四次呈现之间换耳,且每次都换一段新故事。experiment 3 则是把 experiment 1 前四次呈现的前两分钟各重复三遍,用来构造「重复刺激」条件下的响应一致性检验。二十个试次就是这么来的:四加四加十二。
每段故事被切成约六分钟的片段,两段不同的故事同时在左右耳播放。注意方向由实验者指示,被试按提示听其中一侧并在每次呈现后回答几个关于故事内容的选择题,以维持动机与注意。注意方向在呈现之间切换,而不是在呈现之内切换——这一点对数据划分很关键。
| 层次 | 单位 | 数量 | 说明 |
|---|---|---|---|
| 文件层 | 被试 | 16 | S1.mat 至 S16.mat |
| 试次层 | trial | 320 | 每人 20 个,TrialID 取值 1 至 20 |
| 实验层 | experiment | 3 | 前两个含 4 次呈现,第三个含 12 次 |
| 刺激层 | 故事 | 4 | 荷兰语儿童广播故事,男声 |
| 呈现条件 | condition | 2 | HRTF 与 dry |
| 注意方向 | attended_ear | 2 | 左或右 |
| 重复标记 | repetition | 2 | 是/否 |
| 音频文件 | wav | 若干 | stimuli 文件夹内,按 part、track、condition 命名 |
2.2 字段的完整字典
官方记录说明里逐条列出了每个试次结构体的字段。这是这份数据集最值得称赞的部分:字段少、语义清楚、没有歧义的名字。下表把十一个字段与它们的取值域、单位与使用注意事项列全。
| 字段 | 类型 | 取值/单位 | 含义 | 使用注意 |
|---|---|---|---|---|
| RawData.Channels | 整数数组 | 1 至 64 | 通道编号 | 顺序为 BioSemi 标准序,未重排 |
| RawData.EegData | 二维数值矩阵 | 样本 × 通道 | EEG 幅度 | 已做 0.5 Hz 高通与 MWF 去伪迹 |
| FileHeader.SampleRate | 整数 | 128 | 发布版采样率 | 原始为 8192 Hz,发布版已降采样 |
| TrialID | 整数 | 1 至 20 | 试次编号 | 与重复呈现共用编号空间 |
| attended_ear | 字符 | L 或 R | 被注意耳 | 表征注意方向,不是声源位置 |
| stimuli | 元胞数组 | 文件名 | 左右耳播放的音频文件名 | stimuli{1} 为左耳,stimuli{2} 为右耳 |
| condition | 字符 | HRTF 或 dry | 呈现条件 | HRTF 模拟 90 度侧向声源 |
| experiment | 整数 | 1、2、3 | 所属实验 | 3 为重复刺激实验 |
| part | 整数 | 1 至 4 或 1 至 12 | 故事片段编号 | 前两个实验为 1 至 4,第三个为 1 至 12 |
| attended_track | 字符 | 1 或 2 | 被注意的声道 | 实验 1 恒为 1,实验 2 恒为 2 |
| repetition | 二值 | 0 或 1 | 是否为重复呈现 | experiment 3 中被置位 |
| subject | 字符 | S1 至 S16 | 被试标识 | 与文件名一致 |
字段之少是优点,也是限制。优点在于入模门槛极低,几行代码就能把结构体摊平成张量;限制在于没有任何关于被试的信息——年龄、性别、听力阈值、头部尺寸、电极阻抗全部缺失。这意味着任何需要协变量校正的分析都无法在此进行,也意味着泛化失败的原因无法归因到被试属性上。
2.3 一个试次的完整解剖
把 S1.mat 载入后,看到的是一个嵌套结构体。下面这段代码展示的是结构体的实际组织方式,以及如何把一个试次里的 EEG 与对应音频取出来对齐。字段名严格按官方说明书写,不做改动。
S1.mat
└── trial(1×20 struct array)
├── RawData
│ ├── Channels : [1 2 3 ... 64]
│ └── EegData : [样本数 × 64 double]
├── FileHeader
│ └── SampleRate : 128
├── TrialID : 3
├── attended_ear : 'L'
├── stimuli : {'part2_track1_dry.wav' 'part2_track2_dry.wav'}
├── condition : 'dry'
├── experiment : 1
├── part : 2
├── attended_track : '1'
├── repetition : 0
└── subject : 'S1'
一个试次在时间上是一条完整的时间线:两段故事同时从零秒开始播放,被试从零秒开始注意其中一侧,EEG 从零秒开始记录。三者在时间上对齐,但两段故事的长度不一定相等——官方特别提醒,故事长度不一致时被试被允许听完自己注意的那一段,因此较短那一路音频会先结束。处理时必须用 EEG 的实际长度去截断音频,否则尾部会出现「只剩单一声源」的片段,破坏竞争言语的前提。
这一点是很多人踩过的坑。如果直接用音频长度作为对齐依据,超出的部分会被补零或循环,导致包络与脑电错位;如果用较短音频的长度作为公共长度,则会丢掉有效数据。正确做法是以 EEG 样本数为准,向前截断两路音频。
import numpy as np
import scipy.io as sio
from scipy.signal import resample_poly
#-- 载入一名被试,取出第 3 个试次
mat = sio.loadmat("S1.mat", squeeze_me=True, struct_as_record=False)
trial = mat["trial"][2]
fs = int(trial.FileHeader.SampleRate)
eeg = np.asarray(trial.RawData.EegData, dtype=float)
print(trial.subject, trial.TrialID, trial.condition, trial.attended_ear)
print("EEG 形状", eeg.shape, "采样率", fs, "时长(秒)", round(eeg.shape[0] / fs, 1))
#-- 按 EEG 长度决定公共窗口,两路音频都截到这个长度
n_samples = eeg.shape[0]
duration_s = n_samples / fs
print("用于对齐的时长", round(duration_s, 2))
这段代码里没有做任何滤波与重参考,因为发布版已经做完。如果你拿到的是申请来的原始数据,则必须先做 0.5 Hz 高通与 50 Hz 陷波,再考虑伪迹处理。顺序错了会改变慢波成分,进而改变包络跟踪的相关系数。
2.4 试次分布与条件交叉
三百二十个试次并不是均匀分布在一个格子里。三个实验的设计不同,注意方向与呈现条件的组合也随之不同。下表按实验与条件把结构摊开,方便在划分数据时避免某一格为空。
| experiment | 呈现次数 | 注意方向 | 条件 | 重复标记 | 说明 |
|---|---|---|---|---|---|
| 1 | 4 | 左右交替 | HRTF 与 dry 各半 | 0 | 注意声道恒为 track 1 |
| 2 | 4 | 左右交替 | HRTF 与 dry 各半 | 0 | 注意声道恒为 track 2 |
| 3 | 12 | 沿用实验 1 的提示 | HRTF 与 dry 各半 | 1 | 前两分钟重复三遍 |
| 合计 | 20 | — | 两类均衡 | 12 个重复 | 每人固定 20 个 |
这张表暴露了一个容易被忽略的细节:experiment 1 中注意始终落在 track 1,experiment 2 中注意始终落在 track 2。也就是说,在实验 1 内部,「注意哪一路」与「注意哪一段故事」是混淆的。如果按试次随机划分并跨实验混训,模型可能学到的是「哪一段故事的包络长什么样」,而不是「哪一侧被注意」。官方给出的划分建议是按试次或按故事划分,正是为了切断这条通路。
experiment 3 的重复呈现提供了另一条信息:同一段音频被重复播放三次,对应的神经响应应当高度相似。这是检验解码器是否真的捕捉到刺激相关成分的自然对照——如果模型在重复呈现上的表现与首次呈现无差别,说明它没有利用重复带来的信噪比红利;如果差异巨大,说明它可能过拟合了单次呈现的偶然噪声。
2.5 与同类听觉 EEG 资源的字段差异
听觉 EEG 领域并不缺数据。缺的是「结构与文档同样清楚」的数据。下表把几个常被放在一起比较的资源按关键维度摆开,差异一目了然。
| 资源 | 被试数 | 每人时长 | 导联 | 任务 | 主要用途 | 许可 |
|---|---|---|---|---|---|---|
| 本篇(KUL AAD) | 16 | 约 72 分钟 | 64 | 双耳竞争言语 | AAD 基准 | CC BY-NC-SA 4.0 |
| AV-GC-AAD | 16(公开 13) | 4 个条件 × 10 分钟 | 64 + 4 EOG | 凝视受控竞争言语 | 排除眼动捷径 | CC BY-SA 4.0 |
| SparrKULee | 85 | 90 至 150 分钟 | 64 | 自然语音聆听 | 语音编码/解码大集 | 见官方仓库 |
| DTU 听觉 EEG | 18 | 约 50 分钟 | 64 | 竞争言语 | AAD 泛化 | 学术申请 |
| ICASSP 2023 挑战赛数据 | 多中心 | 不等 | 不等 | 匹配/不匹配 | 竞赛基线 | 竞赛条款 |
| 维度 | 本篇 | AV-GC-AAD | SparrKULee | DTU |
|---|---|---|---|---|
| 眼动记录 | 无 | 4 导 EOG | 无 | 无 |
| 呈现条件数 | 2 | 4 | 1 | 1 |
| 注意切换粒度 | 试次间 | 试次内 5 分钟处换侧 | 不适用 | 试次间 |
| 官方划分建议 | 按试次/故事 | 按条件分别报告 | 按被试 | 按被试 |
| 官方预处理脚本 | 有(MATLAB) | 有(MATLAB) | 有 | 无 |
| 原始数据可得 | 需申请 | 部分可得 | 需申请 | 需申请 |
§3 核心层 A:它在听觉神经科学里的身份
3.1 它不是一份「数据」,而是一套被反复调用的实验范式
16 名被试、四段故事、两个条件、两个注意方向,这套参数不是随意选的,每一个都对应一个可分离的变量。
四段故事对应「换刺激」,看看结论是否依赖特定语料。两个条件对应「换声学线索」,HRTF 保留了耳间时间差与强度差这类真实空间线索,dry 则把这些线索去掉,只留双耳分听带来的完全分离。两个注意方向对应「换注意状态」,并且是被试者可以自主执行的最小操作。实验 3 的重复呈现对应「信噪比基准」,让研究者知道在最好的情况下能做到什么。
正因为它是范式而不是语料库,它的数据量必然有限。范式的作用是让不同实验室用同一套刺激与同一套指标争论同一件事,而不是给深度学习提供足够多的样本。而后来的 SparrKULee 则是把范式放大到够训练大模型的规模——两者的角色分工很清楚。
3.2 「注意」在这里被简化成了什么
需要注意一件事:这份数据里的「注意」,被简化为一个二值的、稳定的、试次级的状态。被试在一个试次内(约六分钟)被要求只注意一侧,不作切换。这意味着数据没有回答「注意在句子内部如何游移」「注意在被强噪声打断后如何恢复」「两个人同时说话、注意在两人之间来回跳」这些更接近真实场景的问题。
这种简化在实验设计上是必要的,因为它让标签干净。如果允许被试在一个试次内自由切换注意,那么试次内的每个时间点都需要一个注意标签,而这样的标签无法获得——不能每隔两秒问被试一次「你现在在听谁」。行为学上的替代方案是事后回忆加置信度,但这会引入回忆偏差。
简化带来的代价是:任何在该数据上训练的模型,在真实动态场景中的表现都无法从这份数据推断。真实场景里的注意切换是按秒甚至按亚秒发生的,模型需要的是连续的状态跟踪而不是试次级分类。这一点在 §7.3 会以偏差条目的形式再次出现。
3.3 语音包络是这个范式里的「针」
所有基于这份数据的解码方法,几乎都建立在语音包络之上。包络是语音信号幅度随时间变化的低频包络线,通常通过希尔伯特变换取绝对值再低通滤波得到,频带一般取 1 到 40 Hz 甚至更窄。它的价值在于:它既保留了语音的韵律与音节节律,又去掉了对相位与精细频谱的依赖,而后者在头皮 EEG 里根本无法可靠重建。
选择包络作为解码对象,是一次刻意的降维。语音的完整信息包括音素序列、声调、说话人身份、语义内容,包络只保留了最粗的那一层。但这最粗的一层恰好是皮层能跟得上的:听觉皮层的神经振荡在 theta(约 4 到 8 Hz)与 delta(1 到 4 Hz)频段与语音的音节率与短语率对应,因此包络跟踪在这两个频段最强。
这也解释了为什么这份数据的采样率可以降到 128 Hz。包络跟踪的有效信息集中在 30 Hz 以下,128 Hz 已有四倍以上的余量。保留 8192 Hz 的意义主要在于原始数据的可复用性:如果未来有人想研究听觉脑干响应(ABR)这类高频成分,就需要高采样率。发布版牺牲了这一点,换来了体积与易用性。
| 语音信息层 | 频率范围 | 头皮 EEG 可恢复性 | 在本数据中的角色 |
|---|---|---|---|
| 包络(音节率) | 2 至 8 Hz | 较好 | 主解码目标 |
| 包络(短语率) | 0.5 至 2 Hz | 好 | 长时相关性的来源 |
| 基频与声调 | 80 至 400 Hz | 差 | 未使用 |
| 共振峰结构 | 300 至 4000 Hz | 极差 | 未使用 |
| 音素序列 | 宽带 | 不可靠 | 需回归模型间接推断 |
| 语义内容 | 不适用 | 需高层表征 | 近年深度模型尝试 |
3.4 它与临床听力学的接口
因此文献里报告的「十秒窗口下九成准确率」,与临床可用的「一秒窗口下七成准确率」,是两件完全不同的事。
这份数据恰好能支撑这个权衡的刻画,因为它的试次长度足够长,可以任意切出不同长度的分析窗口;同时它有两个呈现条件,可以检验权衡曲线是否随声学线索变化。但它不能支撑「真实佩戴下的延迟」这一更硬的问题,因为不存在真实的闭环延迟。
§4 核心层 B:质量与它的两个著名缺陷
4.1 信号质量的上限由采集条件决定
采集在隔声、电磁屏蔽的实验室完成,设备是 BioSemi ActiveTwo,64 导,8192 Hz。这是一套在当时属于高端的配置:主动电极设计降低了长导线的干扰,高采样率保留了宽带信息,电屏蔽室把市电与设备噪声压到很低。信噪比的下限因此主要由生理源决定,而不是由工频干扰或电极接触噪声决定。
但这个「高质量」有明确的范围。它是实验室条件下的高质量,不是可穿戴条件下的高质量。两层之间的差距不是线性的:干电极的接触阻抗比湿电极高一个到两个数量级,运动伪迹的幅度比神经信号高两到三个数量级,而这两类问题在湿电极、静坐、屏蔽室的组合下几乎不存在。所以这份数据可以用来回答「这个注意状态在理想条件下是否可解码」,但不能回答「在真实条件下是否可解码」。
发布版在信号处理上做了三步:0.5 Hz 高通、降采样到 128 Hz、MWF 多通道维纳滤波去伪迹。第一步去掉慢漂移,代价是丢失了直流与极慢的成分;第二步压缩体积;第三步用多通道空间滤波抑制眼电与肌电,代价是可能连带削弱与伪迹空间模式相近的神经成分。后者的影响在听觉任务里通常被认为可接受,因为听觉源在颞叶,与眼电的额区模式空间分离度较高,但这个判断需要在使用者自己的分析里复核。
4.2 第一个缺陷:试次指纹
这是这份数据集最有名的部分,也是它被反复引用的原因。发布方在 2024 年 1 月的补充说明里写得很直白:他们注意到很多使用该数据的研究仍采用简单随机交叉验证,把同一试次的片段同时放进训练集与测试集,由此报告出极高的准确率,而这些准确率在正确的划分下会大幅下降,有时甚至低于随机水平。
机制值得展开。一个试次持续约六分钟,被试在这六分钟里注意同一侧、保持相近的姿势、相近的眼动模式、相近的电极接触状态。这些缓慢变化的因素在片段之间高度相关,形成了一个试次特有的「指纹」。如果训练集里有这个试次的某些片段,模型就学会了识别指纹;测试时遇到同试次的其余片段,就能靠指纹直接判断试次属于哪一类,而不需要真正解码注意状态。
一个具体例子可以把这件事说透,这就是 §4.6 的案例。设想一名研究者在 S3 上做实验,把每个试次切成两秒的片段,共约一千八百个片段,然后随机按八二划分。模型在测试集上得到九成以上的二分类准确率。他把它写成「深度网络显著优于线性基线」。审稿人要求按留一试次重做,准确率掉到六成出头,与十年前的线性方法持平。差别不在模型,而在划分。
| 划分协议 | 训练集与测试集关系 | 典型表现 | 是否可用 |
|---|---|---|---|
| 随机片段划分 | 同试次片段跨集 | 极高,常超九成 | 不可用,泄漏 |
| 留一试次 | 试次不跨集 | 明显下降 | 最低可用标准 |
| 留一故事 | 故事不跨集 | 更接近真实泛化 | 推荐 |
| 留一被试 | 被试不跨集 | 最低,反映个体差异 | 跨被试结论必须 |
| 留一条件 | 条件不跨集 | 检验声学线索依赖 | 条件泛化时用 |
4.3 第二个缺陷:眼动偏倚
第二个缺陷更隐蔽。人在注意某一侧说话人时,会不自觉地、常常是无意识地,把视线偏向那一侧。眼球是一个电偶极子,角膜相对视网膜为正,眼球的转动会在头皮上产生可测量的电位变化,这就是眼电(EOG)。64 导全头覆盖的电极帽会把这些电位一并记录下来。
于是出现了一条捷径:如果解码器学到的是「眼球朝左还是朝右」,它在注意分类任务上就会得到不错的准确率,但这个能力与听觉注意本身无关。一个只用了额区导联、只做空间模式分类、不与语音包络做相关计算的模型,尤其容易走上这条路。发布方把这类方法称为空间 AAD(spatial AAD),并明确建议不要在这份数据上评测它们。
官方的表述还留了一个余地:这种眼动偏倚「在多数公开 AAD 数据集中都存在」。这句话的分量很重。它意味着这不是一份数据的瑕疵,而是整个领域在采集环节就带进来的系统性混淆。解决方式不是修数据,而是重新设计采集协议,让被试必须在眼动与注意之间做出分离——这正是 AV-GC-AAD 这份后续数据集存在的理由。
4.4 两份数据的分工
AV-GC-AAD 是同一课题组在 2024 年发布的续作,设计目标就是把眼动与注意拆开。它设置了四种条件:移动视频(视线跟着被注意说话人的移动视频走)、移动靶加噪声(视线跟着一个与声源无关的移动十字,同时听声音)、无视觉(黑屏,要求尽量不眼动)、静态视频(盯着被注意说话人的静态画面)。
关键在于移动靶条件:视觉任务要求被试看一个与声源位置完全无关的移动十字,于是眼动方向与注意方向被解耦。如果模型在这个条件上仍能解码注意,那它用的就不是眼动。官方补充说明里还提到,很多已发表算法在这个数据集的两个「凝视不一致」条件上达不到显著高于随机的水平,这被一些人归因于数据太难,但课题组用一份简单的线性刺激重建算法证明了高准确率是可以达到的。
两份数据的关系,可以理解为「发现问题」与「提供对照」:前者是问题的现场,后者是排除了主要混淆之后的复检台。
| 维度 | 本篇(KUL AAD) | AV-GC-AAD |
|---|---|---|
| 发布年份 | 2016 采集,2026 统一重发 | 2024 |
| 被试数 | 16 | 16 采集,13 公开 |
| 眼电记录 | 无 | 4 导 EOG |
| 视觉条件 | 无(黑屏或闭眼) | 4 种 |
| 眼动与注意关系 | 强相关 | 部分条件解耦 |
| 主要用途 | 基准与复现 | 排除捷径 |
| 许可 | CC BY-NC-SA 4.0 | CC BY-SA 4.0 |
4.6 案例:一次随机划分与一次留一试次划分的对照
这个案例不在数据文件里,而在文献的评审过程里反复出现,值得完整走一遍,因为它是理解这份数据价值的最短路径。设一名研究者以 S3 为对象,目标是区分「注意左耳」与「注意右耳」。他按常规做法把每个试次切成两秒不重叠片段,得到一千八百余个样本,然后随机划分。模型是一个两层卷积网络,训练二十轮,测试准确率稳定在九成以上。他据此写了一篇短文,结论是「深度网络在 AAD 上取得突破」。
复审提出三个问题。第一,试次内片段是否跨集。答:是。第二,包络相关的线性基线在同一划分下是多少。答:没跑。第三,留一试次划分下准确率是多少。研究者补跑后发现,随机划分下线性基线也有近九成,留一试次后深度网络降到六成出头、线性基线降到六成左右,两者差距在统计上不显著。这个案例的结论不是「深度网络没用」,而是「在这份数据上,随机划分的九成准确率不能作为任何结论的依据」。
§4.6 的案例还有一层延伸价值:它给出了一条可以照做的自检清单。任何使用这份数据的工作,在报出第一个数字之前,都应该回答「我按什么划分」「我是否跑了线性基线」「我的测试集片段是否与训练集共享试次」。这三个问题答不上来,后面的所有数字都可以先搁置。官方在记录说明里引用的那篇综述,正是系统整理了这类问题的文献。
§4.6 的案例最后要说的是,它并没有否定短片段分析的价值。短片段分析在刻画「决策窗口与准确率的权衡」时是必要的,只是必须按试次划分,且必须在测试集上避免同试次泄漏。方法学上的正确做法,是把短片段当作「在留一试次前提下改变窗口长度」的自变量,而不是把随机划分当作省事的默认选项。
§5 核心层 C:怎么把它变成能跑的张量
5.1 取数:一条命令与一个校验
数据在 Zenodo 上公开,无需注册,直链可用。总计约 5.2 GB,十六个被试文件各约三百兆,一个刺激压缩包约四百六十兆。下载后先用官方提供的校验和核对,再开始处理,这是唯一能排除「下载中断导致文件截断」的手段。
#-- 建目录并下载整个记录(含 README 与预处理脚本)
mkdir -p ~/data/kul-aad && cd ~/data/kul-aad
curl -L -o S1.mat "https://zenodo.org/records/21415059/files/S1.mat?download=1"
curl -L -o stimuli.zip "https://zenodo.org/records/21415059/files/stimuli.zip?download=1"
curl -L -o preprocess_data.m "https://zenodo.org/records/21415059/files/preprocess_data.m?download=1"
#-- 用 Zenodo 的 API 取官方校验和并逐个核对
curl -s "https://zenodo.org/api/records/21415059" \
| python3 -c "import sys,json;d=json.load(sys.stdin);[print(f['key'],f['checksum']) for f in d['files']]" \
| tee checksums.txt
md5sum -c <(sed 's/^md5://' checksums.txt)
5.2 换成 Python 张量
MATLAB 结构体在 Python 里读出来是嵌套的 object 数组,字段名带的大小写需要原样访问。下面这段代码把全部十六名被试摊平成一个列表,每个元素是一个试次的字典,便于后续按条件筛选。
import glob
import numpy as np
import scipy.io as sio
def load_subject(path):
mat = sio.loadmat(path, squeeze_me=True, struct_as_record=False)
trials = np.atleast_1d(mat["trial"])
out = []
for t in trials:
out.append({
"subject": str(getattr(t, "subject")),
"trial_id": int(getattr(t, "TrialID")),
"fs": int(t.FileHeader.SampleRate),
"eeg": np.asarray(t.RawData.EegData, dtype=np.float32),
"attended_ear": str(getattr(t, "attended_ear")),
"condition": str(getattr(t, "condition")),
"experiment": int(getattr(t, "experiment")),
"repetition": int(getattr(t, "repetition")),
"stimuli": [str(x) for x in np.atleast_1d(t.stimuli)],
})
return out
records = []
for f in sorted(glob.glob("S*.mat")):
records.extend(load_subject(f))
print("试次总数", len(records), "被试数", len({r["subject"] for r in records}))
print("通道数", records[0]["eeg"].shape[1], "采样率", records[0]["fs"])
输出应当是三百二十个试次、十六名被试、64 通道、128 Hz。如果试次数不是三百二十,先检查 numpy 的 squeeze 是否把单元素数组压成了标量——这是读 MATLAB 结构体时最常见的静默错误。
5.3 包络提取
包络的提取方式会直接影响相关系数的绝对值,这是跨研究的数字无法直接比较的主要原因之一。常见的做法是先带通到语音频带,再取希尔伯特变换的模,再低通到包络带宽,最后降采样。下面这段给出一个可以复现的默认配置,并在注释里标明每个参数为什么这样选。
from scipy.signal import butter, filtfilt, hilbert, resample_poly
import numpy as np
def speech_envelope(wav, fs_audio=16000, env_fs=64,
band=(1.0, 8000.0), lp=30.0):
#-- 第一步:语音频带带通,去掉直流与超声成分
b, a = butter(4, [band[0] / (fs_audio / 2), band[1] / (fs_audio / 2)], btype="band")
x = filtfilt(b, a, np.asarray(wav, dtype=float).ravel())
#-- 第二步:希尔伯特变换取幅度,得到粗包络
env = np.abs(hilbert(x))
#-- 第三步:低通到包络带宽,压掉载波残留的高频起伏
b2, a2 = butter(4, lp / (fs_audio / 2), btype="low")
env = filtfilt(b2, a2, env)
#-- 第四步:降到与 EEG 相当的采样率,便于逐样本对齐
up, down = env_fs, fs_audio
g = np.gcd(up, down)
env = resample_poly(env, up // g, down // g)
#-- 第五步:标准化,消除整体音量差异
env = (env - env.mean()) / (env.std() + 1e-12)
return env
print(speech_envelope(np.random.randn(16000 * 10) * 0.1).shape)
第 8000 Hz 的上界是经验取值,意图是保留语音的主要能量而不引入设备噪声。第 30 Hz 的低通是包络分析里很常见的带宽,比它宽的设置会让包络带上更多的音色信息,比它窄的会平滑掉音节起伏。第 64 Hz 的重采样率是许多 AAD 论文的默认值,与 128 Hz 的 EEG 形成二比一的比例,便于对齐。
5.4 刺激重建与相关系数
线性刺激重建是所有 AAD 方法里最容易实现、也最常被当作基线的一个。它的思路是:用一个多输入单输出的线性滤波器组,从多通道 EEG 预测包络;再分别计算预测结果与被注意、未被注意包络的相关,取相关更高的一侧作为判定。训练用的是最小二乘或岭回归,闭式解,几秒钟就能跑完一个被试。
import numpy as np
from sklearn.linear_model import Ridge
def lagged_features(eeg, lags_ms, fs):
#-- 把每个滞后时刻的 EEG 堆成一个特征矩阵,形状 (样本, 通道 × 滞后数)
lags = [int(round(l * fs / 1000)) for l in lags_ms]
n, c = eeg.shape
feats = []
for L in lags:
if L >= 0:
feats.append(np.vstack([np.zeros((L, c)), eeg[: n - L]]))
else:
feats.append(np.vstack([eeg[-L:], np.zeros((-L, c))]))
return np.hstack(feats)
def reconstruct_score(eeg, env_att, env_unatt, fs=128,
lags_ms=range(0, 251, 10)):
X = lagged_features(eeg, lags_ms, fs)
split = int(X.shape[0] * 0.8)
model = Ridge(alpha=1e3).fit(X[:split], env_att[:split])
pred = model.predict(X[split:])
r_att = np.corrcoef(pred, env_att[split:])[0, 1]
r_unatt = np.corrcoef(pred, env_unatt[split:])[0, 1]
return r_att, r_unatt, int(r_att > r_unatt)
print("这里必须按试次划分,片段内部拆分仅演示接口")
最后一行注释是对 §4.6 的案例的直接回应。这段代码的接口留了百分之八十与百分之二十的切分,但在真实实验里这个切分必须发生在试次之间,而不是样本之间。把切分写在试次层,是这份数据上所有结果可信与否的分水岭。
5.5 决策窗口扫描
窗口长度是 AAD 里最有临床意义的自变量。下面这段在这个前提下扫描不同决策窗口,给出可分析的窗口数量统计;长度以秒为单位,按 128 Hz 换算成样本数。真实的准确率需要把 5.4 的重建流程套进窗口循环,这里保留骨架是为了让窗口与外层划分的关系一眼可见。
def window_counts(records, window_s=10.0, fs=128):
out = []
for r in records:
n_win = int(r["eeg"].shape[0] // (window_s * fs))
out.append(n_win)
return out
for w in (2, 5, 10, 30, 60):
counts = window_counts(records, window_s=w)
print(w, "秒窗口:每人", counts[0], "个,合计", sum(counts))
外层循环窗口、内层循环被试、判定只有一次——任何在窗口内部再做随机划分的实现,都会重新掉进试次指纹的坑。
5.6 一个最小可信评估协议
把前面几步合起来,得到的是一份可以写进论文方法部分的协议。它不比复杂模型难多少,但它把不可信的路径全部堵死了。
| 步骤 | 做法 | 为什么必须 |
|---|---|---|
| 1 | 按被试分组,留一被试或留一试次 | 切断同试次泄漏 |
| 2 | 在训练折内做超参选择 | 避免测试集信息回流 |
| 3 | 包络提取参数在全部被试上固定 | 避免逐被试调参造成的乐观偏差 |
| 4 | 同时报告线性基线与深度基线 | 判断增益是否来自模型 |
| 5 | 分别在 HRTF 与 dry 条件报告 | 两类声学线索不可混谈 |
| 6 | 给出二项检验的显著性阈值 | 避免「六成准确率」的误读 |
| 7 | 报告窗口长度与延迟 | 准确率脱离窗口没有意义 |
| 8 | 若做直接分类,声明眼动风险 | 回应 §4.3 的捷径问题 |
第一步之外的其余七步里,第六步最容易被忽略。二分类任务在样本量有限时,六成准确率的置信区间可能宽到覆盖随机水平。不做检验就宣称「优于随机」,是这块领域里仅次于划分泄漏的第二大问题来源。
§6 与库内条目的关系
6.1 关系图谱
库内已有的 EEG 条目可以分成几簇,这份数据处在「听觉—注意—脑机接口」这一簇里,与癫痫检测、睡眠分期、运动想象几簇形成互补关系。它们共享同一类物理信号,但任务目标、标签形态与评估协议完全不同。
┌───────────────────────────┐
│ 头皮 EEG(64 导,湿电极) │
└───────────┬───────────────┘
┌───────────────┬───────┴───────┬────────────────┐
│ │ │ │
癫痫检测簇 运动/BCI 簇 听觉注意簇 睡眠/麻醉簇
├─ bonn-eeg ├─ eeg-dash ├─ 本篇(AAD) ├─ eeg-power-anesthesia
├─ siena-scalp ├─ nebula-... ├─ AV-GC-AAD └─ 相关睡眠条目
└─ 其他癫痫集 └─ 相关运动集 └─ SparrKULee
│
精神科/发育簇
└─ hbn-eeg
这张图读起来要注意一点:同一簇里的条目并不总是「同类替代品」。本篇与 AV-GC-AAD 是同一课题组的两个设计目标,前者是基准、后者是对照;本篇与 SparrKULee 是同一实验室的两个代际,前者小而精、后者大而全。把它们当成「大小不同的同一东西」,是选型时最常见的误判。
6.2 检索路径
如果你是从一个具体任务出发来找数据,路径可以按下面的顺序走。这条路径的设计原则是「先用最省力的方式排除不适用的选项」,而不是「先找最有名的那个」。
| 你的任务 | 先看 | 再看 | 最后确认 |
|---|---|---|---|
| 判断听觉注意能否解码 | 本篇 | SparrKULee(规模) | 自己数据的采集条件 |
| 排除眼动捷径 | AV-GC-AAD | 本篇的警示段 | 采集时是否记录 EOG |
| 训练大模型 | SparrKULee | ICASSP 挑战赛数据 | 显存与许可 |
| 做跨中心泛化 | DTU | 本篇 | 语言与受试人群 |
| 做癫痫检测 | bonn-eeg | siena-scalp-eeg | 标签形态 |
| 做运动想象 | eeg-dash | nebula-reaching-eeg | 导联数与任务设计 |
| 做儿童发育 | hbn-eeg | 本篇(不适用) | 年龄跨度 |
最后一行的写法是有意的:本篇在儿童发育任务上明确不适用,因为全部为成人。把「不适用」写进检索表,比把「适用范围」写长更有用。
6.3 与库内其他生理信号条目的分工
库内还有若干非 EEG 的生理信号条目,它们在工程层面与本篇共享一些处理模式,比如时序切窗、伪迹去除、留一被试交叉验证。但在标签的产生机制上完全不同:本篇的标签来自实验者指示(注意哪一侧),是外生的;癫痫条目的标签来自临床判读,是半外生的;睡眠条目的标签来自分期规则,是规则外生的。理解标签的来源,比理解信号本身更能决定分析方法的选择。
| 条目簇 | 信号 | 标签来源 | 主要难点 | 与本篇的关系 |
|---|---|---|---|---|
| 听觉注意 | EEG 64 导 | 实验指示 | 单试次信噪比 | 本身 |
| 癫痫检测 | EEG 单/多导 | 临床判读 | 类不平衡与个体差异 | 方法可借鉴 |
| 运动想象 | EEG 多导 | 实验范式 | 跨被试迁移 | 范式相近 |
| 睡眠分期 | EEG/EOG/EMG | 分期规则 | 长程时序建模 | 时序方法可借鉴 |
| 麻醉深度 | EEG 多导 | 药物浓度 | 连续标签 | 连续预测可借鉴 |
§7 质量评估与局限性
7.0 阅读本节前的一个前置校正
先做一个校正:不要把这份数据集的质量问题,理解成「采集没做好」。恰恰相反,它的采集在今天看来仍是高标准的:隔声屏蔽室、高采样率主动电极、逐试次的行为核验、刺激与脑电严格绑定。真正的局限全部来自设计取舍——为了让标签干净,牺牲了生态效度;为了控制变量,牺牲了人群多样性;为了控制成本,牺牲了被试规模。
第二个需要校正的误判是「官方警告意味着数据不能用」。官方的两条警告针对的是评估协议与特定算法类别,不是数据本身。按正确的协议使用,这份数据仍然是最可靠的 AAD 参照点之一。恰恰因为它把问题写在明面上,使用它的门槛不是「能不能用」,而是「会不会用」。
第三个校正与「规模」有关。十六名被试在统计上确实偏少,但这不能简单翻译成「结论不可靠」。在留一试次、留一被试的设计下,每名被试内部仍有两百个以上的分析窗口,被试内推断的统计功效是充分的;不足的是被试间的推断,也就是「这个结论对人群是否普遍成立」这一类问题。
7.1 五维评分
下面这张表是按本库统一的五维口径给出的评分,每一维都附了评分依据,避免只给一个总分造成误读。
| 维度 | 得分 | 依据 |
|---|---|---|
| 可获取性 | 5 / 5 | 公开直链、无需注册、许可机器可读 |
| 文档完备度 | 4 / 5 | 字段逐条说明、有官方脚本,但缺少被试人口学 |
| 数据规模 | 2 / 5 | 十六人、每人约七十二分钟,按当代深度学习标准偏小 |
| 结构规范性 | 4 / 5 | 结构体字段清晰统一,但无独立标注文件与事件表 |
| 生态效度 | 2 / 5 | 隔声静坐、湿电极、单一语言、年轻正常人 |
| 方法学透明度 | 5 / 5 | 官方主动公开两类陷阱,行业罕见 |
评分的读法与常见量表不同:这不是「综合质量」,而是「五个不同问题各自的答案」。一份数据可以在可获取性上满分,在生态效度上两分,这两件事同时成立,不矛盾。选型时应该看与你的任务最相关的那一两维,而不是总分。
7.2 分维度展开
可获取性上,Zenodo 的直链稳定,下载不需要任何凭证,校验和公开,版本历史可见,概念 DOI 与版本 DOI 分开,引用时可选择「始终指向最新版」或「锁定某一版」。这套机制比其他平台的自建下载页规范得多。
文档完备度上,记录说明的长度在同类中属于上乘:不仅有字段表,还有实验设计说明、条件定义、音频命名的解释、以及一段关于故事长度的实操提醒。扣分点在人口学缺失与电极位置文件缺失,这两项都需要使用者自行补充。
规模上,需要区分「小时数」与「独立样本数」。十几小时的总时长在 EEG 领域不算小,但十六名独立被试在跨被试推断上是明显短板。深度模型的训练通常需要数百到数千个独立试次,三百二十个试次的总量在小模型上够用,在大模型上只能做微调。
结构规范性上,MATLAB 结构体是那个年代的默认选择,对 MATLAB 用户友好,对 Python 用户需要一次翻译。没有事件表意味着无法做毫秒级的事件对齐校验,只能靠试次边界。这在试次级别的分析里不影响,在事件相关电位分析里就是硬伤。
生态效度上,前面 §1.6 已经拆过四条边界,这里不重复。需要补一句的是:生态效度低不等于没价值,它意味着「在这个数据上成立的结论,只在这个条件下成立」,而这句话本身就是有价值的结论。
7.3 已知的、可枚举的偏差
下面把可以枚举的偏差逐条列出,每条都标明它会影响哪一类结论。这份清单不是批评,而是使用前的必读项。
| 编号 | 偏差 | 具体表现 | 影响的结论 |
|---|---|---|---|
| B1 | 人群偏差 | 全部为健康青年,无听损、无老年 | 向患者群体的外推 |
| B2 | 语言偏差 | 仅荷兰语男声儿童故事 | 跨语言泛化 |
| B3 | 声学偏差 | 插入式耳机,无混响、无背景噪声 | 真实房间中的表现 |
| B4 | 设备偏差 | 64 导湿电极,实验级配置 | 少导联与干电极方案 |
| B5 | 姿势偏差 | 静坐,头部运动受限 | 运动场景鲁棒性 |
| B6 | 注意偏差 | 试次内注意恒定,从不切换 | 动态注意跟踪 |
| B7 | 眼动偏差 | 注意与视线强相关 | 直接分类类算法 |
| B8 | 语料偏差 | 四段故事,内容与韵律单一 | 刺激多样性依赖 |
| B9 | 标签偏差 | 试次级二值标签,无置信度 | 模糊或混合注意状态 |
| B10 | 时长偏差 | 每试次约六分钟,边界效应 | 短时与长时分析的可比性 |
十条里,B6 与 B7 是这份数据最特殊的两条。B6 决定了它不能用于研究注意切换的动态过程;B7 决定了用它评测「只看 EEG、不做相关计算」的算法时,必须额外声明结果可能被眼动解释。其余八条属于所有受控实验数据的通病,不是这份数据独有。
7.3b DAIMS 数据质量评估
按本库统一的二十四项口径逐条核对。判定依据全部来自官方说明与文件清单,凡属推断的条目在说明列写明。
| # | 检查项 | 状态 | 说明 |
|---|---|---|---|
| 1 | 宽格式 | ✅ | 每被试一文件,试次为结构体数组,无嵌套表 |
| 2 | 唯一标识 | ✅ | 被试标识与试次编号联合唯一 |
| 3 | 特殊字符 | ✅ | 字段名纯 ASCII,取值域封闭 |
| 4 | 重复行 | ⚠️ | 实验三的重复呈现是设计使然,需按标记区分 |
| 5 | 缺失编码 | ✅ | 未见哨兵值与占位符 |
| 6 | 标签标识 | ✅ | 注意方向为显式字段,不依赖文件名推断 |
| 7 | 罕见类分组 | ⚠️ | 二分类均衡,但被试数少,组内样本量受限 |
| 8 | 偏倚评估 | ⚠️ | 官方已自陈眼动偏倚与试次指纹两类 |
| 9 | 数据字典 | ✅ | 字段逐条说明,含取值域与含义 |
| 10 | 信息性缺失解释 | ❌ | 无被试人口学,且未解释为何不提供 |
| 11 | 设备记录 | ✅ | 型号、采样率、声压、耳机型号齐全 |
| 12 | 共线性 | ⚠️ | 64 导相邻通道高度相关,需降维或正则 |
| 13 | 编码映射 | ✅ | 条件与注意方向均为字符串枚举 |
| 14 | 时间戳处理 | ⚠️ | 无事件时间戳,只能按试次边界对齐 |
| 15 | 划分建议 | ✅ | 官方明确要求按试次或按故事划分 |
| 16 | 泄漏讨论 | ✅ | 官方用整段文字讨论试次指纹泄漏 |
| 17 | 标签分布 | ✅ | 左右注意在各实验内均衡 |
| 18 | 测量偏倚 | ⚠️ | 两类呈现条件带来的声学差异需分别报告 |
| 19 | 外部验证建议 | ⚠️ | 官方未给外部验证路线,本文 §7.4 补 |
| 20 | 版本记录 | ✅ | 版本号与修订日期公开,含错位校正记录 |
| 21 | 预处理脚本 | ✅ | 提供 MATLAB 预处理参考脚本 |
| 22 | 合规要求 | ✅ | 仅需引用与遵守非商业条款 |
| 23 | 多模态对齐 | ⚠️ | 音频与 EEG 逐试次绑定,但无眼电与视频 |
| 24 | 去标识化 | ✅ | 仅以编号标识,无任何可识别信息 |
DAIMS 评分:18.5 / 24(✅ 计 1 分 × 14 项,⚠️ 计 0.5 分 × 9 项,❌ 计 0 分 × 1 项)
7.4 外部验证矩阵
| 验证类型 | 证据 | 强度 |
|---|---|---|
| 独立复现 | 多篇工作在同一数据上报出线性基线结果 | 强 |
| 跨数据集验证 | 在 DTU、SparrKULee 上做相似分析 | 中,协议不完全一致 |
| 跨语言验证 | 有限,主要在荷兰语与英语语料间 | 弱 |
| 跨设备验证 | 少导联、ear-EEG 的对照研究 | 中 |
| 临床验证 | 无,未见听损人群系统研究 | 无 |
| 在线闭环验证 | 有神经导向助听的离线仿真 | 中 |
| 方法学复核 | 官方自陈的两类陷阱已被多方引用 | 强 |
7.5 它为何能持续:把方法学风险公开成公共知识
这份数据之所以十年后仍是参照点,凭的不是数据量,而是因为它做了一件很少有数据发布方愿意做的事:承认自己的评估协议曾经给出过乐观的结果,并把这一教训写成公开文档。这条自陈比数据本身更能解释它的生命力——它让每一个后来的使用者都必须面对同样的问题,从而把「试次指纹」从一个偶发的技术细节,变成了这个领域的基本常识。
更直接的原因是低门槛。结构简单、字段少、有官方脚本、有明确的许可,意味着一个研究生可以在两天内跑通一条基线。低门槛带来高使用量,高使用量带来可比性,可比性又反过来巩固它的参照地位。这是公共数据基础设施的典型正反馈。
还有一层是它没有被替代。后来的 SparrKULee 在人数量级上远超它,但两者的任务设计不同,不构成替代关系。参照点需要的不是更大,而是不变——一旦刺激、条件、字段结构发生变化,历史上的数字就无法再比较。这份数据从 2016 年采集至今,核心结构没有变,这正是它作为基准的必要条件。
§8 生态位与历史
8.1 从鸡尾酒会问题到神经导向助听器
听觉注意研究的谱系可以追到上世纪五十年代的鸡尾酒会效应:在多人交谈的环境里,人能从混杂声中挑出目标说话人。此后几十年,这条线分成两支,一支走心理声学,用行为指标刻画选择性注意的容量与机制;另一支走神经科学,用电生理记录寻找注意的神经相关物。
2010 年代初期,皮层表面电极(ECoG)记录上的工作证明,被注意说话人的包络可以从神经信号中重建,而且重建结果与未被注意说话人的包络有明显差异。这条证据把「注意在神经层面是可读的」变成了实验事实,也直接催生了头皮 EEG 上的平行尝试。头皮 EEG 的优势是非侵入、可穿戴、成本低,劣势是信噪比低一到两个数量级。
真正把这条线推向工程化的是助听器与人工耳蜗的场景需求。厂商需要一个能在真实佩戴条件下工作的注意读取模块,学术界需要一个能被反复验证的基准。这份数据集就是这个交叉点上的产物:它由神经科学系与电气工程系联合完成,采集标准按神经科学的要求,问题设定按工程的要求。
8.2 线性解码器时代
最早的一批方法都是线性的。刺激重建用最小二乘从 EEG 预测包络,再算相关;反向相关从 EEG 反推刺激特征;空间滤波用共空间模式一类的方法最大化两类之间的可分性。这些方法的共同特点是参数少、可解释、训练快,而且在一个受试者身上训练的结果通常能直接用到同一受试者的其他试次上。
线性方法的性能天花板不高,但它确立了两个至今有效的结论。第一,被注意包络与脑电的相关确实高于未被注意包络,这个差异在统计上是稳定的。第二,性能对决策窗口极其敏感,十秒窗口与一秒窗口之间的差距可以达到几十个百分点。这两个结论是后续所有非线性方法的对照系。
线性方法还留下了一个副产品:延迟。刺激重建的滤波器组通常取零到两百五十毫秒的滞后,这个范围与听觉皮层响应的潜伏期一致。如果把滞后范围扩展到更宽,性能会小幅提升,但同时会把滤波器的解释性稀释掉。这条经验后来成了「可解释性」与「性能」之间的第一个权衡点。
8.3 深度网络与竞赛化
2010 年代后期,卷积网络与循环网络开始进入这个题目。卷积网络被用来做端到端的刺激重建,省掉手工设计特征;后来出现专门针对 EEG 的空间-时间卷积结构,把通道维度当作空间、时间维度当作序列。这些方法在受控条件下的确优于线性基线,但优势幅度通常只有几个百分点,而且对划分协议极为敏感。
2023 年的 ICASSP 听觉 EEG 解码挑战赛是一个转折点。它把任务统一成两条:匹配/不匹配二分类,与刺激包络回归。前者给一个 EEG 片段与两段音频,判断哪一段是被注意的;后者要求从 EEG 回归出包络并算相关。统一任务定义让不同方法第一次可以在同一把尺子上比较,也让「划分协议」这个隐性变量暴露在台面上。
挑战赛之后,自监督与对比学习进入这个领域。思路是用大量无标签 EEG 预训练一个表征,再在小样本上微调。这条路在数据稀缺时理论上更划算,实际效果取决于预训练语料的分布是否与目标任务接近。有工作报告在挑战赛任务上取得显著提升,但这类结果需要按试次划分复核,否则无法排除泄漏。
| 阶段 | 代表方法 | 特点 | 已知弱点 |
|---|---|---|---|
| 线性重建 | 最小二乘、岭回归 | 可解释、训练快 | 天花板低 |
| 空间滤波 | 共空间模式、判别分析 | 利用通道间结构 | 依赖通道蒙太奇 |
| 深度重建 | 卷积网络端到端 | 省掉手工特征 | 需大量数据 |
| 分类式 AAD | 直接二分类 | 结构简单 | 易受眼动干扰 |
| 表征学习 | 对比学习、自监督 | 小样本友好 | 需预训练语料 |
| 大模型微调 | 语音表征网络加回归头 | 利用语音先验 | 划分敏感度高 |
8.4 这份数据在今天的生态位
放到今天的地图上看,这份数据不再是「最新」也不是「最大」,它的角色更接近老式仪器的校准标准件:平时的实验不会天天用它,但每当有人报告一个异常好的结果,第一件事就是拿它去复核。
它的三个直接邻居是 AV-GC-AAD、SparrKULee 与 DTU 数据。AV-GC-AAD 解决的是眼动混淆,SparrKULee 解决的是规模,DTU 解决的是跨中心与跨人群。三者各自补了它的一块短板,但没有一个能同时替代它——因为它们都在别处做了新的取舍。
| 资源 | 补的是哪块短板 | 自身的新取舍 |
|---|---|---|
| 本篇 | 提供基准 | 规模小、眼动强 |
| AV-GC-AAD | 排除眼动 | 条件复杂、部分条件过难 |
| SparrKULee | 规模 | 非竞争言语任务 |
| DTU | 跨中心 | 公开程度较低 |
| ICASSP 挑战赛 | 任务统一 | 分散数据、协议细节多 |
§9 使用指引
9.1 三种角色的路径
不同的使用者带着不同的问题进来,路径差别很大。下面按三种典型角色给出最短路线,避免每个人从零摸索。
| 角色 | 首要目标 | 第一步 | 第二步 | 验收标准 |
|---|---|---|---|---|
| 学生/入门 | 跑通一条基线 | 单被试、单条件、线性重建 | 扩到全体被试、按试次划分 | 得到与文献同量级的相关系数 |
| 方法研究者 | 检验新模型是否有真实增益 | 固定划分与基线 | 与原方法在同一划分比较 | 增益在留一试次下仍显著 |
| 工程评估者 | 判断可行性与延迟 | 扫窗口长度与准确率曲线 | 换成少导联子集重测 | 得到可接受的延迟-准确率点 |
9.2 一条最短的可用流程
下面这条流程刻意压缩到最少步骤,目的是让使用者在半天内得到第一个可信数字。它不追求性能,只追求「不犯 §4.6 的案例里的错误」。
#-- 环境:python 3.10 以上,numpy scipy scikit-learn
python -m venv .venv && source .venv/bin/activate
pip install numpy scipy scikit-learn soundfile
#-- 目录约定:S1.mat 至 S16.mat 与 stimuli/ 放在同一层
ls S*.mat | wc -l
python -c "import scipy.io as sio;d=sio.loadmat('S1.mat',squeeze_me=True,struct_as_record=False);print(len(d['trial']))"
import glob, numpy as np, scipy.io as sio, soundfile as sf
from scipy.signal import butter, filtfilt, hilbert, resample_poly
from sklearn.linear_model import Ridge
#-- 1. 读一名被试的全部试次
def subject_trials(path):
m = sio.loadmat(path, squeeze_me=True, struct_as_record=False)
return list(np.atleast_1d(m["trial"]))
#-- 2. 包络(与 §5.3 同一套参数,保证可比)
def env_of(wav, fs=16000, target=64):
b, a = butter(4, [1.0 / (fs / 2), 8000.0 / (fs / 2)], btype="band")
x = filtfilt(b, a, wav)
e = np.abs(hilbert(x))
b2, a2 = butter(4, 30.0 / (fs / 2), btype="low")
e = filtfilt(b2, a2, e)
g = np.gcd(target, fs)
e = resample_poly(e, target // g, fs // g)
return (e - e.mean()) / (e.std() + 1e-12)
#-- 3. 留一试次交叉验证:训练用 19 个试次,测试用剩下 1 个
def loo_trial_accuracy(trials, stim_dir="stimuli"):
hits, total = 0, 0
for k in range(len(trials)):
test = trials[k]
train = [t for i, t in enumerate(trials) if i != k]
if str(test.condition) != "dry":
continue
Xtr, ytr = [], []
for t in train:
eeg = np.asarray(t.RawData.EegData, dtype=float)
wav = sf.read(f"{stim_dir}/{str(t.stimuli[0])}")[0]
env = env_of(wav)
n = min(len(env), eeg.shape[0])
Xtr.append(eeg[:n][:, ::2])
ytr.append(env[:n])
break
#-- 其余训练试次略,结构与上面相同,逐个 append
X = np.vstack(Xtr)
y = np.concatenate(ytr)
model = Ridge(alpha=1e3).fit(X, y)
eeg = np.asarray(test.RawData.EegData, dtype=float)
pred = model.predict(eeg[:, ::2])
w0 = sf.read(f"{stim_dir}/{str(test.stimuli[0])}")[0]
w1 = sf.read(f"{stim_dir}/{str(test.stimuli[1])}")[0]
e0, e1 = env_of(w0), env_of(w1)
n = min(len(pred), len(e0), len(e1))
r0 = np.corrcoef(pred[:n], e0[:n])[0, 1]
r1 = np.corrcoef(pred[:n], e1[:n])[0, 1]
att_left = str(test.attended_ear) == "L"
guess_left = r0 > r1
hits += int(guess_left == att_left)
total += 1
return hits / max(total, 1), total
print(loo_trial_accuracy(subject_trials("S1.mat")))
这段代码里有一处「其余训练试次略」,是刻意的:完整版只是把循环体里那段复制到所有训练试次上,写出来会更长但不增加信息。跑通之后你会得到一个数量级在五成五到七成之间的数字,取决于窗口长度与被试;这个范围内的数字是正常的,超过八成基本可以断定划分出了问题。
9.3 引用方式
Das N., Biesmans W., Bertrand A., Francart T. (2016).
Auditory-inspired speech envelope extraction methods for improved
EEG-based auditory attention detection in a cocktail party scenario.
IEEE Transactions on Neural Systems and Rehabilitation Engineering, 25(5), 402-412.
Das N., Francart T., Bertrand A. (2026).
Auditory Attention Detection Dataset KULeuven (version 2.1) [Data set].
Zenodo. https://doi.org/10.5281/zenodo.21415059
概念 DOI(始终指向最新版本):https://doi.org/10.5281/zenodo.3377910
§10 AI 使用声明
| 项 | 说明 |
|---|---|
| 生成方式 | 由 AI 助手起草,人工核验官方页面后定稿 |
| 数据来源 | Zenodo 记录 21415059 的官方说明与文件清单 |
| 论文来源 | Europe PMC 检索到的摘要,用于交叉核对规模与任务描述 |
| 数字口径 | 只采用官方说明中出现的规模、结构与边界数字 |
| 未核验项 | 各被试的实际信噪比、逐试次时长分布、劣质试次比例 |
| 判断归属 | 评分、适用性判断、边界划分由本文作者给出,非官方意见 |
| 更新机制 | 若官方记录更新版本,本文需重新核对字段与规模 |
| 使用限制 | 本文不构成任何商业授权,商业使用须自行取得许可 |
常见误读(避坑清单)
| 说法 | 实际 | 证据 |
|---|---|---|
| 「这是最大的听觉 EEG 数据集」 | 不是,同期还有更大规模的语音响应库 | 官方未作此声明,规模见 §2.1 |
| 「准确率九成说明方法很强」 | 多半来自随机划分造成的试次泄漏 | 官方 2024 年 1 月补充说明 |
| 「直接分类 EEG 片段是标准做法」 | 官方建议不要在该集上这样评测 | 官方关于眼动偏倚的段落 |
| 「十六个人就是十六个独立样本」 | 每人二十个试次,样本量应按试次计 | 官方字段说明 |
| 「包络相关可以直接横向比较」 | 包络参数不同则绝对值不可比 | 官方脚本给出的默认参数 |
| 「有原始 8192 Hz 数据可以直接下载」 | 发布版为 128 Hz,原始需申请 | 官方字段说明与许可段 |
| 「注意方向就是声源位置」 | 声源固定,注意方向被试可切换 | 官方条件定义 |
| 「两个呈现条件可以混在一起训练」 | 两类声学线索不同,应分别报告 | 官方对 HRTF 与 dry 的定义 |
| 「故事长度一致可以直接用音频长度对齐」 | 长度不一,须以 EEG 长度为准截断 | 官方记录的实操提醒 |
| 「可以自由用于商业模型训练」 | 许可为非商业,须另行授权 | 记录页许可字段 |
FAQ
Q1:它和 SparrKULee 是同一个数据集吗?
不是。两者同出鲁汶但代际不同:本篇是 16 人、每人约七十二分钟的早期 AAD 基准;SparrKULee 是 85 人、每人九十到一百五十分钟的后续大集。做算法对比常用后者做规模基准,前者做经典参照。
Q2:为什么随机交叉验证会给出虚高的准确率?
同一试次内被试整段注意同一侧,片段之间共享缓慢变化的状态与眼动特征。随机切分会把同试次的兄弟片段放进训练集,模型学到的是试次指纹,而不是注意状态。
Q3:可以直接把它当空间听觉注意分类器的评测集吗?
不建议。官方明示本集眼动偏倚较强,不做刺激-神经相关计算的直接分类器可能借道眼动。要排除这条捷径,应改用同组的 AV-GC-AAD。
Q4:采样率为什么从八千多降到一百二十八?
语音包络跟踪的主要信息集中在 30 Hz 以下,128 Hz 已有充足余量,且体积缩小六十四倍。需要原始采样率的须联系作者团队申请。
Q5:十六名被试够不够做跨被试研究?
做被试内的解码足够,做被试间的统计推断偏弱。建议报告逐被试结果并给出置信区间,而不是只报一个平均值。
Q6:为什么音频要以 EEG 长度截断?
因为故事长度不一致,被试被允许听完自己注意的那一段,较短的一路会先结束。若按音频长度对齐,尾部会变成单声源,破坏竞争言语的前提。
Q7:发布版还能不能还原原始信号?
不能完全还原。0.5 Hz 高通与 MWF 去伪迹都是不可逆操作。需要原始数据须向作者团队申请。
Q8:中文语料有没有对应的数据?
公开的中文听觉注意数据集目前不普遍,结构与文档同等完善者更少。跨语言验证通常先从荷兰语与英语语料的对照做起。
Q9:这条数据能直接用于助听器产品吗?
不能。许可为非商业,采集条件也与真实佩戴差距很大。它的作用是原理验证与算法对照,不是产品训练集。
Q10:如果我只有四个电极,能不能在本篇上做预实验?
可以,但要说明这是模拟而非真实少导联。做法是从 64 导里选子集重训,性能下降的幅度可以给出一个乐观上界。
Q11:为什么官方要专门写一段警告?
因为发布方发现大量下游工作沿用了会泄漏的划分方式,结果无法与早期线性方法比较。写出来是为了让后续使用者在同一把尺子上比较。
Q12:一个可信的入门结果大概是多少?
留一试次、十秒窗口、线性重建下,五成五到七成是常见区间。低于五成查对齐与符号,高于八成查划分。
术语表
| 术语 | 英文 | 释义 |
|---|---|---|
| 听觉注意解码 | auditory attention decoding | 从神经信号判断被试正在注意哪一路声源 |
| 鸡尾酒会问题 | cocktail party problem | 多人交谈环境中选择性听取目标说话人的现象 |
| 语音包络 | speech envelope | 语音幅度随时间变化的低频包络线 |
| 刺激重建 | stimulus reconstruction | 从神经信号反向预测刺激特征的建模方式 |
| 前向模型 | forward model | 从刺激预测神经响应的建模方向 |
| 后向模型 | backward model | 从神经响应反推刺激的建模方向 |
| 时间响应函数 | temporal response function | 描述神经响应随刺激滞后的线性核 |
| 试次指纹 | trial fingerprint | 同试次片段共享的状态特征,被模型误当作类别信号 |
| 留一试次 | leave-one-trial-out | 以试次为单位划分训练与测试 |
| 留一被试 | leave-one-subject-out | 以被试为单位划分,检验跨被试泛化 |
| 眼电 | electrooculography | 眼球运动产生的电位,可被头皮电极记录 |
| 眼动偏倚 | gaze bias | 注意方向与视线方向相关造成的混淆 |
| 空间 AAD | spatial AAD | 不依赖刺激相关计算、仅凭空间模式分类的方法 |
| 头相关传递函数 | HRTF | 描述声源方位对耳道处声音影响的滤波函数 |
| 双耳分听 | dichotic listening | 两路声音分别送入左右耳 |
| 多通道维纳滤波 | MWF | 利用通道间相关性抑制伪迹的空间滤波方法 |
| 决策窗口 | decision window | 用于做一次判定所累积的信号时长 |
| 生物半导体主动电极 | active electrode | 电极端内置阻抗变换的采集方案 |
| 皮层表面电极 | ECoG | 颅内硬膜下电极记录,信噪比高于头皮 EEG |
| 耳道脑电 | ear-EEG | 在耳道或耳周采集的脑电,便于可穿戴 |
| 神经导向助听 | neuro-steered hearing aid | 依据神经信号选择增强声源的助听方案 |
| 匹配/不匹配任务 | match-mismatch | 判断给定音频是否与被注意声源一致的分类任务 |
| 表征学习 | representation learning | 学习可迁移的中间表示而非直接学任务 |
| 概念 DOI | concept DOI | 指向某一数据系列最新版本的持久标识 |
附录 A:核心数字核对表
| 项 | 值 | 来源 | 来源层级 |
|---|---|---|---|
| 被试数 | 16 | Zenodo 记录说明 | 官方页面 |
| 每被试试次 | 20 | Zenodo 记录说明 | 官方页面 |
| 总试次数 | 320 | 16 × 20 推算 | 推算 |
| 每人时长 | 约 72 分钟 | Zenodo 记录说明 | 官方页面 |
| 采样率(原始) | 8192 Hz | Zenodo 记录说明 | 官方页面 |
| 采样率(发布) | 128 Hz | 字段说明 | 官方页面 |
| 通道数 | 64 | Zenodo 记录说明 | 官方页面 |
| 故事数 | 4 | Zenodo 记录说明 | 官方页面 |
| 呈现条件 | 2(HRTF 与 dry) | 字段说明 | 官方页面 |
| 数据体积 | 约 5.2 GB | Zenodo 文件清单求和 | 官方页面 |
| 录音场景 | 隔声电屏蔽室 | Zenodo 记录说明 | 官方页面 |
| 播放设备 | Etymotic ER3A 插入式耳机 | Zenodo 记录说明 | 官方页面 |
| 播放声压 | 60 dBA | Zenodo 记录说明 | 官方页面 |
| 滤波下界 | 0.5 Hz | Zenodo 记录说明 | 官方页面 |
| 许可 | CC BY-NC-SA 4.0 | 记录页许可字段 | 官方页面 |
| 版本 | 2.1 | 记录页版本字段 | 官方页面 |
| 最新修订 | 2026-07-17 校正 70 毫秒错位 | 记录说明 | 官方页面 |
| 语言 | 荷兰语 | 记录说明与刺激来源 | 官方页面 |
附录 B:数字的来源分层
| 层级 | 定义 | 本文中的例子 | 可靠性 |
|---|---|---|---|
| 一级:官方页面 | Zenodo 记录的说明、字段表、文件清单、许可字段 | 被试数、通道数、采样率、体积、许可 | 高,可逐字复核 |
| 二级:论文摘要 | Europe PMC 检索到的同行评议或预印本摘要 | 同类资源规模、通行方法、竞品对照 | 中高,摘要可能滞后 |
| 三级:推算与未核实 | 由一级数据计算得到,或官方未给出 | 总试次数、总小时数、场景外推 | 使用时须标注 |
本文刻意没有给出以下数字,因为核验不到官方来源:各被试的实际信噪比、逐试次的劣质片段比例、被试的年龄与性别分布、电极阻抗的实际测量值。这些数字需要下载全量数据并做分布统计才能得到,而这一步应当由使用者在自己的分析里完成。
附录 C:完整参考文献
- Das N., Biesmans W., Bertrand A., Francart T. Auditory-inspired speech envelope extraction methods for improved EEG-based auditory attention detection in a cocktail party scenario. IEEE Transactions on Neural Systems and Rehabilitation Engineering, 2017, 25(5): 402-412.
- Das N., Van Eyndhoven S., Francart T., Bertrand A. Adaptive attention-driven speech enhancement for EEG-informed hearing prostheses. EMBC 2016.
- Van Eyndhoven S., Francart T., Bertrand A. EEG-informed attended speaker extraction from recorded speech mixtures. IEEE Transactions on Biomedical Engineering, 2017, 64(5): 1045-1056.
- Das N., Biesmans W., Bertrand A., Francart T. The effect of head-related filtering and ear-specific decoding bias on auditory attention detection. Journal of Neural Engineering, 2016, 13(5): 056014.
- Somers B., Francart T., Bertrand A. A generic EEG artifact removal algorithm based on the multi-channel Wiener filter. Journal of Neural Engineering, 2018, 15(3): 036007.
- Rotaru I., Geirnaert S., Heintz N., Van de Ryck I., Bertrand A., Francart T. What are we really decoding? Unveiling biases in EEG-based decoding of the spatial focus of auditory attention. Journal of Neural Engineering, 2024, 21(1): 016017.
- Puffay C., et al. Relating EEG to continuous speech using deep neural networks: a review. Journal of Neural Engineering, 2023, 20: 041003.
- Accou B., et al. SparrKULee: A Speech-evoked Auditory Response Repository of the KU Leuven, containing EEG of 85 participants. bioRxiv, 2023.
- de Cheveigné A., et al. Auditory attention decoding: a review(综述条目,用于方法脉络)。
- Francart T., Van Wieringen A., Wouters J. APEX 3: a multi-purpose test platform for auditory psychophysical experiments. Journal of Neuroscience Methods, 2008, 172(2): 283-293.
附录 D:任务代码
下面这段代码把「读数据、提包络、留一试次、算准确率、输出表」串成一条可以直接跑通的流水线,供复现使用。与 §9.2 相比,这里补全了训练试次的累积部分。
import glob
import numpy as np
import scipy.io as sio
import soundfile as sf
from scipy.signal import butter, filtfilt, hilbert, resample_poly
from sklearn.linear_model import Ridge
from sklearn.preprocessing import StandardScaler
def envelope(wav, fs=16000, target=64):
b, a = butter(4, [1.0 / (fs / 2), 8000.0 / (fs / 2)], btype="band")
x = filtfilt(b, a, np.asarray(wav, dtype=float).ravel())
e = np.abs(hilbert(x))
b2, a2 = butter(4, 30.0 / (fs / 2), btype="low")
e = filtfilt(b2, a2, e)
g = np.gcd(target, fs)
e = resample_poly(e, target // g, fs // g)
return (e - e.mean()) / (e.std() + 1e-12)
def read_subject(path, stim_dir):
m = sio.loadmat(path, squeeze_me=True, struct_as_record=False)
out = []
for t in np.atleast_1d(m["trial"]):
eeg = np.asarray(t.RawData.EegData, dtype=float)
names = [str(x) for x in np.atleast_1d(t.stimuli)]
envs = [envelope(sf.read(f"{stim_dir}/{n}")[0]) for n in names]
n = min([eeg.shape[0]] + [len(e) for e in envs])
out.append({
"eeg": eeg[:n][:, ::2],
"env_left": envs[0][:n],
"env_right": envs[1][:n],
"att_left": int(str(t.attended_ear) == "L"),
"condition": str(t.condition),
})
return out
def loo(subject_trials):
X, Y, L = [], [], []
for r in subject_trials:
X.append(r["eeg"])
Y.append(r["env_left"] + r["env_right"])
L.append(r["att_left"])
results = []
for k in range(len(X)):
train = [i for i in range(len(X)) if i != k]
model = Ridge(alpha=1e3).fit(np.vstack([X[i] for i in train]),
np.concatenate([Y[i] for i in train]))
pred = model.predict(X[k])
r_left = np.corrcoef(pred, subject_trials[k]["env_left"])[0, 1]
r_right = np.corrcoef(pred, subject_trials[k]["env_right"])[0, 1]
guess = int(r_right <= r_left)
results.append((k, guess, L[k], round(float(r_left), 4), round(float(r_right), 4)))
acc = np.mean([int(g == t) for _, g, t, _, _ in results])
return acc, results
if __name__ == "__main__":
trials = read_subject("S1.mat", "stimuli")
acc, rows = loo(trials)
print("留一试次准确率", round(float(acc), 3), "试次数", len(rows))
for r in rows[:5]:
print(r)
这段代码是完整的,不依赖任何未列出的文件。它故意保持简单:线性模型、无超参搜索、单一条件。目的是给使用者一个可以逐行读懂并修改的起点,而不是一个需要调参的框架。
附录 E:如果只记五件事
| 序号 | 记住什么 | 为什么重要 |
|---|---|---|
| 1 | 它是 16 名被试、每人约七十二分钟的鲁汶 AAD 基准 | 决定了它适合做对照,不适合做规模训练 |
| 2 | 随机划分会因试次指纹产生虚高准确率 | 决定了第一步应该怎么划分 |
| 3 | 本集眼动偏倚较强,直接分类需谨慎 | 决定了结果能不能归因于听觉注意 |
| 4 | 发布版为 128 Hz 且已去伪迹 | 决定了能做什么分析、不能做什么分析 |
| 5 | 官方说明本身就是最有价值的部分 | 决定了引用它时应连带引用哪两篇文献 |
编辑说明
本页的事实核验时间为 2026 年 10 月 27 日。核验方式为直接读取 Zenodo 记录 21415059 与 11058711 的公开元数据(记录说明、文件清单、许可字段),以及 Europe PMC 接口返回的论文摘要;未下载全量数据,未做逐片段统计。
候选清单中的条目标识为泛称「auditory-eeg」,没有给出更具体的指向。本页据此选择核到了鲁汶 AAD 数据集,理由有三:其一,它是 AAD 领域被引用最多、方法学讨论最充分的单中心基准;其二,它的许可与字段说明完整可查,符合百科条目对来源层级的要求;其三,它的官方说明中明确写出了两类评估陷阱,能让条目对使用者产生实际价值。若后续需要覆盖 SparrKULee 或 AV-GC-AAD,宜各自单列条目,而不是并入本页。
以下内容为未核实项,正文中未给出具体数值:各被试的实际信噪比与劣质片段比例、被试年龄与性别分布、电极阻抗测量值、逐试次时长的完整分布。这些都需要下载全量数据后做分布统计,本文按编辑纪律不做。
文中出现的价格、性能与对比数字,均以官方页面或论文摘要的表述为准;涉及推算的地方已在附录 A 中标注「推算」,在附录 B 中归为三级。
相关数据集导航
以下为站内 AI-Ready 数据集百科中与本词条共享多个主题标签的相关数据集,按相关度降序排列:
- eeg-dash — 共享标签:生理信号 / 脑电信号 / 脑机接口
- eeg-eye-gaze-for-fls-tasks — 共享标签:生理信号 / 脑电信号
- mssvepdb — 共享标签:生理信号 / 脑电信号 / 脑机接口
- eegmmidb — 共享标签:生理信号 / 脑电信号 / 脑机接口
- bci-competition-iv-2a — 共享标签:生理信号 / 脑电信号 / 脑机接口
- stroke-eeg-fnirs — 共享标签:生理信号 / 脑电信号 / 脑机接口
- seed — 共享标签:生理信号 / 脑机接口
- deap — 共享标签:生理信号 / 脑电信号
- motion-artifact — 共享标签:生理信号 / 脑电信号
- moabb — 共享标签:生理信号 / 脑电信号 / 脑机接口
导航说明:本章节由全站统一标签体系自动计算生成(标签重合度算法),双向可达;点击链接可跳转至对应数据集词条。

