示例成品 · 平台演示,按左边这组点选真跑出来的
别慌。你现在不是“标注难”,是流程糊在一起。3-5人、1万-10万条,关键是把流程拆开,别让一个人一边听写、一边猜情绪。
## 先说结论
**转写和情感/意图必须拆成两个项目/两个阶段。**
转写靠“听清字”,情感/意图靠“听语气+理解内容”,混在一起一定乱。
---
## 1. 先拆流程
### 项目 A:转写清洗
只干一件事:音频 → 逐字文本。
不要碰情绪标签。
### 项目 B:情感/意图标注
用项目 A 已经审核过的转写 + 音频。
只标情绪和意图,转写只读,不允许顺手改。
> 如果下游是 ASR,**转写质量是你的命根子**,情绪标签可以相对粗。
> 情绪标签如果只是辅助,不要投入过多人力死磕。
---
## 2. 转写错得离谱怎么办
### 不要从零写
用 Whisper / faster-whisper / WhisperX 先跑一遍 ASR,拿结果当预标注,导入 Label Studio 让人改。
这比人从空白开始写快很多。
### 长音频先切段
一段 5–15 秒最合适。
超过 10 秒,情绪容易混合,转写也容易漏。
多人对话音频先做 speaker diarization,否则转写和情绪都没法做。
### 转写规则必须定死
例如:
- 逐字写,保留“嗯、啊、呃、哦”等语气词。
- 听不清写 `[unclear]`。
- 多人重叠写 `[overlap]`。
- 明显噪声写 `[noise]`。
- 数字、英文、标点规则先定:
比如英文品牌到底写“iPhone 15”还是“爱疯十五”。
### 转写质检
抽 15%–20% 双人重听,算 CER / WER。
目标:**WER / CER 低于 5%**,否则别进入情绪标注。
---
## 3. 情感/意图标签对不上怎么办
### 标签先砍粗
不要一上来搞十几个情绪。
小团队建议控制在 6–7 类以内。
**情感建议:**
- 平静 / 中性
- 开心 / 满意
- 生气 / 不满
- 悲伤 / 失望
- 恐惧 / 焦虑
- 惊讶 / 疑惑
- 其他 / 无法判断
**意图建议:**
- 告知 / 回答
- 询问 / 请求
- 指令 / 要求
- 投诉 / 抱怨
- 寒暄 / 社交
- 其他
### 定两条核心规则
**情感:以声音语气为主,文字内容为辅。**
如果语气和文字冲突,标“其他/无法判断”,并备注。
**意图:以文字内容为主。**
看说话人到底想干什么,不要被语气带偏。
### 必须加“其他/无法判断”
不要逼人硬选。
硬选的后果就是标签对不上。
### 混合情绪
只选主导情绪。
例如一个人又生气又失望,选“生气”,备注写:`混合:生气+失望`。
---
## 4. 交叉一致性检查怎么做
### 先试标
找 100–200 条,让 3–5 个人全部标同一批。
导出后算一致性。
情感/意图用 Cohen's kappa:
```python
from sklearn.metrics import cohen_kappa_score
print(cohen_kappa_score(标注员A, 标注员B))
```
转写用 WER / CER:
```python
import jiwer
print(jiwer.wer(参考转写, 转写结果))
```
### 达标线
- 情感/意图:kappa < 0.6,先别铺量,开会改规则。
- 转写:WER/CER < 5%。
### 正式阶段
- 10%–20% 双盲复审。
- 每周随机抽 100 条复查。
- 做一个 200 条金标集,混在日常任务里,防止标注员漂移。
---
## 5. Label Studio 配置建议
项目 B 可以这样配:
```xml
<View>
<Audio name="audio" value="$audio" zoom="true" speed="true"/>
<Header value="参考转写"/>
<Text name="transcript" value="$transcript"/>
<Header value="情感"/>
<Choices name="emotion" toName="audio" choice="single" showInLine="true">
<Choice value="neutral" display="平静"/>
<Choice value="happy" display="开心"/>
<Choice value="angry" display="生气"/>
<Choice value="sad" display="悲伤"/>
<Choice value="fear" display="恐惧/焦虑"/>
<Choice value="surprise" display="惊讶/疑惑"/>
<Choice value="other" display="其他/无法判断"/>
</Choices>
<Header value="意图"/>
<Choices name="intent" toName="audio" choice="single" showInLine="true">
<Choice value="inform" display="告知/回答"/>
<Choice value="question" display="询问/请求"/>
<Choice value="command" display="指令/要求"/>
<Choice value="complaint" display="投诉/抱怨"/>
<Choice value="chitchat" display="寒暄/社交"/>
<Choice value="other" display="其他"/>
</Choices>
<Header value="置信度"/>
<Rating name="confidence" toName="audio" maxRating="3" defaultValue="2"/>
</View>
```
项目 A 更简单,只留:
```xml
<View>
<Audio name="audio" value="$audio" zoom="true" speed="true"/>
<TextArea name="transcript" toName="audio" rows="4" placeholder="逐字转写,听不清写[unclear]"/>
</View>
```
---
## 6. 人力怎么排
3–5 人建议:
- 1 人负责切音频、跑预标注、维护金标集。
- 2–3 人专职标注。
- 1 人轮换抽检、仲裁争议样本。
短音频每人每天标 100–200 条比较合理。
不要按数量考核,按抽检质量考核。
**工作量参考:**
- 1 万条:小团队 2–4 周可以搞定。
- 10 万条:纯人工不现实,必须靠预标注 + 抽检,先保核心 1 万条高质量。
---
## 7. 最终交付格式
建议导出一行一条:
```text
audio_id, audio_path, duration, transcript, emotion, intent, annotator, confidence, split
```
如果下游是 ASR,重点保证:
- `audio_path`
- `transcript`
- `split`
`split` 建议按说话人或场景切分,不要完全随机切,容易数据泄漏。
---
最后一句:
**你现在已经有 Label Studio、有团队、有数据,缺的不是工具,是一套固定规则。先把规则和试标跑通,再铺量。**
点左边「开工 · 直接出成品」,出一份你自己的版本(文字免费)