- 人工智能
- 语音
- 音频
- NLP
- 媒体生成
【免费下载链接】PaddleSpeech
Easy-to-use Speech Toolkit including Self-Supervised Learning model, SOTA/Streaming ASR with punctuation, Streaming TTS with text frontend, Speaker Verification System, End-to-End Speech Translation and Keyword Spotting. Won NAACL2022 Best Demo Award.
导读
本文以 PaddleSpeech 仓库中 examples/librispeech/asr4 为例,系统讲解如何用 Hugging Face 风格的预训练 HuBERT 大模型(hubert-large-lv60)在 LibriSpeechtrain-clean-100子集上微调出一个端到端 CTC 语音识别模型(hubertASR),并复现官方公布的 WER 0.05868 结果。读完本文,你将掌握:数据准备与 manifest 生成的完整流水线、hubertASR 配置文件中每个关键参数的底层含义、多阶段run.sh训练/平均/测试/单音频推理的用法,以及将预训练 HuBERT 与轻量分类头组合的源码级实现原理。
说明:本文所有命令与配置均以当前仓库实际内容为准,适合在已安装 PaddleSpeech 依赖(PaddlePaddle、paddlenlp 等)的环境中复现。
一、ASR4 示例的整体定位
1.1 什么是 hubertASR
LibriSpeech 的 asr4 示例是 PaddleSpeech 中基于自监督预训练 HuBERT 模型微调语音识别的参考实现。其核心思路是:
- 使用在大规模未标注数据 LV-60k 上预训练的 HuBERT 编码器(
hubert-large-lv60)作为语音特征提取主干; - 在其之上堆叠一个轻量 DNN 分类头(
VanillaNN)与 CTC 解码层,形成完整的端到端识别模型; - 只在 LibriSpeech
train-clean-100(约 100 小时)上微调,即可在test-clean上取得 WER 0.05868 的成绩。
从 hubert_ASR.py 的源码可以看到模型的组装方式:
class HubertASR(nn.Layer): def __init__(self, config: dict): super().__init__() init_type = config.get("init_type", None) with DefaultInitializerContext(init_type): self.config = config task_cfg = self.merge_with_parent(HubertPretrainingConfig, dict(self.config.task_cfg)) model_cfg = self.merge_with_parent(HubertConfig, dict(self.config.model_cfg)) hubert = HubertModel(model_cfg, task_cfg, [None]) self.normalize_wav = config.normalize_wav self.output_norm = config.output_norm ... self.hubert = hubert self.enc = VanillaNN(**config.enc) self.ctc = CTC(**config.ctc, odim=config.output_dim, batch_average=False, reduction='mean')模型 = HuBERT 特征提取器(self.hubert)→ 可选 LayerNorm → 可选的 SpecAugment → DNN 分类头(self.enc)→ CTC 层(self.ctc),并支持通过freeze_hubert冻结预训练主干。
1.2 仓库中的目录结构
examples/librispeech/asr4的核心文件组织如下:
- run.sh:入口脚本,通过
stage/stop_stage控制 0~4 五个阶段; - local/data.sh:数据下载、CMVN 计算、词表构建、manifest 格式化与预训练模型下载;
- local/train.sh:模型训练;
- local/test.sh:在测试集上评估(greedy search 与 ctc_prefix_beam_search);
- local/test_wav.sh:单条音频推理;
- conf/hubertASR.yaml:hubertASR 完整配置;
- conf/tuning/decode.yaml:解码配置;
- conf/preprocess.yaml:预处理配置(使用原始波形
wav_process); - RESULTS.md:官方复现结果。
此外,模型的核心实现位于paddlespeech/s2t/models/hubert/(hubert_ASR.py与modules/hubert_model.py),训练/测试入口位于 paddlespeech/s2t/exps/hubert/bin/(train.py、test.py、test_wav.py)。
二、环境准备与脚本入口
2.1 环境变量脚本
开始任何操作前,需要先加载仓库提供的环境变量脚本(path.sh 与 cmd.sh):
. ./path.sh . ./cmd.shpath.sh会设置MAIN_ROOT(仓库根目录)、PYTHONPATH、BIN_DIR(指向paddlespeech/s2t/exps/hubert/bin)等关键变量;cmd.sh则负责选择任务调度后端(local/sge/slurm/ssh),默认cmd_backend='local',即在本机用run.pl直接执行。
同时还需要引入仓库通用的参数解析工具,使run.sh支持--变量 值形式的命令行传参:
source ${MAIN_ROOT}/utils/parse_options.sh2.2 run.sh 的本地变量
run.sh 中定义了一批可覆盖的本地变量:
| 变量 | 默认值 | 含义 |
|---|---|---|
gpus | 0 | 使用的 GPU 编号(多卡用逗号分隔,置空表示只用 CPU) |
stage | 0 | 起始阶段编号 |
stop_stage | 0 | 结束阶段编号 |
conf_path | conf/hubertASR.yaml | 模型配置文件路径 |
decode_conf_path | conf/tuning/decode.yaml | 解码配置文件路径 |
avg_num | 1 | 平均 top-k 模型的数量 |
resume | 空 | 断点续训的 epoch 编号 |
audio_file | data/demo_002_en.wav | 单音频推理的文件路径 |
ckpt | 自动生成 | 由conf_path文件名推导,例如hubertASR |
可以通过命令行覆盖这些变量,例如:
bash run.sh --gpus 0,1 --avg_num 202.3 五个阶段的职责总览
| Stage | 功能 |
|---|---|
| 0 | 数据处理:下载数据集、计算训练集 CMVN、生成词表、生成 train/dev/test 的 manifest、下载预训练 hubert 模型 |
| 1 | 模型训练 |
| 2 | 对 top-k 模型取平均得到最终模型(k=1 即选最优单模型) |
| 3 | 在测试集上评估最终模型性能 |
| 4 | 对单条音频文件进行推理 |
例如只跑数据处理:
bash run.sh --stage 0 --stop_stage 0三、Stage 0:数据准备全流程
3.1 数据准备脚本
Stage 0 调用 local/data.sh,其内部又分为 4 个子阶段(-1到2),外加预训练模型下载(stage 3):
if [ ${stage} -le 0 ] && [ ${stop_stage} -ge 0 ]; then # prepare data bash ./local/data.sh || exit -1 fi也可以直接在命令行单独执行:
. ./path.sh . ./cmd.sh bash ./local/data.sh3.2 子阶段 -1:下载数据集与生成 raw manifest
调用仓库的 dataset/librispeech/librispeech.py 下载 LibriSpeech 全部子集并生成各子集的原始 manifest:
python3 ${TARGET_DIR}/librispeech/librispeech.py \ --manifest_prefix="data/manifest" \ --target_dir="${TARGET_DIR}/librispeech" \ --full_download="True"随后将train-clean-100 / train-clean-360 / train-other-500合并为manifest.train.raw,将dev-clean / dev-other合并为manifest.dev.raw,将test-clean / test-other合并为manifest.test.raw。
3.3 子阶段 0:计算 CMVN 统计量
基于训练集 raw manifest 计算 Fbank 维度的均值/标准差,用于后续特征归一化:
python3 ${MAIN_ROOT}/utils/compute_mean_std.py \ --manifest_path="data/manifest.train.raw" \ --num_samples=2000 \ --spectrum_type="fbank" \ --feat_dim=161 \ --delta_delta=false \ --sample_rate=16000 \ --stride_ms=10 \ --window_ms=25 \ --use_dB_normalization=False \ --num_workers=${num_workers} \ --output_path="data/mean_std.json"注意这里取num_samples=2000条样本估算统计量,feat_dim=161(80 维 fbank + 80 维 delta + 1 维能量)仅为统计计算服务;hubertASR 实际输入是原始波形(见 preprocess.yaml 中的wav_process),这一点将在后面配置章节详述。
3.4 子阶段 1:构建词表
按字符(unit_type=char)从训练集文本构建词表:
python3 ${MAIN_ROOT}/utils/build_vocab.py \ --unit_type ${unit_type} \ --count_threshold=0 \ --vocab_path="${dict_dir}/vocab.txt" \ --manifest_paths="data/manifest.train.raw"生成data/lang_char/vocab.txt。
3.5 子阶段 2:格式化 manifest
将各子集的 raw manifest 格式化为带 token id、可供训练/解码直接读取的 manifest:
python3 ${MAIN_ROOT}/utils/format_data.py \ --cmvn_path "data/mean_std.json" \ --unit_type ${unit_type} \ --vocab_path="${dict_dir}/vocab.txt" \ --manifest_path="data/manifest.${set}.raw" \ --output_path="data/manifest.${set}"对train / dev / test / dev-clean / dev-other / test-clean / test-other并行执行。
3.6 子阶段 3:下载预训练 HuBERT 权重
mkdir -p exp/hubert wget -P exp/hubert https://paddlespeech.cdn.bcebos.com/hubert/hubert-large-lv60.pdparams该权重为 HuBERT-large(LV-60k 预训练)参数,对应配置中的hubert_params_path: "exp/hubert/hubert-large-lv60.pdparams",模型约 1.18 GB。
3.7 数据准备完成后的目录结构
data/ |-- dev.meta |-- lang_char | `-- bpe_unigram_5000.model | `-- bpe_unigram_5000.vocab | `-- vocab.txt |-- manifest.dev |-- manifest.dev.raw |-- manifest.test |-- manifest.test.raw |-- manifest.train |-- manifest.train.raw |-- mean_std.json |-- test.meta `-- train.meta四、hubertASR 配置逐项解析
conf/hubertASR.yaml 是微调的核心配置文件,下面按逻辑分块讲解每个参数的来源与影响。
4.1 网络架构块(Network Architecture)
freeze_hubert: False normalize_wav: True output_norm: True init_type: kaiming_uniform # !Warning: need to convergence enc: input_shape: 1024 dnn_blocks: 2 dnn_neurons: 1024 activation: True ctc: enc_n_units: 1024 blank_id: 0 dropout_rate: 0.0 hubert_params_path: "exp/hubert/hubert-large-lv60.pdparams"freeze_hubert: False:不冻结预训练主干。对应源码 hubert_ASR.py 中if config.freeze_hubert:分支,为 True 时会把 HuBERT 参数设为trainable=False;当前配置在 100 小时数据上对全模型微调。normalize_wav: True:前向时对原始波形做 layer norm 归一化,见forward中wav = F.layer_norm(wav, wav.shape[1:])。output_norm: True:对 HuBERT 输出的特征向量再做一次 layer norm,见out = F.layer_norm(out, out.shape[1:])。init_type: kaiming_uniform:初始化方式,源码中通过DefaultInitializerContext(init_type)作用于整个模型构建过程;YAML 注释特别提醒该设置对收敛至关重要。enc:DNN 分类头配置。input_shape: 1024与 HuBERT 编码维度encoder_embed_dim: 1024对齐;dnn_blocks: 2、dnn_neurons: 1024表示两层、每层 1024 神经元的前馈网络(VanillaNN)。ctc:CTC 解码层。enc_n_units: 1024输入维度;blank_id: 0blank 符编号;dropout_rate: 0.0。hubert_params_path:预训练权重加载路径。
4.2 任务配置块(task_cfg)
task_cfg: label_rate: 50.0 sample_rate: 16000 normalize: True enable_padding: False max_keep_size: None max_sample_size: 250000 min_sample_size: 32000 single_target: False random_crop: True pad_audio: Falselabel_rate: 50.0:每秒标签帧率(50 帧/秒)。HuBERT 的特征抽取由 7 层卷积组成,总下采样倍率由feat2tar_ratio = cfg.label_rate * feature_ds_rate / task_cfg.sample_rate计算(见 hubert_model.py)。sample_rate: 16000:输入音频采样率,与 LibriSpeech 及数据准备脚本一致。max_sample_size / min_sample_size:音频采样点数上限/下限(250000 约 15.6 秒,32000 约 2 秒),用于过滤异常长度样本。random_crop: True:训练时对波形做随机裁剪。normalize: True:样本级归一化。
4.3 模型配置块(model_cfg)——HuBERT 结构参数
model_cfg完整定义了 HuBERT-large 的网络拓扑(对应 HubertModel 的构造逻辑):
model_cfg: dropout_input: 0.0 final_dropout: 0.0 dropout: 0.0 attention_dropout: 0.0 activation_dropout: 0.1 apply_mask: True mask_length: 10 mask_prob: 0.5 mask_selection: static mask_other: 0.0 no_mask_overlap: False mask_channel_length: 64 mask_channel_prob: 0.25 mask_channel_selection: static mask_channel_other: 0.0 no_mask_channel_overlap: False feature_grad_mult: 0.0 layerdrop: 0.1 normalize: True fp16: True label_rate: 50 extractor_mode: layer_norm encoder_layers: 24 encoder_embed_dim: 1024 encoder_ffn_embed_dim: 4096 encoder_attention_heads: 16 activation_fn: gelu encoder_layerdrop: 0.1 dropout_features: 0.0 final_dim: 768 untie_final_proj: True layer_norm_first: True conv_feature_layers: "[(512,10,5)] + [(512,3,2)] * 4 + [(512,2,2)] * 2" conv_bias: False logit_temp: 0.1 target_glu: False mask_min_space: 1 mask_channel_min_space: 1 conv_pos: 128 conv_pos_groups: 16 latent_temp: [2.0, 0.5, 0.999995] skip_masked: False skip_nomask: True- 卷积特征抽取器:
conv_feature_layers定义了 7 层 CNN,即(512,10,5)+ 4×(512,3,2)+ 2×(512,2,2),每项为(输出通道、卷积核、步长),在 hubert_model.py 通过eval()解析并传入ConvFeatureExtractionModel。 - 编码器主干:24 层 Transformer、隐层 1024、FFN 4096、16 头注意力、GELU 激活、
layer_norm_first: True。 - 预训练相关的 masking 参数(
mask_prob、mask_length、mask_channel_*等):虽然微调阶段直接使用extract_features提取特征,但保留这些参数以保证与预训练权重结构一致。 feature_grad_mult: 0.0表示特征抽取层的梯度倍率(预训练特性参数)。
4.4 数据、Dataloader 与训练超参
train_manifest: data/manifest.train-clean-100 dev_manifest: data/manifest.dev test_manifest: data/manifest.test-clean注意:虽然data.sh会合并出manifest.train.raw,但本示例的训练 manifest 指向data/manifest.train-clean-100,即仅使用 train-clean-100(100 小时);测试集指向test-clean。
Dataloader 相关关键参数:
vocab_filepath: data/lang_char/vocab.txt unit_type: char sortagrad: -1 # -1: 全 epoch 启用“短样本优先”;0: 禁用;其他值: 仅前 N 个 epoch 启用 batch_size: 4 # 不同 batch_size 可能带来结果上的较大差异 maxlen_in: 1500 # 输入长度超过该值时自动减小 batchsize maxlen_out: 150 # 输出长度超过该值时自动减小 batchsize num_workers: 0 dist_sampler: True return_lens_rate: Truereturn_lens_rate: True对应HubertASR.forward(wav, wavs_lens_rate, ...)中的wavs_lens_rate,用于把波形长度折算为特征帧长度(x_lens = (wavs_lens_rate * x.shape[1]).round())。
数据增强(针对原始波形):
audio_augment: # for raw audio sample_rate: 16000 speeds: [95, 100, 105]训练超参:
n_epoch: 3 accum_grad: 8 global_grad_clip: 5.0 model_optim: adadelta model_optim_conf: lr: 1.0 epsilon: 1.0e-6 rho: 0.95 model_scheduler: constantlr model_scheduler_conf: warmup_steps: 25000 lr_decay: 1.0 hubert_optim: adadelta hubert_optim_conf: lr: 0.95 epsilon: 1.0e-6 rho: 0.95 hubert_scheduler: constantlr hubert_scheduler_conf: warmup_steps: 25000 lr_decay: 1.0 log_interval: 1 checkpoint: kbest_n: 50 latest_n: 5关键点:
- 双优化器:
model_optim(分类头)与hubert_optim(HuBERT 主干)使用不同学习率(1.0 vs 0.95),均采用 AdaDelta + 常数学习率调度。 accum_grad: 8:梯度累积 8 步,等效放大 batch size。n_epoch: 3:训练 3 个 epoch。checkpoint:保留 best 前 50 个、latest 前 5 个 checkpoint,供 Stage 2 平均使用。
4.5 解码配置
conf/tuning/decode.yaml:
decode_batch_size: 1 error_rate_type: wer decoding_method: ctc_greedy_search # 'ctc_greedy_search', 'ctc_prefix_beam_search' beam_size: 10decoding_method:支持ctc_greedy_search(贪心搜索)与ctc_prefix_beam_search(前缀束搜索);RESULTS.md 中的官方结果采用 greedy search。beam_size: 10:前缀束搜索的束宽(greedy 时无效)。- 源码中 HubertASR.decode 明确
ctc_prefix_beam_search只支持 batch_size == 1。
五、Stage 1~4:训练、平均、测试与推理
5.1 Stage 1:训练
if [ ${stage} -le 1 ] && [ ${stop_stage} -ge 1 ]; then # train model, all `ckpt` under `exp` dir CUDA_VISIBLE_DEVICES=${gpus} ./local/train.sh ${conf_path} ${ckpt} ${resume} ${ips} fitrain.sh 会根据CUDA_VISIBLE_DEVICES中的 GPU 数量选择单卡或分布式训练:
# 单卡 python3 -u ${BIN_DIR}/train.py \ --ngpu ${ngpu} --config ${config_path} --output exp/${ckpt_name} --seed ${seed} --resume ${resume} # 多卡 python3 -m paddle.distributed.launch --gpus=${CUDA_VISIBLE_DEVICES} ${ips_config} ${BIN_DIR}/train.py \ --ngpu ${ngpu} --config ${config_path} --output exp/${ckpt_name} --seed ${seed} --resume ${resume}脚本还设置了确定性训练相关环境变量:seed 非 0 时启用FLAGS_cudnn_deterministic=True(脚本注释提示:seed 可能破坏模型收敛),并设置FLAGS_allocator_strategy=naive_best_fit。
5.2 Stage 2:Top-k 模型平均
avg.sh best exp/${ckpt}/checkpoints ${avg_num}avg.sh 定义在仓库utils/下(通过path.sh的PATH引入)。每轮训练都会保存 checkpoint,可基于验证损失挑选最优模型,或对 top-k 个模型参数取平均得到最终模型。hubertASR 官方仅训练 3 个 epoch,avg_num设为 1。
5.3 Stage 3:测试集评估
CUDA_VISIBLE_DEVICES=0 ./local/test.sh ${conf_path} ${decode_conf_path} exp/${ckpt}/checkpoints/${avg_ckpt} || exit -1test.sh 的评估流程:
- 用
format_rsl.py生成参考文本(data/manifest.test-clean.text); - 对
ctc_greedy_search(batch_size=16)与ctc_prefix_beam_search(batch_size=1)分别调用${BIN_DIR}/test.py生成.rsl识别结果; - 再次用
format_rsl.py转成纯文本; - 用
compute-wer.py --char=1 --v=1计算字符级 WER,结果写入${ckpt_prefix}.${type}.error。
从 test.sh 可以看到评估集当前固定为test-clean,与 RESULTS.md 一致。
5.4 Stage 4:单音频推理
CUDA_VISIBLE_DEVICES=0 ./local/test_wav.sh ${conf_path} ${decode_conf_path} exp/${ckpt}/checkpoints/${avg_ckpt} ${audio_file} || exit -1test_wav.sh 会自动下载官方演示音频(若不存在):
wget -nc https://paddlespeech.cdn.bcebos.com/datasets/single_wav/en/demo_002_en.wav -P data/然后以batch_size=1、ctc_greedy_search方式调用${BIN_DIR}/test_wav.py --audio_file ${audio_file}输出识别文本。注意:音频采样率必须为 16K,与模型配置一致。
六、用预训练 hubertASR 模型直接复现结果
6.1 官方发布结果(RESULTS.md 全文)
RESULTS.md 内容如下:
LibriSpeech
hubertASR
Fintuning on train-clean-100 train: Epoch 3, 1*V100-32G, batchsize: 4, accum_grad: 8
| Model | Params | Config | Augmentation | Test set | Decode method | WER |
|---|---|---|---|---|---|---|
| hubertASR | 326.16M | conf/hubertASR.yaml | spec_aug | test-clean | greedy search | 0.05868 |
即:在 1 张 V100-32G 上训练 3 个 epoch(batchsize 4、accum_grad 8、SpecAugment 增强),使用贪心搜索解码,test-clean 上 WER 为 0.05868。
需要说明:RESULTS.md 的 Augmentation 列写的是
spec_aug,而 hubertASR.yaml 中的增强配置为原始波形速度扰动audio_augment.speeds: [95, 100, 105](同时 config.json 中apply_spec_augment为 true)。因此实际复现时应以配置文件与源码为准,配置中存在不一致字段时,注意核对 hubert_ASR.py 中if hasattr(config, 'spec_augment')的分支是否被触发。
6.2 下载发布模型并测试
官方发布的可直接下载模型记录在 docs/source/released_model.md:
Hubert-large-100h-librispeech Model:Encoder 为 Hubert,Decoder 为 Linear + CTC,解码方式 Greedy search,test-clean WER 0.0587,模型约 1.27 GB。
复现步骤(参考 README.md):
wget https://paddlespeech.cdn.bcebos.com/hubert/hubertASR-large-100h-librispeech_ckpt_1.4.0.model.tar.gz tar xzvf hubertASR-large-100h-librispeech_ckpt_1.4.0.model.tar.gz source path.sh # 若已处理过数据并得到 manifest,可跳过下面两步 bash local/data.sh --stage -1 --stop_stage -1 bash local/data.sh --stage 2 --stop_stage 2 CUDA_VISIBLE_DEVICES= ./local/test.sh conf/hubertASR.yaml conf/tuning/decode.yaml exp/hubertASR/checkpoints/avg_16.3 端到端复现:从数据到 WER
完整复现官方结果(train-clean-100 → test-clean)只需一条命令:
bash run.sh --stage 0 --stop_stage 3等价的手工分步执行(仅用 CPU):
. ./path.sh . ./cmd.sh bash ./local/data.sh CUDA_VISIBLE_DEVICES= ./local/train.sh conf/hubertASR.yaml hubertASR avg.sh best exp/hubertASR/checkpoints 1 CUDA_VISIBLE_DEVICES= ./local/test.sh conf/hubertASR.yaml conf/tuning/decode.yaml exp/hubertASR/checkpoints/avg_1如需同时验证单音频推理,可补充:
CUDA_VISIBLE_DEVICES= ./local/test_wav.sh conf/hubertASR.yaml conf/tuning/decode.yaml exp/hubertASR/checkpoints/avg_1 data/demo_002_en.wav七、源码级原理解读
7.1 前向与损失计算
hubert_ASR.py 的forward是理解整条数据流的钥匙:
def forward(self, wav, wavs_lens_rate, target, target_lens): if self.normalize_wav: wav = F.layer_norm(wav, wav.shape[1:]) # Extract wav2vec output out = self.hubert.extract_features(wav)[0] if self.output_norm: out = F.layer_norm(out, out.shape[1:]) if self.training and hasattr(self.config, 'spec_augment'): feats = self.spec_augment(out) else: feats = out x = self.enc(feats) x_lens = (wavs_lens_rate * x.shape[1]).round().astype(paddle.int64) ctc_loss = self.ctc(x, x_lens, target, target_lens) return ctc_loss数据流为:原始波形 →(可选)LayerNorm → HuBERT 卷积+Transformer 特征提取 →(可选)输出 LayerNorm →(训练时可选)SpecAugment → DNN 分类头 → 帧长度换算 → CTC loss。
7.2 HuBERT 特征提取与下采样
HubertModel.extract_features 依次经过feature_extractor(7 层卷积)与 Transformer encoder。下采样倍率由卷积层步长乘积决定:(5 × 2^4 × 2^2) = 320,配合label_rate=50与sample_rate=16000,feat2tar_ratio = 50 × 320 / 16000 = 1.0,即输出特征帧率恰好等于每秒 50 帧标签率,这是 CTC 帧对齐得以成立的基础。
7.3 解码方法与限制
decode 支持两种解码方式:
ctc_greedy_search:逐帧取 argmax 后去除重复与 blank(依赖remove_duplicates_and_blank);ctc_prefix_beam_search:前缀束搜索,beam_size由 decode 配置传入,且必须 batch_size == 1。
八、常见问题与调参提示
- 训练发散/不收敛:
init_type: kaiming_uniform被 YAML 注释标记为!Warning: need to convergence,初始化方式对结果影响很大;不要随意改动。 - batch_size 敏感性:YAML 注释明确提示“Different batch_size may cause large differences in results”,复现官方结果应保持
batch_size: 4、accum_grad: 8。 - 显存与时长限制:
max_sample_size: 250000会过滤超过约 15.6 秒的音频;maxlen_in/maxlen_out超限会自动缩减 batch size。 - prefix beam search 必须单条解码:
decode_batch_size: 1,否则源码会直接报错。 - 音频采样率:单音频推理必须为 16K,否则特征帧率与标签帧率失配。
- 分布式训练:多卡时通过
paddle.distributed.launch --gpus=${CUDA_VISIBLE_DEVICES}启动,ips变量可指定多机 IP 列表。
九、延伸阅读
- examples/librispeech/asr4/README.md:示例的完整英文说明(阶段划分、逐条命令)。
- paddlespeech/s2t/models/hubert/hubert_ASR.py:hubertASR 模型组装与前向/解码实现。
- paddlespeech/s2t/models/hubert/modules/hubert_model.py:HuBERT 主干(卷积特征抽取 + Transformer encoder)。
- paddlespeech/s2t/exps/hubert/bin/train.py:训练入口。
- docs/source/released_model.md:预训练 HuBERT 与 hubertASR 发布模型清单及指标。
- 仓库中还提供了基于其他数据的同类示例,例如 examples/librispeech/asr0、examples/librispeech/asr1(不同模型的 ASR 基线),以及 TTS/VPR/CLS 等其余示例目录,可对照了解 PaddleSpeech 各任务的统一工程范式(
run.sh多阶段 +conf目录 +local/*.sh脚本)。
结语
本文完整继承了 RESULTS.md 的核心复现信息(train-clean-100、3 epoch、1×V100-32G、batchsize 4、accum_grad 8、SpecAugment、greedy search、WER 0.05868),并在此基础上深入讲解了 ASR4 示例从数据准备到模型推理的完整工程链路与配置文件细节,同时结合 hubert_ASR.py 与 hubert_model.py 源码剖析了其底层原理。读者可以据此在本地完整复现“预训练 HuBERT 在 100 小时语音上的 CTC 微调”,并在需要时直接套用该示例范式改造自己的数据集。
- 人工智能
- 语音
- 音频
- NLP
- 媒体生成
【免费下载链接】PaddleSpeech
Easy-to-use Speech Toolkit including Self-Supervised Learning model, SOTA/Streaming ASR with punctuation, Streaming TTS with text frontend, Speaker Verification System, End-to-End Speech Translation and Keyword Spotting. Won NAACL2022 Best Demo Award.
相关推荐
PaddleSpeech 实战:基于 HuBERT 预训练模型微调 LibriSpeech 的 Hubert2ASR 全流程指南(asr4 示例)
PaddleSpeech 实战:基于 HuBERT 预训练模型微调 LibriSpeech 的 Hubert2ASR 全流程指南(asr4 示例) 导读 本文围
人工智能语音音频NLP媒体生成PaddleSpeech LibriSpeech asr4 实战:基于预训练 Hubert 微调的 hubertASR 语音识别与结果复现
PaddleSpeech LibriSpeech asr4 实战:基于预训练 Hubert 微调的 hubertASR 语音识别与结果复现 本篇文章聚焦 Pad
人工智能语音音频如何通过li-wen将openEuler构建时间从12小时缩短到极致
如何通过li wen将openEuler构建时间从12小时缩短到极致 前往项目官网免费下载: https://ar.openeuler.org/ar/ http
人工智能语音音频NLP媒体生成
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考