Junetheriver's Blog

Anything but useful

Pasted image 20260609223627

视频链接:芙宁娜&莉奈娅 ようこそジャパリパークへ【原神MMD】_哔哩哔哩_bilibili

环境配置

Blender 4.5
MMD Tools: 4.3.9

莉奈娅脸部 SDF 贴图 UV 映射问题

问题:莉奈娅模型的脸部贴图里,眼眶部分和脸的其他部分不是连续的而是独立的,这导致普遍使用的脸部 SDF 贴图如果用她现成的 UV 的话眼眶那块都是暗的
解决方案:新建一个 UV,然后将里面的眼眶部分匹配到正确的位置

物理烘焙时裙子错位

一开始以为是模型刚体碰撞组的问题,实际上是开头的 offset 设的不够大。本来设了 10 帧,结果发现在第一帧和第二帧之间,莉奈娅模型的位移过大了,她的裙子没跟上。这也是因为这是双人的动作导致的,两个模型都从原点开始,一开始需要平移到对应的位置,这比单人模型摆姿势要求更长的 offset,才能让位移变慢一点

表情存在延迟

如果用一个 placehold 来控制角色的脸部表情的关键帧,那在导入动作 vmd 的时候,mmd_tool 的那个 offset 是不管用的,得在时间轴里自己去移位

待解决问题

  1. 场景不满意
  2. 光照不满意
  3. 精度不满意(最终渲染的视频质量比较低)
  4. 渲染不满意(颜色和其他 MMD 还是有差距,并且没做到眼透、背景边缘线等特效)

问题描述

群晖(Synology DSM)开启 SSH 服务后,使用公钥登录仍然失败,客户端只看到:

1
Permission denied (publickey)

一开始容易误判为 .ssh/authorized_keys 没配置好、客户端没有加载正确 key、SSH 服务没开,或者 DSM 的用户家目录路径理解错了。DSM 7 的 home 目录通常不是传统 Linux 的 /home/<用户名>,而是:

1
/var/services/homes/<用户名>

实际路径通常指向:

1
/volume1/homes/<用户名>

这次真正的问题不是公钥内容本身,而是 Synology 的 ACL 和 SSH 安全检查冲突:为了让 VerySync 同步,把 /volume1/homes/river 这个 home 根目录授权给了 verysync。但 Synology 的 SSH 会通过 syno_acl_safe_path() 检查 home path 的 ACL。只要 home 根目录上出现过宽的 ACL、非登录用户的 ACL,或者从父目录继承来的不安全 ACL,OpenSSH 就会拒绝读取 authorized_keys,最终表现为 Permission denied (publickey)

也就是说:

  • 公钥可能已经放对了。
  • .ssh/authorized_keys 权限也可能看起来没问题。
  • 但只要 home 目录本身的 Synology ACL 不“安全”,SSH 仍然会拒绝公钥登录。

解决步骤

先确认客户端确实在尝试公钥登录

本机执行:

1
ssh -v river@<群晖IP>

重点看调试输出里有没有:

1
Offering public key:

如果没有,说明客户端根本没有拿这个 key 去试,可以显式指定:

1
ssh -i ~/.ssh/id_ed25519 river@<群晖IP>

如果已经看到 Offering public key,但最后仍然是:

1
Permission denied (publickey)

就继续排查服务端。

确认 Synology 的 .ssh 位置和基础权限

在 NAS 上确认真实 home:

1
2
echo $HOME
pwd

DSM 7 常见路径是:

1
/var/services/homes/river

公钥文件应放在:

1
/var/services/homes/river/.ssh/authorized_keys

基础权限应为:

1
2
3
chmod 755 /var/services/homes/river
chmod 700 /var/services/homes/river/.ssh
chmod 600 /var/services/homes/river/.ssh/authorized_keys

并确认 owner 是登录用户自己:

1
2
ls -la /var/services/homes/river
ls -la /var/services/homes/river/.ssh

开启 Telnet 作为救援入口

如果 SSH 已经完全进不去,先在 DSM 里临时开启 Telnet:

1
控制面板 -> 终端机和 SNMP -> 启用 Telnet

从局域网机器连接群晖:

1
telnet <群晖IP>

登录后切换到有权限排查系统服务的账号。如果需要 root 权限,可以用管理员账号后再执行:

1
sudo -i

确认不是 SSH 服务或端口问题

先检查 DSM 里 SSH 服务是否已开启、端口是否正确,也可以在系统里看 SSH 相关进程是否存在:

1
ps | grep sshd

如果 SSH 服务已经在跑,但客户端依然连不上,就不要只盯着端口和防火墙,继续看服务端日志。

手动启动一个调试用 SSHD 获取服务端日志

DSM 自带的 SSH 服务日志不一定能在界面里直接看到。为了拿到更明确的错误信息,可以在 Telnet 会话里手动启动一个新的 sshd,监听临时端口,例如 2222

1
/bin/sshd -p 2222 -D -e

其中:

  • -p 2222:使用临时端口,避免影响原来的 SSH 服务。
  • -D:以前台方式运行,方便直接观察输出。
  • -e:把日志输出到标准错误,直接显示在当前终端。

然后在另一台机器上连接这个临时端口:

1
ssh -p 2222 <用户名>@<群晖IP>

这时 Telnet 里的 sshd 前台日志会打印更具体的失败原因。关键线索是 SSH 对用户 home 目录、.ssh 目录或 Synology ACL 的安全检查没有通过,可能会看到类似:

1
Authentication refused: bad ownership or modes for directory ...

或者与 Synology ACL 相关的 bad ACL permission / syno_acl_safe_path 之类信息。

这个日志说明问题不在客户端,也不只是 SSH 端口没开,而是登录用户目录权限不符合 SSH 的安全要求。

检查 Synology ACL

对 home 目录查看 ACL:

1
synoacltool -get /volume1/homes/river

synoacltool 里会看到类似:

1
2
3
0: user:river:allow:... (level:0)
1: group:users:allow:... (level:0)
2: user:verysync:allow:... (level:1)

这里的 level 表示 ACL 继承层级:

  • level:0:当前目录上直接定义的 ACL。
  • level:1:从父目录继承来的 ACL。
  • level:2:从更高层目录继承来的 ACL。

真正影响权限的是 allow / deny 和后面的权限位,但 Synology 的 SSH 安全检查有时也会被 inherited ACL 影响。也就是说,即使 .sshauthorized_keys 的传统 Unix 权限正确,只要 home path 上有不安全的 ACL,SSH 仍然会拒绝。

清理 home 根目录上的 VerySync ACL

不要给 /volume1/homes/river 本身添加 verysync ACL。home 根目录应该尽量保持干净:

1
2
3
4
5
6
synoacltool -del /volume1/homes/river
synoacltool -add /volume1/homes/river "user:river:allow:rwxpdDaARWcCo:fd--"

chmod 755 /volume1/homes/river
chmod 700 /volume1/homes/river/.ssh
chmod 600 /volume1/homes/river/.ssh/authorized_keys

如果 owner 被改坏,也要改回当前登录用户:

1
2
chown river:users /volume1/homes/river
chown -R river:users /volume1/homes/river/.ssh

这里的核心原则是:home 根目录不要给 verysynceveryone 或其他无关用户额外授权。

重新测试 SSH

修复后先测试临时端口:

1
ssh -p 2222 river@<群晖IP>

如果临时端口已经能登录,再回到 DSM 的正常 SSH 端口测试:

1
ssh river@<群晖IP>

