语音识别领域,WenetSpeech数据集详解

一.数据集简介

WenetSpeech是一个超大规模中文语音识别数据集,由出门问问(Mobvoi)发布。

wenent关键数据

  • 总时长:10,000+小时

  • 来源:YouTube视频、播客、有声书等

  • 质量分级:L(高质量)、M(中等质量)、S(低质量)

  • 包含:普通话、带口音普通话

二.数据集结构

复制代码
WenetSpeech/
├── metadata/
│   ├── metadata.list             # 主元数据文件
│   └── subset/
│       ├── train_L.list          # 高质量训练集
│       ├── train_M.list          # 中等质量训练集
│       ├── train_S.list          # 低质量训练集
│       └── dev.list              # 验证集
├── audio/
│   ├── 0001.tar.gz
│   ├── 0002.tar.gz
│   └── ...
└── README.md

三、原始数据格式详解

3.1 元数据文件格式

metadata.list示例

复制代码
{
  "audios": [
    {
      "aid": "Y0000000000_S00000",
      "duration": 367.36,
      "url": "https://www.youtube.com/watch?v=XXXXX",
      "segments": [
        {
          "sid": "Y0000000000_S00000-seg0000",
          "begin_time": 0.0,
          "end_time": 4.32,
          "text": "欢迎 大家 观看 本期 视频",
          "confidence": 1.0
        },
        {
          "sid": "Y0000000000_S00000-seg0001",
          "begin_time": 4.48,
          "end_time": 8.96,
          "text": "今天 我们 来 聊 一 聊 人工智能",
          "confidence": 0.95
        }
      ],
      "source": "youtube",
      "category": "technology"
    },
    // 更多音频...
  ]
}

字段解释:
aid: 音频唯一ID
duration: 音频总时长(秒)
segments: 有效片段列表
sid: 片段ID
begin_time/end_time: 片段起止时间
text: 转录文本(已分词)
confidence: 置信度分数(0-1)

3.2 音频文件结构

音频以压缩包形式存储

复制代码
audio/
├── 0001.tar.gz
│   ├── Y0000000000_S00000.wav
│   ├── Y0000000001_S00000.wav
│   └── ...
├── 0002.tar.gz
└── ...

3.3 预处理步骤概览

复制代码
原始元数据 → 筛选 → 格式化 → 分集 → 特征提取 → 训练清单

四、数据筛选与格式化

4.1 质量筛选

复制代码
def filter_segments(metadata, min_confidence=0.8, min_duration=0.5, max_duration=20.0):
    """筛选高质量的语音片段"""
    filtered = []
    
    for audio in metadata['audios']:
        for seg in audio['segments']:
            # 筛选条件
            if (seg['confidence'] >= min_confidence and
                min_duration <= (seg['end_time'] - seg['begin_time']) <= max_duration and
                len(seg['text'].strip()) > 0):
                
                # 构建训练样本
                sample = {
                    'key': seg['sid'],
                    'audio_path': f"{audio['aid']}.wav",
                    'begin_time': seg['begin_time'],
                    'end_time': seg['end_time'],
                    'duration': seg['end_time'] - seg['begin_time'],
                    'text': seg['text'],
                    'confidence': seg['confidence']
                }
                filtered.append(sample)




按质量分级
WenetSpeech将数据分为三个等级:
L级(高质量):
置信度 >= 0.95
人工校对
用于最终模型训练
M级(中等质量):
置信度 0.8-0.95
可用于预训练
S级(低质量):
置信度 < 0.8
通常用于自监督学习

五、WeNet训练数据格式转换

5.1 生成训练清单文件

预处理完成后,生成标准的data.list

复制代码
{
  "key": "Y0000000000_S00000-seg0000",
  "wav": "/data/WenetSpeech/audio/Y0000000000_S00000.wav",
  "txt": "欢迎 大家 观看 本期 视频",
  "duration": 4.32,
  "seg_begin": 0.0,
  "seg_end": 4.32,
  "spk": "Y0000000000"
}
{
  "key": "Y0000000000_S00000-seg0001",
  "wav": "/data/WenetSpeech/audio/Y0000000000_S00000.wav",
  "txt": "今天 我们 来 聊 一 聊 人工智能",
  "duration": 4.48,
  "seg_begin": 4.48,
  "seg_end": 8.96,
  "spk": "Y0000000000"
}

5.2 词汇表生成

从全部文本生成词汇表:

复制代码
# 统计所有字符
python tools/text2token.py -s 1 -n 1 data/train/text > data/train/tokens
python tools/token2vocab.py --vocab_size 5000 data/train/tokens > data/dict/words.txt

