ASR数据标注入门指南:从零开始构建高质量语音数据集

1次阅读
没有评论

共计 1977 个字符,预计需要花费 5 分钟才能阅读完成。

image.webp

1. 为什么 ASR 数据标注这么难?

刚接触语音识别数据标注时,最常遇到这些头疼问题:

ASR 数据标注入门指南:从零开始构建高质量语音数据集

  • 方言和口音 :同一个 ” 西红柿 ”,北方人可能念成 ”xihongshi”,南方人会说 ”fanqie”
  • 背景噪声 :到底该标注空调嗡嗡声,还是忽略它?不同项目要求可能完全相反
  • 多人对话 :三个人同时说话时,该标成重叠对话还是分段处理?

有次我们标注客服录音,发现 30% 的无效数据都是因为没统一标注规则——有人标了咳嗽声,有人却跳过。

2. 工具选型:Label Studio 还是 Prodigy?

试过市面上所有主流工具后,我的对比结论:

工具 优点 缺点 适用场景
Label Studio 开源免费,支持音频波形可视化 大文件加载慢 小团队敏捷标注
Prodigy 主动学习推荐标注,效率提升 40% 商业授权贵($490/ 用户 / 年) 专业标注团队

如果是学生党,强烈推荐用 Label Studio+ 自定义模板:

# 音频标注模板示例(XML 格式)<View>
  <Labels name="speaker" toName="audio">
    <Label value="客服" />
    <Label value="客户" />
  </View>
  <Audio name="audio" value="$audio" />
</View>

3. 必须掌握的标注规范

3.1 语音分段原则

遇到 5 秒以上的静默时:

  1. 用 WebRTC 的 VAD 算法自动检测(Python 实现):
import webrtcvad

def vad_segment(audio, sample_rate=16000):
    vad = webrtcvad.Vad(2)  # 中等灵敏度
    frame_duration = 30  # 毫秒
    frames = []
    for i in range(0, len(audio), int(sample_rate * frame_duration / 1000)):
        frame = audio[i:i+frame_size]
        if vad.is_speech(frame, sample_rate):
            frames.append(1)
        else:
            frames.append(0)
    return merge_continuous_segments(frames)  # 合并连续语音段 

3.2 文本标准化

统一处理以下情况:

  • 数字:”123″ → “ 一百二十三 ”
  • 英文:”CPU” → “C P U”(字母分开读)
  • 符号:”20%” → “ 百分之二十 ”

用这个正则表达式校验格式:

import re

def validate_transcript(text):
    # 禁止出现非中文 / 英文 / 数字的字符
    pattern = r'^[\u4e00-\u9fa5a-zA-Z0-9\s]+$' 
    if not re.match(pattern, text):
        raise ValueError(f"非法字符: {text}")

4. 新手避坑指南

4.1 采样率陷阱

遇到过最隐蔽的 bug:标注工具用 44.1kHz 播放音频,但模型训练用 16kHz,导致时间轴全部错位。解决方案:

from pydub import AudioSegment

def convert_sample_rate(input_path, output_path, target_rate=16000):
    audio = AudioSegment.from_file(input_path)
    audio = audio.set_frame_rate(target_rate)
    audio.export(output_path, format="wav")

4.2 标注一致性控制

计算 Kappa 系数来判断标注员是否达成共识:

from sklearn.metrics import cohen_kappa_score

# 两个标注员的标注结果
annotator1 = [1, 0, 1, 1, 0]
annotator2 = [1, 1, 1, 0, 0]

kappa = cohen_kappa_score(annotator1, annotator2)
print(f"Kappa 系数: {kappa:.2f}")  # >0.8 表示高度一致 

5. 效率优化技巧

5.1 音频格式选择

对比测试结果(相同 1 小时音频):

格式 文件大小 加载速度 标注工具兼容性
WAV 650MB 最好
FLAC 320MB 中等
MP3 60MB 最快 可能有失真

建议:原始存档用 FLAC,标注时转 WAV

5.2 版本控制策略

Git 不适合管理音频文件,我们的解决方案:

  1. 用 DVC 管理大文件
  2. 标注结果存为 CSV+ 时间戳
  3. 每次更新打标签:
dvc add dataset/raw_audio/
git commit -m "v1.2 标注更新"
git tag -a v1.2 -m "完成 200 小时客服数据"

6. 开放问题

当老板只给 5000 元标注预算时:

  • 该标注 1000 小时普通质量数据?
  • 还是 200 小时专家级标注?

我的选择是:先用 200 小时高质量数据训练基础模型,然后用这个模型预标注剩余 800 小时数据,人工只做校验——这样质量与数量兼得。你怎么看?

正文完
 0
评论(没有评论)