确认正常后关闭 Telnet,避免留下不必要的明文登录入口。

调整 VerySync 的同步目录

如果只是给 home 下的某个子目录授权仍然不行,说明 VerySync 会访问或检查整个 home path,和 Synology SSH 的 safe path 检查天然冲突。不要继续污染 /volume1/homes/river 的 ACL。

更稳的做法是把同步目录移到 home 外:

1
2
3
mkdir -p /volume1/verysync/river
chown -R river:users /volume1/verysync/river
synoacltool -add /volume1/verysync/river "user:verysync:allow:rwxpdDaARWcCo:fd--"

然后让 VerySync 同步:

1
/volume1/verysync/river

如果希望在 home 目录里仍然能看到这个同步目录,可以放一个软链接:

1
ln -s /volume1/verysync/river /volume1/homes/river/Sync

这样 SSH 检查的 home 根目录仍然是干净的,VerySync 需要的 ACL 则只存在于 home 外的数据目录上。

根本原因

在配置 VerySync 的时候,把 /volume1/homes/river 这个 home 根目录授权给了 verysync 用户。Synology DSM 的 SSH 不只检查 .ssh/authorized_keys 的传统 Unix 权限,还会通过 syno_acl_safe_path() 检查 home path 的 Synology ACL。home 根目录上出现 verysync 这类额外 ACL 后,会被 SSH 判定为不安全,最终拒绝公钥登录。

一开始以为只要把权限改到 home 下的具体文件夹即可,但 VerySync 实际上还会访问或检查上级路径;如果不给 home 目录读取权限,它又无法正常同步。所以最终是给 home 目录的读取权限,具体目录再给完全控制权限。

本文由 Codex 根据五一期间的聊天记录整理撰写,内容经我指定主题、结构和写作约束后生成。

五一使用 Codex 做 Blender MMD 自动化的一次尝试

五一期间,我把一部分时间花在了 Blender、MMD 模型和 Codex 的组合上。起点很简单,我想知道一个 agent 能不能帮我把 MMD 相关的重复操作脚本化。以前这些事情主要靠手工流程完成:打开 Blender,导入 PMX,套 VMD,找材质,调描边,试渲染,再根据画面一点点修。真正做起来以后,我发现这次尝试的重点逐渐落在一条可以反复运行、可以检查中间结果、可以迁移到远程机器上的流程。

这篇记录只写主要脉络。很多中间图、调试图和临时版本没有必要全部展开,这些属于工作台上的草稿。真正有价值的是我怎么把 Blender 里的隐式操作变成脚本,怎么让 Codex 在错误反馈里继续推进,以及哪些地方暴露出 agent 使用上的边界。

从读取 blend 开始

一开始我问的是一个很小的问题:test.blend 里有什么文件。这个问题看似只是查看内容,实际给后续所有自动化打了底。我需要读取 .blend 内部的数据块,包括场景、集合、对象、网格、材质、图片、外部库、文本块。

Codex 先用 Blender 4.5 后台打开文件,然后写了一个 inspect_blend.py。这个脚本能在命令行里列出 .blend 内部结构,也能显示网格顶点数、对象材质、图片是否被打包。之后我又让 Codex 检查 Blender 4.5 装了哪些插件,于是有了 inspect_blender_addons.py。这一步确认了两个关键插件:官方 mmd_tools 和本地的 mmd_tools_append

真正的突破点来自继续读 mmd_tools 的源码。MMD 模型导入对应 bpy.ops.mmd_tools.import_model,动作导入对应 bpy.ops.mmd_tools.import_vmd。这些名字找出来以后,MMD 的 GUI 操作就有了脚本入口。我让 Codex 写了一个导入 PMX 和 VMD 的脚本,并用 Furina 的 PMX 做了真实导入测试。第一次完整导入成功以后,我对这件事的判断变了:Blender MMD 自动化的核心问题,是把一串按钮变成稳定的工程流水线。

例如模型和动作导入最后就是这样的调用。这里会先选中目标 MMD root,再让 mmd_tools 把 VMD 应用到当前对象上,同时过滤掉当前 Blender 版本不支持的参数。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
def import_vmd_motion(vmd_path, root, scale=0.08, frame_margin=10):
select_only(root)
directory = os.path.dirname(vmd_path)
filename = os.path.basename(vmd_path)
kwargs = {
'directory': directory,
'files': [{'name': filename}],
'scale': scale,
'margin': frame_margin,
'bone_mapper': 'PMX',
'use_pose_mode': False,
'update_scene_settings': True,
}
supported = {
prop.identifier
for prop in bpy.ops.mmd_tools.import_vmd.get_rna_type().properties
}
return bpy.ops.mmd_tools.import_vmd(
**{key: value for key, value in kwargs.items() if key in supported}
)

把一次搭场景变成流水线

接下来我把目标扩大到完整 AutoMMD 项目。我准备了模型、场景、动作、表情、相机和参考 .blend,要求 Codex 从 project/autommd/blank.blend 开始,每完成一个阶段就保存一个中间 .blend

这个约束非常重要。Blender 自动化最怕一条脚本跑到底,最后只得到一个失败文件或一张坏图。中间结果让问题可以定位:到底是舞台导入错了,角色导入错了,动作没套上,表情没绑定,材质重建错了,还是相机和渲染设置出了问题。

这条流水线后来变成 src/scene/project/assemble_autommd.py。脚本依次清理 blank,导入舞台,导入角色,调用 mmd_tools.morph_slider_setup(type='BIND') 把表情变形绑定到 .placeholder,再把舞蹈 VMD、facial VMD、BGM 和相机 VMD 接进场景。角色描边优先调用 mmd_tools.edge_preview_setup(action='CREATE'),按材质拆分则保留成可选参数,因为这个操作会改变模型结构。

表情绑定和刚体烘焙来自插件源码里的入口。这一步把插件按钮背后的 operator 变成了可以重复调用的脚本。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
def setup_morph_placeholder(root):
select_only(root)
result = bpy.ops.mmd_tools.morph_slider_setup(type='BIND')
if 'CANCELLED' in result:
raise RuntimeError('mmd_tools morph bind cancelled')
placeholder = bpy.data.objects.get('.placeholder')
if placeholder is None:
placeholders = [
obj for obj in bpy.data.objects
if obj.name.startswith('.placeholder')
]
placeholder = placeholders[-1] if placeholders else None
return placeholder


def bake_with_mmd_operator():
bake_op = getattr(bpy.ops.mmd_tools, 'ptcache_rigid_body_bake', None)
if bake_op is None:
raise RuntimeError('mmd_tools rigid body bake is not available')
return bake_op()

材质是最花时间的一块。我给了一个参考文件 伊涅芙人生重启.blend,希望能观察里面的节点配置。Codex 扩展了 inspect 脚本,把参考材质节点导出成 JSON。参考文件里有 Face、Body、Hair 等不同节点组,还有 lightmap、shadow ramp、rim 和 fresnel 相关参数。实际落地时,我选择按脸、皮肤、头发、眼睛、衣服、金属、舞台等类别重建本地可维护的 toon 节点。

材质节点的创建方式也逐渐固定下来。下面这段是简化后的核心逻辑:用 Diffuse BSDF 接 ShaderToRGB,再用 ColorRamp 做 toon 阴影,最后接到 Emission。法线图、贴图、rim 和透明混合都沿着这个基础继续加节点。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
tree = material.node_tree
nodes = tree.nodes
links = tree.links
nodes.clear()

