一.数据集简介
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}
↓
动态批次化
↓
模型输入