录的时候你知道的是物件、手法、力度、位置;你还不知道这声音要用在哪——那是听完才决定的,而且可以一对多。
采集侧(录的时候就知道,进文件名)
source 耳机塑料壳 / 带垫子的木桌面 / 大菜板
technique 指甲敲 / 握拳敲 / 软槌
axis force 档位、落点半径、幅度……
variant 同一坐标的第 N 次
用途侧(听完再配,可一对多,不进文件名)
used_as [piece_place, block_impact, ...]
按用途命名(piece_place__...)看着直观,但它把"这批素材是为某个音效录的"焊死了,复用只能靠碰巧。按采集命名,素材库就是一个声音资源库——一个 source 天然服务多个音效。
<source>__<technique>__<轴键_轴值>...__<轴字母+档号>__<variant>.wav
例:
desk_padded__fingernail__r_center__f1__01.wav
│ │ │ └ 档内第 1 次(每档从 01 重新数)
│ │ └ 力度档 1
│ └ 落点 = 中心
└ 手法 = 指甲
两种轴写法都支持:
键_值—— 离散值,如r_center/r_edge/pos_mid字母+数字—— 有序档位,如f1f2f3(marker 分出来的档直接用这个)
variant 是档内编号,不是整组连续——每档从 01 重新数。这样池子按档取变体时不用再算偏移。
atom-split --map 吃的属性表,一次录音一份。属性来自你的口报(转写后人读一遍写下来,ASR 错字不影响,因为是人在理解不是字符串匹配)。
{
"source": "desk_padded",
"technique": "fingernail",
"tierAxis": "f",
"note": "带垫子的木桌面,指甲敲击;木质回响、沉闷。每组轻/中/重各三下",
"groups": [
{ "axis": { "r": "center" } },
{ "axis": { "r": "mid" } },
{ "axis": { "r": "edge" } }
]
}groups按顺序对应切分出来的口报段(说话换气被切碎的会自动合并,一段口报 = 一组)tierAxis是 marker 分出来的档位用哪个字母note存你的口报大意,将来用自然语言搜素材比结构化标签好使
组数对不上时工具拒绝写文件。
切分时顺带算的,进 split-report.json:
| 字段 | 怎么来 | 用途 |
|---|---|---|
attackMs |
onset → 峰值 | 分类 take/语音;也是"闷不闷"的指标 |
durMs |
超阈值区间长度 | 衰减长度 |
peakDb |
5ms 窗 RMS 的峰值 | 力度轴的实际验证 |
peakDb是 RMS 包络峰值,不是采样峰值——瞬态的采样峰会比它高 5dB 左右(crest factor)。要看采样峰用ffmpeg -af volumedetect,别用astats的Max level(那个字段口径不一样,会读出矛盾的数)。
atom-mix --mode layered 把两族拼成一个声音,靠频段分工避免糊:
| role | 主频段 | 几层 |
|---|---|---|
transient |
高 | 主导仅 1 |
material |
中 | 主导仅 1 |
body |
低 | 主导仅 1 |
ambience |
全 | 可多层 |
规则是同 role 只准一层占主导,第二层起自动衰减。不做这条,多层叠起来会出现"每层单听都对、合起来不带劲"那种最难 debug 的糊。