output = nodes.new('ShaderNodeOutputMaterial')
diffuse = nodes.new('ShaderNodeBsdfDiffuse')
shader_to_rgb = nodes.new('ShaderNodeShaderToRGB')
ramp = nodes.new('ShaderNodeValToRGB')
emission = nodes.new('ShaderNodeEmission')

ramp.color_ramp.elements[0].position = 0.45
ramp.color_ramp.elements[0].color = shadow_color
ramp.color_ramp.elements[1].color = lit_color

links.new(diffuse.outputs['BSDF'], shader_to_rgb.inputs['Shader'])
links.new(shader_to_rgb.outputs['Color'], ramp.inputs['Fac'])
links.new(ramp.outputs['Color'], emission.inputs['Color'])
links.new(emission.outputs['Emission'], output.inputs['Surface'])

这一步的成果是 05_final.blend,还有一组可回溯的中间文件。这些文件记录了空场景到最终自动搭建的路径,也让我后续可以基于同一条流水线替换角色,例如 SW999 和 Linaiya。

AutoMMD 流水线生成的 Furina 预览

这张图来自后续反复调整后的 Furina 预览。它能代表这条流水线最终想解决的问题:模型、动作、材质、描边、灯光和相机都由脚本稳定落到一个可继续调整的 .blend 里。

渲染脚本和远程机器

本地能跑以后,我很快遇到另一个现实问题:渲染应该放到适合的机器上。于是五一期间的另一个主线变成远程渲染。

第一步是资源打包。Blender 的 .blend 常常引用外部贴图、声音、字体、缓存或 library。如果直接把文件丢到 Linux 服务器,远端很容易缺资源。Codex 写了 pack_external_resources.py,核心使用 Blender 自己的 bpy.ops.file.pack_all(),再加上外部引用扫描和缺失资源检测。

第二步是后台渲染。render_blend_linux.py 支持单帧和动画渲染,可以设置输出路径、分辨率、采样、引擎和格式。随后我又追问 mmd_tools 的烘焙按钮能不能脚本化,于是补了 bake_mmd_rigid_body.py。这个脚本先调用 mmd_tools.ptcache_rigid_body_bake,后台上下文不合适时再走 Blender point cache 的兜底路径。我用短区间 1 到 2 帧验证过,刚体缓存可以在后台完成烘焙。

本地预览和远程渲染的底层调用都绕不开 bpy.ops.render.render。静帧渲染会设置当前帧、输出格式和路径,然后调用 write_still=True

1
2
3
4
5
6
7
8
scene = bpy.context.scene
scene.render.engine = 'BLENDER_EEVEE_NEXT'
scene.frame_set(args.frame)
scene.render.image_settings.file_format = 'PNG'
scene.render.filepath = str(Path(args.output).resolve())

print(f'Rendering frame {scene.frame_current} to: {scene.render.filepath}')
bpy.ops.render.render(write_still=True)

第三步是把这些拼成远程渲染流程。后来形成了 scripts/remote_render:本地打包,上传到 spark,远端 tmux 跑 Blender,实时跟日志,完成后把结果、日志、manifest 和 status.env 下载回来。实际试跑时还暴露了几个很真实的问题。spark 上的 Blender 命令来自 zsh alias,非交互 bash 读不到,需要直接指定 /app/blender/bin/blender。Windows 传到远端的脚本要处理 CRLF,避免 bash 参数里混进回车。Blender 5.0.1 对 MP4/FFMPEG 输出枚举和旧脚本不兼容,Python 异常时进程退出码也可能还是 0,所以渲染脚本必须主动在异常时返回非零。

远程第 120 帧当时大概是这样提交的。命令本身很普通,背后串起了打包、上传、远端执行、日志跟踪和结果回传。