六、特征提取详细过程

6.1 针对长音频的优化

WenetSpeech包含很多长音频片段,需要特殊处理:

复制代码
def extract_fbank_for_long_audio(audio, sample_rate=16000, max_length=20.0):
    """
    为长音频提取特征,并进行截断处理
    """
    # 计算最大采样点数
    max_samples = int(max_length * sample_rate)
    
    # 如果音频过长,随机截取
    if len(audio) > max_samples:
        # 随机开始位置
        start = random.randint(0, len(audio) - max_samples)
        audio = audio[start:start + max_samples]
    
    # 标准FBank提取
    fbank = compute_fbank(
        audio,
        num_mel_bins=80,
        sample_rate=sample_rate,
        frame_length=25,
        frame_shift=10
    )
    
    return fbank

6.2 语音活动检测(VAD)集成

WenetSpeech已标注有效片段,但训练时可进一步优化:

复制代码
def refine_with_vad(features, vad_result):
    """
    使用VAD结果进一步精炼特征
    """
    # vad_result: [T] 布尔数组,表示每帧是否有语音
    
    # 只保留有语音的帧
    speech_frames = features[vad_result]
    
    # 如果太短,填充或丢弃
    if len(speech_frames) < 10:  # 少于100ms
        return None  # 丢弃样本
    
    return speech_frames

七、标签处理

7.1 文本规范化

WenetSpeech文本已分词,但需要进一步处理:

复制代码
def normalize_wenetspeech_text(text):
    """标准化WenetSpeech文本"""
    import re
    
    # 1. 全角转半角
    text = full2half(text)
    
    # 2. 标准化数字
    text = normalize_numbers(text)
    
    # 3. 移除特殊符号但保留中文标点
    # 保留:,。!?;:""
    text = re.sub(r'[^\u4e00-\u9fa5a-zA-Z0-9\s,。!?;:"\']', '', text)
    
    # 4. 统一空格(分词已用空格)
    text = re.sub(r'\s+', ' ', text).strip()
    
    return text

7.2 子词单元(BPE)生成

对于大规模数据,通常使用BPE:

复制代码
# 从训练文本学习BPE
python tools/spm_train.py \
    --input=data/train/text \
    --vocab_size=5000 \
    --model_type=bpe \
    --model_prefix=bpe_model

# 应用BPE
python tools/spm_encode.py \
    --model=bpe.model \
    --input_format=text \
    --input=data/train/text \
    --output=data/train/text.bpe

BPE词汇表示例

复制代码
<blank> 0
<unk> 1
<eos> 2
▁ 3
的 4
是 5
了 6
在 7
和 8
有 9
这 10
▁人 11
▁工 12
▁智 13
▁能 14
人工 15
智能 16
人工智 17
人工智能 18
...

八.完整数据处理流程图

复制代码
原始WenetSpeech
     ↓
解压音频文件
     ↓
读取元数据JSON
     ↓
质量筛选(按confidence)
     ↓
片段提取与对齐
     ↓
音频格式统一(16kHz, mono)
     ↓
特征提取(FBank)
     ↓
数据增强(SpecAugment + 音量归一化)
     ↓
文本规范化与分词
     ↓
构建训练样本{key, feat, label}
     ↓
动态批次化
     ↓
模型输入
相关推荐
珠海西格电力2 小时前
零碳园区有哪些政策支持?
大数据·数据库·人工智能·物联网·能源
启途AI2 小时前
2026免费好用的AIPPT工具榜:智能演示文稿制作新纪元
人工智能·powerpoint·ppt
TH_12 小时前
35、AI自动化技术与职业变革探讨
运维·人工智能·自动化
楚来客2 小时前
AI基础概念之八:Transformer算法通俗解析
人工智能·算法·transformer
风送雨2 小时前
FastMCP 2.0 服务端开发教学文档(下)
服务器·前端·网络·人工智能·python·ai
效率客栈老秦3 小时前
Python Trae提示词开发实战(8):数据采集与清洗一体化方案让效率提升10倍
人工智能·python·ai·提示词·trae
小和尚同志3 小时前
虽然 V0 很强大,但是ScreenshotToCode 依旧有市场
人工智能·aigc
HyperAI超神经3 小时前
【vLLM 学习】Rlhf
人工智能·深度学习·学习·机器学习·vllm
芯盾时代3 小时前
石油化工行业网络风险解决方案
网络·人工智能·信息安全
线束线缆组件品替网3 小时前
Weidmüller 工业以太网线缆技术与兼容策略解析
网络·人工智能·电脑·硬件工程·材料工程