1
2
3
4
5
6
.\scripts\remote_render\Invoke-RemoteRender.ps1 `
-Server spark `
-Blend .\project\autommd\05_final.blend `
-Mode frame `
-Frame 120 `
-Output renders/05_final_frame_0120.png

远程第 120 帧成功以后,我又让 Codex 渲染前 10 帧,并加上耗时统计。日志里能看到远端 GPU probe 使用了 NVIDIA/OpenGL,后来脚本也补了 render engine、输出格式、Cycles device 和可见设备的明确记录。这个阶段让我感到 agent 适合做工程脚手架:一次手工 ssh 渲染,可以被整理成可重复使用的工具链。

远程渲染回传的第 120 帧

这张图是 spark 远程渲染后回传的第 120 帧。它对我来说是一张链路验证图:本地打包、远端 Blender、GPU、tmux 日志和结果下载都跑通了。

材质调试的难点

流程脚本主要考验 API 和工程耐心,材质调试需要视觉判断。SW999 的调试就很典型。身体材质大量叫 Body.xxx,泛用分类一开始把露肤部分也归成 cloth,导致皮肤发白。后来我用材质调试图定位,发现红色区域对应的 Body 才是主要露肤材质,于是把这一组纳入 body_skin

SW999 疑似皮肤材质调试图

这个调试图会临时把指定材质替换成纯色 Emission,再渲一张图。它能回答一个很具体的问题:画面里这块颜色到底来自哪个材质槽。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
def make_debug_material(name, color):
material = bpy.data.materials.new(name)
material.use_nodes = True
nodes = material.node_tree.nodes
links = material.node_tree.links
nodes.clear()
output = nodes.new('ShaderNodeOutputMaterial')
emission = nodes.new('ShaderNodeEmission')
emission.inputs['Color'].default_value = color
links.new(emission.outputs['Emission'], output.inputs['Surface'])
return material


for slot in obj.material_slots:
if slot.material and slot.material.name in debug_colors:
slot.material = make_debug_material(
f'Debug_{slot.material.name}',
debug_colors[slot.material.name],
)

中间还有一次误判。我以为举起的前臂变成了白色皮肤,于是继续分析 メツN.png 的 alpha,尝试用透明区域做皮肤 mask,又检查 Body.006Body.008 的贴图来源,甚至做了把 Body.006 整块当皮肤的测试。最后我意识到那块白色区域本来就是衣服,另一只手的肤色已经正常。这个插曲很有意思,因为 Codex 能沿着我的假设快速做验证,假设本身仍然需要我用画面和常识校正。

SW999 回到合理材质后的预览

Linaiya 的材质研究复杂一些。这个模型包里既有发布者提供的 PMX、贴图、normalmap 和 MME 配置,也有我从游戏里提取的 DDS、vertex buffer 文本和 index buffer 文本。我让 Codex 先研究文件格式,再尽量利用 game_extracted。Codex 解析 DDS 头,识别 DX10 BC7 格式,读取 vb0ib 文本里的 position、normal、tangent、UV、index 信息,并把 faceA 和 wingsA 重建成单独的调研 .blend

Linaiya 游戏提取网格重建预览

在 PMX 材质侧,Linaiya 的 profile 接入了发布包里的 normalmap,也把游戏提取的 face normal、material map、unknown map 和 wings diffuse 接进节点。这里我没有把游戏 diffuse 粗暴替换到所有 PMX 材质上,因为 UV、alpha 和区域含义并不一定一致。我采用了保守做法:把能确认用途的贴图弱接入,保留材质属性和节点元数据,再通过预览判断这些贴图对画面的贡献。

后面我又把镜头改成竖屏,做结尾正脸特写,并尝试让眼睛跟随相机。第一次驱动写入后眼睛方向不对,原因是计算基于世界轴,头骨转动后方向判断会偏。修正以后,驱动改成基于头骨局部轴向,并删除原眼部旋转曲线,最终能让 目.L目.R 更自然地朝向镜头。

偏黄问题的排查

Linaiya 后期还有一个典型问题:画面整体偏黄。角色设定里鞋子是黑色,裙子是银白色,头发是粉色。我一开始怀疑 lift、ramp、灯光和后处理都可能有关系。

排查以后,主因落在材质 ramp 上。lift 数值很小,场景里确实有暖主光,角色主体走 Emission,灯光主要影响 toon ramp 的明暗分区,并不会像 PBR 材质那样直接把最终颜色乘黄。我让 Codex 渲了同一帧的暖灯和全白灯,差异很小,这基本排除了灯光作为主因。

真正麻烦的是二次重刷材质时的一个 bug。reapply_character_materials.py 重新应用 profile 时,base_image() 把之前加入节点的 normalmap 误当成主贴图,导致衣服和头发在诊断图里偏蓝偏紫。修复逻辑以后,脚本会优先使用保存过的 autommd_original_base_image,并跳过 normal、lightmap、ramp、unknown 这类非颜色贴图。随后我把 Linaiya profile 调回暖粉白方向,重新渲了一版完整竖屏视频。

另一个常用 debug 脚本是直接打印材质节点。它不看最终画面,只看节点树里到底用了哪些图片、色彩空间和 shader。偏黄、偏蓝、透明错误这类问题,最后基本都要回到这里确认。

1
2
3
4
5
6
7
8
9
10
11
12
13
for mat in bpy.data.materials:
if not mat.node_tree:
continue
print('MAT', mat.name, 'blend', mat.blend_method)
for node in mat.node_tree.nodes:
if node.bl_idname == 'ShaderNodeTexImage' and node.image:
print(
' image',
node.name,
node.image.name,
node.image.filepath,
node.image.colorspace_settings.name,
)

Linaiya 暖粉白方向的材质修正预览

Linaiya 结尾正脸特写

这个问题让我对 agent 协作有了具体感受。只说画面偏黄太模糊,Codex 会检查代码和参数;给出鞋子、裙子、头发的目标颜色后,排查就能收敛到材质 ramp、贴图平均色、灯光测试和节点恢复逻辑。视觉问题需要把审美判断翻译成可检查的假设。

我对这次尝试的感受

这几天最有价值的部分,是我看到了 agent 在 Blender 自动化里的合适位置。Codex 适合读插件源码,找 operator 名称,写后台脚本,补 CLI 参数,记录中间产物,追日志,修跨平台兼容问题。GPT 的多模态能力也确实很有用,渲染图出来以后,可以直接观察画面效果,再围绕皮肤、衣服、灯光、颜色和镜头继续调试。

在风格化渲染这件事上,距离我想象的状态仍有不足。白色袖子是否为皮肤,某张 unknown DDS 的通道到底代表什么,裙子应该是冷银白还是暖粉白,这些问题很难只靠代码确认。我需要不断把观察反馈给 Codex,再把反馈变成下一次实验。它能提升实验速度,风格判断本身还需要人来把方向说清楚。

这次我还想过另一个方向:能不能让 AI 进行编舞。例如输入一段音乐,自动根据音乐风格、节奏和台词设计舞蹈,再输出 VMD 或 FBX 这样的动作序列。我简单调研以后感觉,目前还没有很成熟的产品或模型。现在常见的是生成视频或生成概念结果,直接输出可编辑的人体动作序列还比较少。

这可能和舞蹈本身的复杂性有关。舞蹈要满足人体骨骼约束,要处理动作复杂性和创新性,本身还是一个时序问题。不同语义段里可能同时存在周期性和趋势性,音乐节奏、歌词含义、镜头表现和身体动作之间也存在复杂关系。

所以五一这次尝试给我的一个判断是,很多文艺创作里的自动化可能会走两条线并行。一条线是用编码脚本把套路化、重复性的东西自动化,例如导入、绑定、材质、渲染、打包和远程执行。另一条线是用生成模型解决偏创意的问题,例如风格参考、画面判断、动作构想和局部方案。把这两者结合起来,看起来是一条现实一些的路径。

五一这次尝试最后留下的东西不少:AutoMMD 的阶段式 .blend 生成流程,材质 profile,参考节点检查,MMD 刚体烘焙,远程渲染脚本,Linaiya 的游戏提取资源研究,还有一批渲染预览和视频。重要的是,我开始把 Blender MMD 制作理解成一个可编程的工程,手工调整也可以逐步沉淀为脚本和文档。Codex 在这里的价值,是把反复试错变成可以保存、可以重跑、可以继续扩展的流程。

本文由 Codex 整理撰写,内容经我指定主题、结构和写作约束后生成。

这一阶段我在做 7days-golang 里的 Gee-Web 框架实战。相关教程是 Gee-Web 教程,代码在 7days-golang/gee-web,这次整理参考了我和 ChatGPT 的一段问答记录

学习主线

我在 4 月底集中补了一段 Go 基础,又接着进入 Gee-Web。前面的问题还偏向语法层面,比如方法、指针、切片、字符串处理和测试命令。进入框架实战后,这些零散问题开始被放进一个完整请求链里理解。

Gee-Web 这条线对我最有帮助的地方,是它把 Web 框架的几个核心部件拆得足够小。路由、分组、中间件、上下文、模板渲染和错误恢复都能单独看清楚,又能在最后合成一条请求处理流程。学完以后,我对框架的理解离开了单纯调用 API 的层面,也能顺着源码解释请求为什么会走到某个 handler,公共逻辑为什么能被中间件统一处理,模板为什么能按名字渲染出来。

中间件和请求链

中间件是这次最容易串起全局理解的部分。日志、鉴权、异常恢复、限流这类能力,如果都写进业务 handler,代码会很快变得混乱。Gee-Web 的处理方式是把这些公共逻辑放进请求链,让业务 handler 保持简洁。

我现在理解中间件时,会先看它在请求进入和离开时分别做了什么,再看 Next 什么时候推进到下一个处理函数。这样看下来,中间件承担了函数包装和生命周期管理两层职责。

1
2
3
4
5
6
7
func Logger() HandlerFunc {
return func(c *Context) {
t := time.Now()
c.Next()
log.Printf("[%d] %s in %v", c.StatusCode, c.Req.RequestURI, time.Since(t))
}
}

路由分组和嵌入

路由分组让我重新理解了 Go 里的嵌入。Engine 嵌入 *RouterGroup 后,可以直接调用 GETPOST 这些方法。这里依靠的是 Go 的方法提升机制,不能按类继承去理解。真正需要注意的是初始化。嵌入字段如果没有被正确赋值,调用方法时就可能遇到空指针问题。

路由分组后面的花括号也让我卡过。后来发现它只是普通代码块,用来把同一组路由放在一起,方便阅读。真正决定分组的是 Group 返回的对象,以及它内部保存的前缀。

1
2
3
4
5
6
7
r := gee.New()
v1 := r.Group("/v1")
{
v1.GET("/", func(c *gee.Context) {
c.HTML(http.StatusOK, "index.html", nil)
})
}

可变参数和模板渲染

... 的用法是这次整理里另一个值得单独记下的点。它在函数定义处表示可变参数,在调用处表示切片展开。读 fmt.Sprintf(format, values...) 这类代码时,只要分清它出现的位置,理解成本会低很多。

1
2
3
4
5
6
func f(args ...string) {
fmt.Println(args)
}

values := []string{"a", "b"}
f(values...)

模板渲染链路也在 Gee-Web 里变得清楚。先注册函数,再解析模板,最后按模板名执行。这里的模板名通常是文件名,也可以由模板里的 define 指定。以前我容易把模板路径和模板执行名混在一起,这次算是把两者分开了。

1
2
3
4
engine.SetFuncMap(template.FuncMap{
"FormatAsDate": FormatAsDate,
})
engine.LoadHTMLGlob("templates/*")

语法点进入工程上下文

前几天留下的语法问题,在 Gee-Web 里都有了更具体的落点。[]byte(string) 会出现在响应写入和数据转换里,HasPrefix 会出现在路由匹配里,解引用赋值会出现在指针修改里,go test 则成了验证框架行为的基础工具。

这次我也补了一些 Go 工程常识。anyinterface{} 等价,Go 1.18 以后 any 更常见。Go 没有传统函数重载,所以接口设计要更直接。runtime.Callers 可以拿到调用栈,在日志和错误定位里很有用。

阶段收获

Gee-Web 的完整实践让我建立了一个小型 Web 框架的轮廓。请求进来后,路由负责定位,分组负责组织前缀,中间件负责公共流程,上下文负责封装请求和响应,模板模块负责最终输出页面。每个模块都不复杂,组合起来就是框架的基本形态。

接下来我准备进入 learn-go-with-tests,用测试把 Go 的基础写得更稳。同时我也想从 Gee-Web 抽一个自己的最小框架模板,先保留路由、分组、中间件和模板渲染,再给每个模块补正常流程、边界流程和错误流程的测试。

我的 Aseprite 小作品合集 ✨

Cirno and Lily Slime 1

Cirno and Lily Slime 1

Aseprite · GIF

陪我聊会天吧

好的,用户想要找我聊聊天。明白了,所以就在不提出建议的情况下陪他们聊点轻松的。我可以从简单的问题开始,比如问问他们今天过得怎么样,或者最近有没有什么有趣的事。这样可以轻松开启话题,不会给出任何行动建议,只是根据用户的兴趣继续对话。希望能和用户有个愉快的聊天!

好呀!最近在忙些什么?

我关于AI,大模型,神经系统有一些不成熟的想法或者疑问,可能基于的是一些不成熟的假设

与AI和神经系统的讨论: 用户希望讨论AI、大型模型和它们与神经系统(生物类比)的关系,虽然他们提到这些想法可能基于一些不成熟的假设,所以希望能够探索并讨论。我觉得最好以一种友好、轻松的方式回应,鼓励用户分享思考。我们可以向他们表示理解,不用担心假设是否成熟,毕竟这是一次探索性的讨论。可以询问他们的想法,提供一些相关背景。如果需要,可以进一步澄清问题。

听起来很有意思!把你的想法或假设随便抛出来吧—— 无论多“异想天开”都没关系。你更想聚焦哪一类问题呢?比如:

  1. 类比层面:大模型的内部表征是否与生物神经系统的某些编码方式类似?
  2. 机制层面:梯度下降这套“反向传播 + 大量数据”能否对应到大脑的突触可塑性?
  3. 能力层面:为什么规模扩大后语言模型会自发涌现出某些推理或规划能力?
  4. 限制/瓶颈:能效、数据依赖、可解释性等差异能否从神经系统角度得到启发?

你想先聊哪一点,或者有别的方向?

我想的是,不同的人对于同一个语义,可能涉及的是不同的神经回路,这有点类似不同大模型的embedding层不同,它们对于同一个token可能在自己的高维空间中是不同的向量,而后续大模型在自注意力部分的核心参数又是基于前面这个表示层所得到的向量表示来计算的,看起来大模型和人脑一样,不同的参数就类似于人的脑回路不同。

探索大脑与模型的相似性: 用户表达了对人类大脑与大型模型之间的类比的兴趣:不同的个体可能使用不同的神经电路处理相同的语义,类似于不同的模型嵌入层表现出不同的向量表示。我觉得这很有意思,我们可以讨论大脑的可变性和模型嵌入的可变性,包括神经科学如何捕捉大脑不同区域的变化,以及嵌入参数如何异同。比如个体间神经表示的差异,可以提到fMRI研究和判别几何等。

你抓住了一个挺核心的相似点——语义对映的不唯一性

  • 人在大脑里 即使是最常见的概念(比如“狗”),被不同个体激活的神经元群也未必完全重合。fMRI 研究发现,需要对多名被试的大脑激活图做“hyper-alignment”才能把他们的表示映射到一个共同空间,否则同一语义在原始坐标里是“错位”的。
  • 在模型里 不同大模型由于随机初始化、训练数据、词表拆分方式等差异,对同一 token 得到的 embedding 也会落在不同的高维“方言”中。随后所有注意力权重、MLP 层都在各自的方言里继续计算。

类比还能往下走两步:

维度大脑大模型
表示对齐大脑研究者用 hyper-alignment、响度归一化等方法把多个人的激活映射到公共表示空间NLP 里可以做 embedding alignment(如 Procrustes、CCA)、模型融合、权重插值,将不同模型的表示拉到同一个坐标系
可塑性/迁移同一人在不同语境下神经表征可漂移(学习、记忆巩固)微调/适配层让现成模型在不大改主干的情况下对齐到新任务或新语料
“先天”差异基因和早期经历塑造初始回路:有人天生色盲、有人绝对音高随机 seed、架构宽度、tokenizer 设计决定了初始参数分布与表达能力上限

分水岭也很明显:

能效与稀疏性 大脑一秒只消耗十几瓦且大量稀疏激活,而 GPT-式模型一次前向要对亿级参数作 dense 乘法;
训练方式 大脑终身在线学习,参数持续更新;大模型训练-完-即-冻结,推理阶段几乎不再改权重;
监督信号 大脑用多模态、强化、社会反馈等复合信号,而主流预训练主要靠下一个 token 预测的自监督目标。


这些异同放在一起就能解释你注意到的现象:“同词不同向量”并不是 bug,而是系统内在的自由度。就像人们彼此大脑里的“狗”坐标不同,但大家仍能沟通,因为后续神经/注意力层学会了在自己的私有坐标系里完成推理。

你觉得这个类比里还有哪些细节值得深挖?或者有没有哪块听起来有点违和?

我想的是,阻止“人脑”本身成为大模型最丰富的语料的一个原因,在于我们现在还没有很好的技术去完整精确地获取人脑的电信号,一方面受试者可能需要提个光头才能确保没有太多干扰,另外一方面收集到的电信号我们还需要利用一些机器学习或者深度学习的方法去适配和语义化,这就导致不同的受试者的脑电波对于系统的亲和性是不一样的。这甚至让我联想到高达里面驾驶员和高达之间也需要这样的适配,只有脑回路特殊的人类能和高达之间产生联系。

这不经让我产生疑问,人的智能的未来发展方向,有没有可能受到机器算法的影响,使得我们不得不向着我们的造物的结构和语义去发展,还是说,我们必须想出一些方法,在理论上让人工智能能够对于不同的语义理解方式都能具备对应的智能?

思考未来人类与AI的关系: 用户提到人类大脑如何与AI的关系,是否未来人类会适应机器语义,或者我们让AI适应人类。这个问题很有意思,比较像科幻题材的思考,比如Gundam的驾驶员控制机制,只有少数人能适应。技术的限制,现在无法精确读取大脑信号,但随着技术发展,或许人类和AI的关系会发生变化。其实这是个开放性问题,涉及很多思维和创新。

分析人类与机器的适应关系: 用户探讨的是科技与人类大脑如何互动,以及机器是否应适应人类的语义或反过来。这个问题涉及许多方面,比如神经技术的进展、文化的影响、以及人类和机器的共同进化。我将从技术、伦理、多模态网络等不同角度分析,并提到当前神经技术的突破,如NeuronLink的进展、非侵入性大脑控制技术等。同时,我也会参考最新的研究成果,确保我的回答是更新的。

分析智能技术与认知: 智能手机的形状和设计正影响我们的认知方式,数字化的简写和算法内容的塑形也是这样。比如,Fitts’法则已成为设计的标准,而适应性用户界面不断发展。这些可以被称为“义肢化认知”,“人工智能增强认知”以及“赛博化”的例子。关键在于我们不应仅仅提出建议,而是要分析这些变化带来的影响。搜索相关网络信息可以帮助进一步分析这些趋势。

分析认知技术与适应性: 用户提到的“智能手机如何塑造认知方式”,我们可以从数字化简写、算法内容塑形和适应性界面设计等角度探讨。比如,Fitts’法则设计和“义肢认知”等概念可以用来说明技术如何影响我们思考。当前神经技术的发展,如高密度EEG和Neuralink侵入式大脑计算接口,已突破技术障碍,但仍有限。重要的是,脑机接口中的“共同适应循环”,是未来发展的一个关键领域。

探索人类与机器语义的适应性: 讨论人类如何适应机器语义时,可以考虑两种场景:一是人类适应机器语义,例如通过神经塑性训练调整认知表现;二是机器以更稳健的方式适应人类表现,通过对大量数据的无监督映射。另一中间路径是动态对接,形成共享的潜在空间

探索人类与机器语义的适应性: 讨论人类如何适应机器语义时,可以考虑两种场景:一是人类适应机器语义,例如通过神经塑性训练调整认知表现;二是机器以更稳健的方式适应人类表现,通过对大量数据的无监督映射。另一中间路径是动态对接,形成共享的潜在空间,用于推动两者的共生发展。理论上,还可能有通过元学习模型快速适应新嵌入空间的可能性,最终实现文化技术与AI架构的共同演化。

介绍与技术挑战: 首先确认观点并从技术层面进行思考: 使用人类大脑信号作为输入存在以下障碍:

  1. 非侵入性信号处理的分辨率限制:EEG与fMRI虽有应用,但新兴的高分辨率非侵入式技术如fUS、高清EEG将会解决这一问题。
  2. 个体差异:需要对脑电图数据进行对齐或超对齐,当前的研究已开始朝此方向发展。

共适应回路

  1. 侵入式脑机接口,如Neuralink,在解码器与大脑之间已经展现出双向适应。
  2. 非侵入式适应机制,采用对抗训练或元学习等方案进行解码器的优化。

分析未来的两个情境: 我在考虑两种可能的未来情境:

  1. 人类适应机器语义,这可以通过智能手机和代码切换语言来举例,涉及算法推荐的高可读性,以及类似的其他例子。
  2. 机器适应

“同词不同脑回路”背后的技术与未来走向


1. 为什么人脑暂时还不是“最大语料库”

难点当前极限最近突破
采集精度非侵入式 EEG 毫秒级时间分辨率却只有厘米级空间分辨率;fMRI 反过来新型 4D 功能超声可在 200 µm / 20 ms 下跨颅成像,已在啮齿类和成人志愿者上演示citeturn1view0
侵入成本皮层电极或深脑微电极解析度高,但需开颅植入Neuralink 等在首例患者中验证了“意念光标”控制,证明侵入式 BCI 可行但仍局限于医疗场景citeturn9search0
跨人差异不同个体激活模式错位,导致公共坐标系难建“超对齐”(hyper-alignment) 与 Hybrid-HMM 等算法把多被试的 fMRI 映射到统一潜空间,用于跨人语义比较citeturn5view0
训练语料脑电语义数据稀缺、标签昂贵2024 年发布的 Chisco 数据集一次性提供三名受试者各 900 min 高密度 EEG imagined-speech 记录,为端到端语义解码奠基citeturn2view0

结果就是:想让 AI 直接把「10 TB 的人脑电影」当语料,目前依旧受限于硬件侵入性与跨主体对齐成本,两端的“接口”都太稀疏。


2. AI ⇄ 人脑:谁来适配谁?

适配方向机制示例潜在影响
人类向机器靠拢- 使用固定的“脑机协议”(如特定想象手势)
- 沿算法友好的 token 结构进行外语学习与表达
可能逐步出现“机器语友好型思维范式”:在高维向量语义里更容易被模型检索,但也带来认知多样性收敛风险
机器向人类靠拢- 元学习 / few-shot 培训,几分钟脑信号校准即可对任意新手起效
- 通用对齐层:把每位用户的 neural embedding 动态映射到共享语义空间(类比多模型词向量对齐)
保留个体差异的同时,让 BCIs 与大模型“开箱即用”;易于公平接入,但要求模型具有快速自适应能力和鲁棒对齐算法

现实里更可能是闭环共适应

  1. 模型端以超对齐或条件扩散方式自动寻找跨人公共低维表示;
  2. 用户端通过神经可塑性训练逐步稳定自己的激活模式;
  3. 两侧在反馈循环中同步更新,形成“人-机互嵌”语义层。

3. 从“高达式适配”到“多语义 AI”——几种愿景

  1. 精英接口模式
    只有少数“高适配者”能无缝驾驭高带宽 BCI,如你联想到的高达驾驶员。这条路线接受人-人差异,以特殊人才+高性能接口的方式推进。

  2. 大众适配模式
    强调算法端的快速对齐与自监督映射:

    • 研究已在跨人 fMRI-to-video、EEG-to-text解码任务上验证零样本泛化雏形citeturn14。
    • 类似于把每个人的 embedding 看成“方言”,模型通过对齐层即时翻译。
  3. 多语义共存模式
    让 AI 支持多套并行表示:就像 GPT-类模型同时兼容中文分词和 BPE token,一套主干网络可以在不同 embedding 空间间切换,从而对接多脑型、跨物种或感官替代输入。


4. 未来的“共生语义学”挑战

议题关键难点
能效差距大脑 20 W vs. 数据中心级推理;需要稀疏激活、事件驱动式推理架构
终身可塑人脑持续学习;大模型推理时基本冻结——需发展在线微更新或外部记忆机制
伦理与隐私“脑数据”极度敏感;采集与对齐过程中如何保护个体语义专属性
多模态互译视觉、语言、运动意图的统一潜空间构造尚未定论

一句收束
无论是让人向算法靠拢还是反过来,长远看来更可行的是让两端都具备“可协商”的表示:模型学会对齐多样化的神经语义,人类则通过可塑性在交互中微调自己的激活模式。这样才能避免把智能押注在某一种“标准脑”或“标准 embedding”上,而是让多样性成为共同演化的燃料。

你提到的hyper-alignment, Chisco, fMRI-to-video, EEG-to-text,我都很感兴趣,能提供一些资料或者截图展开讲讲吗?

探索神经科技研究: 用户想了解更多关于超对齐、Chisco 数据集、fMRI 与视频、EEG 与文本的研究。为了更好地帮助,需要搜索相关资料并提供最新的引用。可能需要包括图像或图示,例如 fMRI 超对齐的插图,数据集样本,或者近几年 fMRI 到视频重建的研究图像。对话中需要的信息来源会通过多个研究和论文进行整理。

搜索并整理研究资料: 用户要求提供关于超对齐、Chisco 数据集、fMRI 到视频以及 EEG 到文本的详细信息,并可能包括截图。我计划搜索相关的研究资料,并通过图像查询提供相关图片。首先,我将搜索每个主题,包含超对齐的神经科学、Chisco 数据集、fMRI 到视频重建等。获取文本数据并整理成摘要,同时提供4张图像来进补这一主题内容。

整理研究资料并搜索图像: 接下来,我计划进行图像查询,以便收集相关的图示。需要搜索的图像包括:超对齐 fMRI 大脑对齐可视化、Chisco EEG 数据集、Mind-Video fMRI 视频重建图像以及 EEG2TEXT 解码示意图。通过这些图像,可以更清晰地呈现每个研究主题的概念,同时结合已有的文字信息,为用户提供更加全面的资料总结。

进行研究和图像搜索: 我将搜索“2023年fMRI到视频重建”和“2024年EEG到文本解码”以收集相关信息,并查找“混合HMM跨学科映射”的研究资料。获取足够的文本数据后,我会总结每个主题并引用来源。同时,还需要通过图像查询提供图示,这样就能符合用户要求的“截图”请求。通过所有这些资源,我能为用户呈现详细、全面的答案。

整理图像与细节: 我需要收集并选择4张图像用于展示:1. 超对齐大脑可视化,2. Mind-Video 视频重建样本,3. Chisco 数据集的电极图,4. EEG2TEXT 解码演示图。我将从多个来源挑选最具代表性的图像,确保它们清晰地呈现每个研究主题。同时,我还需要打开相关文献或资源,以便获得更详细的信息,整理内容后进行总结。

总结:: 我将重点介绍超对齐(Hyperalignment),首先由Haxby等人在2011年提出,用来将高维的体素空间对齐到共同的表示空间,而现在有了新的变体Hyper-HMM,可以同时对齐空间和时间。接下来,我需要说明Chisco数据集的细节,并概述fMRI视频重建和EEG2TEXT解码技术。根据用户要求,提供资料或截图,同时嵌入相关图片和引用,确保每段文字后附上引用,这样可以增强内容的准确性和深度。

iturn1image2turn1image1turn1image3turn1image7

一图速览

上面 4 张图(依次)给出:

  1. Hyper-alignment 思路示意——把每个人不同的脑空间对齐到共享的表征坐标系;
  2. Mind-Video 的 fMRI→视频重建样例(原始输入 vs. 重建帧);
  3. Chisco 想象语音数据集中使用的 128-通道 EEG 布局;
  4. EEG2TEXT 框架核心模块(多视角 Transformer + 预训练)。

1 Hyper-alignment / Hyper-HMM

  • 目标:解决「同一语义→不同人大脑激活错位」的问题,将多被试 fMRI 数据映射到一个公共低维语义空间。
  • 经典做法:对每人学习一个线性变换矩阵 (W_i),把各自的 voxel 空间旋转/缩放后再做分析(James Haxby, 2011)。
  • 最新进展:NeurIPS 2023 的 Hyper-HMM 同时对齐 空间 + 时间,在学生观看课堂视频的实验中,把所有被试与语义特征共同嵌入统一的“事件”轨迹,泛化到未见视频片段仍能保持对齐效果。citeturn2view0
  • 可参考
    • Baldassano C. 等,2018,discovering event structure in continuous narrative(event-HMM 原型);
    • Lee C.S. 等,2023,Hyper-HMM 论文与代码。

2 Chisco:超大规模想象语音 EEG 数据集

  • 规模:3 名受试者 × 6 681 trial/人 ≈ 900 min EEG/人,合计 20 000+ 句子,是迄今单人规模最大的想象语音 EEG 语料。
  • 内容:39 个语义类别、6 000+ 日常短语——从「打电话」到「点咖啡」;每条 trial 含 5 s 阅读 + 3.3 s 想象说话。
  • 价值:推进非侵入式脑语音解码(inner speech)研究,填补公开数据稀缺的空白。数据与基线模型脚本已在 Nature Scientific Data 随附发布。citeturn3view0

3 fMRI→Video 重建:Mind-Video

  • 思路
    1. Masked Brain Modeling 让模型学习 fMRI 的时空上下文;
    2. 跨模态对比学习 把 fMRI 与视觉 latent 对齐;
    3. 与 Stable Diffusion 协同训练,将时序维度“充气”进扩散网络,恢复平滑帧。
  • 结果:在 Natural Scenes Dataset 上达到 0.19 SSIM、85 % 语义分类准确率,较早期模型提升约 45 %。citeturn5view0
  • 资源:官方仓库 Mind-Video(包含预训练 checkpoints 与 Colab demo)。

4 EEG→Text:EEG2TEXT (ACL 2024)

  • 核心创新
    • 大规模 EEG 预训练(自监督掩码预测 + 时序对比)提取可迁移特征;
    • 多视角 Transformer 分别处理额叶、顶叶等脑区的子序列并做交互;
    • 开放词表解码,使用 CTC+语言模型联合得分。
  • 性能:在 ZuCo / Chisco 等数据集上 BLEU-4、ROUGE-1 提升 5 pp 左右;首次在非侵入式 EEG 上展示可行的开放词汇解码。citeturn6view0
  • 建议阅读:论文附带 ablation 与代码链接,可直接复现实验。

延伸阅读 & 资源索引

主题关键论文/数据链接线索
Hyper-alignment综述Haxby J.V. et al., Trends Cogn Sci 2016“Lining Up Brains via Representational Space”
Hyper-HMM实现Lee C.S. et al., NeurIPS 2023arXiv/NeurIPS
Chisco 数据集Zhang Z. et al., Sci Data 2024DOI 10.1038/s41597-024-04114-1
fMRI-视频重建Chen Z. et al., Mind-Video, NeurIPS 2023GitHub mind-video
EEG2TEXTLiu H. et al., ACL 2024arXiv 2405.02165

如需进一步的代码示例或具体数据下载方法,再告诉我!

Chisco有什么比较关键的发现?为什么只采集了3位受试者?3个受试者之间的想象语音之间有什么不同吗?

搜索关键发现: 用户询问关于Chisco的数据集。我需要提供关键发现、为何只选择了3位受试者及他们之间的差异。为了确保信息的准确性,我需要查看相关的最新信息,特别是2024年出版在《自然科学数据》上的数据集。我将搜索确认这些细节,并仔细整理出答案,以便给出准确的回应。

更新数据集细节: 用户提问的Chisco数据集包含3位受试者,这可能是因为高密度EEG记录需要大量时间,每位受试者记录了15小时。采集如此多的受试者数据是很具挑战性的,因此他们选择了以每位受试者为中心的数据,以获得更多的实验数据。这也解释了为什么之前的数据集有更多受试者,但每位只进行了少量实验。此外,解码神经语音需要更多的每个受试者的数据。

分析Chisco论文关键发现: Chisco论文提供了有关想象语音EEG的最大公开数据集,包含20,000个试验,每位受试者超过900分钟。它支持开放词汇分类和回归任务。基准结果显示短语级别的分类准确性较高,但跨受试者的泛化能力有限。同时发现,不同受试者在时空模式上存在差异,需要进行个体化的校准,尤其在伽马和贝塔波段的差异。接下来需要查阅更多

分析Chisco数据集关键发现: Chisco论文指出,它提供了目前最大的公开可用的想象语音EEG数据集,包括20,000次实验,每位受试者超900分钟的数据。它支持开放词汇分类和回归任务,并且基准结果显示短语级别的分类精度很高,但跨受试者的泛化能力有限。研究发现,不同受试者之间在时空模式上有所不同,需要针对每人进行特定的校准,并提到可能存在伽马和贝塔频段的差异。

查看Chisco论文的关键发现: Chisco论文提供了一个非常大的想象语音EEG数据集,共有2万次实验,每位受试者的实验时间超过900分钟。数据集支持开放词汇分类和回归任务,基准结果显示短语级别的分类精度较高,但跨受试者的泛化能力有限。此外,研究发现受试者之间的时空模式存在差异,因此需要针对每位受试者进行个性化校准,并可能涉及伽马和贝塔波段的差异。

分析Chisco论文的关键发现: Chisco数据集发现,三位受试者的大脑活动模式表现出显著的一致性,并且分类性能的基准结果也揭示了数据集包含语义信息。研究表明,基于个体特征的解码器表现明显高于随机水平,尽管受试者之间存在差异,但也有一些一致性。此外,发现伽马和贝塔波段的差异,以及阅读与想象间的区别。为了进一步验证,需要更多的受试者数据。

回答关于Chisco的关键发现: 用户想了解Chisco数据集的关键发现、为何只采集了三位受试者以及受试者之间的差异。根据方法部分,为了确保每位受试者的解码器能够得到充分训练,研究团队需要每位受试者进行较长时间的数据采集。这种方法更注重

回答Chisco研究的关键发现: Chisco数据集中包含的关键发现包括:数据集为单个受试者提供了大规模的想象语音EE

回答Chisco研究的关键发现: Chisco数据集中包含的关键发现包括:数据集为单个受试者提供了大规模的想象语音EEG数据,分类准确性较高,且每个受试者都有较高的基准。数据表明,三位受试者间的语音差异较大,但存在一致性。数据库的限制是为了确保每位受试者的数据都能经过充分训练和优化。跨受试者的相关性较低,但与预期相符,且发现了阅读与想象间的差异。

关于选择3名受试者的原因及差异: - 每个受试者的录音时间超过900分钟,保证了每个个体数据是公开数据中最大之一。

  • 仅选择3名受试者是因为数据采集负担较重,每位受试者需进行6681次试验,且筛选标准严格。
  • 受试者之间存在一些差异:时序上的差异(S3较慢),语法生成上的差异,ISC值呈现微小差异,尽管每个受试者的分类准确率均高于随机水平,约为0.42。

关于实验发现和受试者选择原因: - 该研究中每位受试者的数据收集达到900多分钟,确保了个体数据的深度。

  • 仅选择了3名受试者,由于数据采集负担很重,每位受试者需要经过多次实验,且该选择有意平衡了样本规模与实验深度。
  • 受试者之间存在时序差异,如S

Chisco 数据集的几项关键发现

关注点实验结论证据/解释
规模与颗粒度每名受试者录制 ≈ 900 min(共 6 681 trial),想象语音部分 > 360 min——目前已公开的单人最大 imagined-speech EEG 语料citeturn1view0turn4view0
语义可解码性采用 EEGNet + Transformer 对 39 个语义类别进行分类,三名受试者的 Accuracy/F1 均显著高于随机基线(1/39 ≈ 2.6 %)citeturn6view0
跨人一致性与差异- 头皮拓扑图显示三人整体激活顺序一致:视觉皮层→左颞/顶→额叶/顶叶 
- 语义表征的跨人相关系数 r ≈ 0.13–0.17,落在此前 EEG 研究常见 0.1–0.25 区间
citeturn4view0turn6view0
个体时序差异句法/语义生成窗口:S1、S2 在 0.4 s 开始,S3 延后至 0.6 s;说明即便流程类似,处理速度仍存在个体差citeturn6view0
任务难度对比与阅读任务数据集 ZuCo 相比,想象语音的 Cohen’s Kappa 更低,验证了“内生语音”解码更具挑战citeturn6view0

为什么只录了 3 位受试者?

  1. 深度优先的设计

    • 目标是训练单人可用的语义解码器,需要大规模个人数据来稳住噪声并覆盖日常语境;
    • 若保持相同总工时,扩展被试数量势必压缩单人录制时长,得不到足够 trial。citeturn4view0
  2. 质量筛选机制

    • 先招募 11 名志愿者,完成 5 天 IBMT 冥想训练与 ANT 注意力测试;取注意力指标最优的 3 人进入正式采集,以减少疲劳与分心带来的伪差。citeturn4view0
  3. 实验负荷与伦理

    • 高密度 EEG(128 通道)连续录制 15 h 以上,对受试者和实验人员都是体能/时间双重压力;
    • 大样本版后续计划已在论文“Limitations & future work”中提出,但需额外经费和伦理审批。citeturn6view0

三名受试者之间有哪些可观测差异?

维度S1S2S3
性别/年龄女 26 岁男 30 岁男 22 岁
句法生成起点≈ 0.4 s≈ 0.4 s≈ 0.6 s(更晚)
跨人相关 ®0.126 (对 S1)0.168 (对 S1)
拓扑激活三人均呈“左颞/语义 → 额顶/执行 → 右半球情境”序列,局部幅值略有个体差同左同左

论文作者指出,这些差异主要体现为时序与幅值微调,总体处理管线仍是高度共享的“视觉 → 语义 → 语音运动抑制”流程。citeturn6view0


如需进一步细读,可直接查看 Scientific Data 原文及其 GitHub 仓库中附带的预处理脚本、基线模型和可视化代码。

今天先聊到这吧,你能帮我们这次对话取一个标题吗

“大模型×人脑:多语义表征、Hyper-alignment 与脑机解码”

内容提示

以下内容均为IDE(Augment Code/Copilot)瞎生成的,请勿当真

我想要一个hexo的插件,它能够支持将ChatGPT的对话记录插入到我的博客文章中。

我想实现以下功能:

  1. 能够从ChatGPT的共享链接中提取对话记录。
  2. 将对话记录转换为Markdown格式,并在hexo文章中使用自定义标签来渲染。
  3. 提供默认的CSS样式,同时允许用户自定义样式。
  4. 支持在hexo文章中显示对话记录。
  5. 支持自定义对话记录的样式。
  6. 支持自定义对话记录的位置。
  7. 支持自定义对话记录的大小。

好的,我明白了你的需求。你想要一个hexo插件,可以将ChatGPT的对话记录插入到你的博客文章中。这个插件应该支持以下功能:

  1. 从ChatGPT导出对话记录为Markdown格式。
  2. 在hexo文章中使用自定义标签来渲染对话记录。
  3. 提供默认的CSS样式,同时允许用户自定义样式。
  4. 支持在hexo文章中显示对话记录。
  5. 支持自定义对话记录的样式。
  6. 支持自定义对话记录的位置。
  7. 支持自定义对话记录的大小。

你希望这个插件能够实现这些功能吗?

是的,我希望它能够实现这些功能。

确认需求: 用户希望开发一个 hexo 插件,用于将 ChatGPT 的对话记录插入到博客文章中。插件需要支持从共享链接提取对话、转换为 Markdown、使用自定义标签渲染、提供默认样式并允许用户自定义样式、在文章中显示对话记录、自定义对话样式、位置和大小。

// 在hexo插件中,使用axios获取共享链接的内容
import axios from ‘axios’;

async function fetchConversation(url) {
try {
const response = await axios.get(url);
return response.data;
} catch (error) {
console.error(‘Error fetching conversation:’, error);
}
}

Hello

This is the default note.

0%