NeMo 语音自监督学习(SSL)完全指南:从对比预训练原理到下游微调实战
NeMo 语音自监督学习SSL完全指南从对比预训练原理到下游微调实战【免费下载链接】SpeechA scalable generative AI framework built for researchers and developers working on Large Language Models, Multimodal, and Speech AI (Automatic Speech Recognition and Text-to-Speech)项目地址: https://gitcode.com/GitHub_Trending/nem/Speech本指南以 NeMo当前仓库GitHub_Trending/nem/SpeechASR 集合中的 Speech Self-Supervised LearningSSL文档为核心系统讲解语音自监督学习的两大技术路线对比式与重建式、NeMo 中 Wav2Vec-BERT 与 NEST 两类 SSL 模型的训练方式以及从数据集配置、增强策略、多任务损失组合到预训练检查点加载与下游微调的完整闭环。读完本文你将能够基于仓库中的配置模板examples/asr/conf/ssl/自行搭建 Conformer/FastConformer 的 SSL 预训练实验并掌握将预训练编码器迁移到下游 ASR 任务的标准流程。什么是语音自监督学习SSLSelf-Supervised LearningSSL指不依赖显式标签的学习范式。任何学习过程都需要反馈信号在没有显式标签的情况下SSL 从数据自身中派生监督信号——其核心思想是利用输入中已观测的部分去预测输入中被隐藏的部分或属性例如补全句子中的空缺词或判断一张图像是正立还是倒置。在语音/音频理解领域SSL 方法大致分为两类技术路线学习方式代表方法对比式Contrastive通过区分真实 token或 latent与干扰项来学习Contrastive Predictive CodingCPC、Masked Language ModelingMLM重建式Reconstruction直接估计被有意剔除的输入部分Masked Reconstruction、Autoregressive Predictive CodingAPCSSL 在 ASR 中的价值提升声学建模近年来SSL 是改善声学建模Acoustic Modeling, AM的重要推手。端到端 ASR 模型通常采用 encoder-decoder 结构encoder 负责将语音波形转换为特征即声学建模decoder 将这些特征转换为文本。由于encoder 集中了绝大部分可训练参数它自然成为 SSL 的主要作用对象——SSL 预训练大多聚焦于提升 AM 质量。值得注意的是虽然 encoder 是 SSL 的主战场SSL 同样可用于改善 ASR 模型的其他部分例如基于 transducer 的 ASR 模型中的 predictor 模块。这意味着 SSL 的收益并不局限于单一模块而是可以沿模型架构灵活布局。NeMo 提供的 SSL 模型与训练入口当前仓库的 NeMo ASR 集合提供两类 SSL 模型Wav2Vec-BERT融合对比学习与 MLM 的混合式预训练模型NESTNeMo 中的另一类 SSL 预训练方法其配置示例位于examples/asr/conf/ssl/nest/目录。对应的训练脚本集中在仓库的 examples/asr/speech_pretraining 目录下examples/asr/speech_pretraining/ ├── README.md ├── masked_token_pred_pretrain.py # 掩码 token 预测式预训练脚本 ├── speech_pre_training.py # SSL 预训练主脚本 └── downstream/ └── speech_classification_mfa_train.py # 下游任务语音分类微调示例其中speech_pre_training.py即标准的 SSL 预训练入口配合examples/asr/conf/ssl/下的 YAML 配置即可启动实验。模型架构预训练用 encoder-decoder微调只保留 encoder任何能够作为 ASR 模型 encoder 的架构都可以用 SSL 进行预训练。SSL 阶段同样使用 encoder-decoder 风格的模型encoder与标准 ASR 模型的配置方式完全一致是 SSL 训练的核心对象decoderSSL 专用负责将 encoder 输出映射回预训练任务的目标如对比 token 或掩码 token参数量很小微调时直接丢弃。在下游微调时保留 encoder将 SSL 专用的 decoder 替换为下游任务对应的模块如 ASR 的预测头。这一“预训练 encoder 替换 decoder”的模式是 SSL 落地的标准路径具体操作参见下文「加载 SSL 检查点到下游模型」一节。从配置层面看encoder 可以直接复用 ASR 模型中的任意编码器不过在相同模型规模下仓库文档明确建议优先使用Conformer系列相关模型架构总览见 docs/source/asr/featured_models.rst其在相同参数规模下能取得更好的下游结果。数据集配置为对比损失而设计的约束SSL 的数据集配置与标准 ASR 训练大体相同通用数据集配置见 docs/source/asr/datasets.rst唯一的关键差异在于执行对比损失时需要对 batch 内所有语句掩码等量的 patch因此应避免 batch 内语句时长差异过大。NeMo 提供了三种手段min_duration过滤在数据集配置中设置min_duration直接丢弃低于指定时长的语句。适合被剔除语句不会显著影响数据集总时长的情况。random_segment扰动如果数据集中长语句16 秒左右多且时长差异大可在运行时从完整样本中采样固定长度的片段不足片段长度的样本会被 paddingaugmentor: random_segment: prob: 1.0 duration_sec: 16 # 指定想要的片段时长bucketing按语句时长分桶保证同一 batch 内语句长度接近参见 Bucketing 相关文档。训练/验证数据集配置示例仓库 examples/asr/conf/ssl/conformer/conformer_ssl.yaml 中给出了可直接复用的配置骨架model: train_ds: manifest_filepath: ??? sample_rate: ${model.sample_rate} batch_size: 16 # 内存允许时可增大 shuffle: true num_workers: 8 pin_memory: false use_start_end_token: true trim_silence: false max_duration: 16.7 min_duration: 8.0 # tarred datasets is_tarred: false tarred_audio_filepaths: null shuffle_n: 2048 # bucketing params bucketing_strategy: synced_randomized bucketing_batch_size: null validation_ds: manifest_filepath: ??? sample_rate: ${model.sample_rate} batch_size: 16 shuffle: false num_workers: 8 pin_memory: true use_start_end_token: false min_duration: 8.0参数要点use_start_end_token: true训练/false验证训练时在序列两端添加起始与结束 token验证时不添加min_duration: 8.0/max_duration: 16.7将样本时长约束在 816.7 秒区间为对比损失的等量掩码创造条件使用 tarred 数据集时设置is_tarred: true并提供tarred_audio_filepathsshuffle_n: 2048控制 tarred 数据打乱的窗口大小bucketing 相关bucketing_strategy: synced_randomized与bucketing_batch_size: null为 null 时由系统按batch_size自动推导。SSL 数据集与 manifest任何 NeMo ASR 可用的数据集都能用于 SSLASR 数据集清单见 docs/source/asr/datasets.rst。创建自定义 NeMo 兼容数据集的方法参见 manifest 格式说明相关章节。注意SSL 不使用显式标签转录文本因此在为 SSL 创建数据集时转录标签是可选项。预处理器配置预处理器用于计算 MFCC 或 mel 频谱特征作为模型输入。SSL 配置中直接复用 ASR 的标准预处理器例如preprocessor: _target_: nemo.collections.asr.modules.AudioToMelSpectrogramPreprocessor sample_rate: ${model.sample_rate} normalize: per_feature window_size: 0.025 window_stride: 0.01 window: hann features: 80 n_fft: 512 log: true frame_splicing: 1 dither: 0.00001 pad_to: 16 pad_value: 0.0其中features: 80表示输出 80 维 mel 特征该值会被后续ContrastiveLoss的in_dim引用${model.preprocessor.features}。增强配置MaskedPatchAugmentationSSL 预训练强烈推荐使用MaskedPatchAugmentation类进行频谱掩码增强源码位于nemo.collections.asr.modules.MaskedPatchAugmentation。它将语句划分为固定大小的 patch然后掩码固定数量或比例的 patch也可以额外叠加freq_masks与freq_width对频带做掩码。spec_augment: _target_: nemo.collections.asr.modules.MaskedPatchAugmentation patch_size: 48 # 单个 patch 的大小 mask_patches: 0.5 # 被掩码 patch 的比例也可改为固定整数数量 freq_masks: 3 # 剪切三条频带 freq_width: 20 # 每条频带最大宽度 20掩码量与负样本数的匹配原则如果对比损失的负样本只从同一语句内的被掩码步中采样则必须保证每条语句中被掩码的步数足够容纳所需负样本数。例如使用 4x stride 且要采样 100 个负样本则需要超过 400 个被掩码的步使用默认patch_size: 48时mask_patches至少需设为 9若mask_patches按比例配置则需确保样本的最小时长足够大以满足负样本采样需求。模型架构配置decoder 与对比损失基础方法纯对比任务wav2vec 2.0 风格最基础的 SSL 预训练是让模型求解一个对比任务即 wav2vec 2.0 的思路对应损失实现为nemo.collections.asr.losses.ContrastiveLoss。对于 4x stride 的 encoderdecoder 与 loss 配置如下decoder_out: 128 decoder: _target_: nemo.collections.asr.modules.ConvASRDecoderReconstruction feat_in: ${model.encoder.d_model} feat_hidden: 128 feat_out: ${model.decoder_out} stride_layers: 0 # 若 loss.combine_time_steps 小于 encoder 的 stride # 则需要为 decoder 增加相应数量的 stride_layers此处 stride 与 combine_time_steps 均为 4 non_stride_layers: 0 loss: _target_: nemo.collections.asr.losses.ContrastiveLoss in_dim: ${model.preprocessor.features} proj_dim: ${model.decoder_out} combine_time_steps: 4 # 多少个频谱时间步构成一个对比任务的 target/representation quantized_targets: true # 使用量化器还是线性层 codebook_size: 300 # 量化器单个 codebook 的大小 num_groups: 2 # 量化器使用的 codebook 数量 num_negatives: 100 # 每个 target 采样的负样本数 sample_from_same_utterance_only: true # 负样本是否只从同一语句中采样 sample_from_non_masked: false # 负样本是否从非掩码步中采样关键概念combine_time_steps与 encoder stride 的对齐。上例将输入频谱的 4 个时间步合并为 1 个对比任务的“token”恰好对应 encoder 的 4x stride。如果希望combine_time_steps与 encoder stride 不同就需要在 decoder 中增加 stride 层以对齐步幅。stride 不匹配时的处理FastConformer 8x 示例以 stride 8x 的 FastConformer encoder 为例若想将 8x 降到 4x即combine_time_steps: 4在 decoder 中增加一个stride_transpose: true的 stride 层即可配置参考 examples/asr/conf/ssl/fastconformer/fast-conformer.yamldecoder: _target_: nemo.collections.asr.modules.ConvASRDecoderReconstruction feat_in: ${model.model_defaults.enc_final} feat_hidden: 128 feat_out: ${model.model_defaults.decoder_out_channels} stride_layers: 1 # 若 loss.combine_time_steps 小于 encoder stride需要为 decoder 增加相应数量的 stride_layers # 此处 stride 为 8、combine_time_steps 为 4因此增加 1 个 stride 层 non_stride_layers: 0 stride_tranpose: true # stride 层是否使用转置卷积 loss: _target_: nemo.collections.asr.losses.ContrastiveLoss in_dim: *n_mels proj_dim: ${model.model_defaults.decoder_out_channels} combine_time_steps: 4 # 多少个频谱时间步构成一个对比任务的 target/representation quantized_targets: false # 使用量化器还是线性层 sample_from_same_utterance_only: true sample_from_non_masked: false从仓库中的 FastConformer SSL 配置可以看到其subsampling: dw_striding、subsampling_factor: 8而对比损失combine_time_steps: 8即 stride 与 combine_time_steps 保持一致此时stride_layers: 0。多损失组合loss_list 机制对比损失可以与其他损失如 MLM类似 W2V-Bert 的做法组合。此时不再单独配置decoder与loss而是配置一个loss_list其中可包含任意数量的 decoder-loss 对。每个命名子配置支持以下字段decoder—— decoder 配置指定_target_类与参数loss—— 对应的损失配置指定_target_类与参数loss_alpha—— 该损失的权重系数默认 1.0targets_from_loss—— 指定从哪个对比损失提取标签。任何需要标签的损失若 manifest 中没有标签都必须设置此项transpose_encoded—— 在将编码特征送入该损失前是否转置start_step—— 该 decoderloss 开始参与训练的全局步数output_from_layer—— 指定从哪个层提取编码特征送入该 decoder不指定或为 null 时使用 encoder 最后一层输出。注在较新的配置模板如fast-conformer.yaml中每个子配置还支持is_active: true/false开关字段用于指示是否启用该损失。组合一对比 MLM以下示例中MLM 损失直接使用对比损失量化模块产出的伪标签需要quantized_targets: true量化器用于为其他损失提取伪标签decoder_out: 128 loss_list: contrastive: decoder: _target_: nemo.collections.asr.modules.ConvASRDecoderReconstruction feat_in: ${model.encoder.d_model} feat_hidden: 128 # decoder 隐藏层特征维度 feat_out: ${model.decoder_out} stride_layers: 0 non_stride_layers: 0 loss: _target_: nemo.collections.asr.losses.ContrastiveLoss in_dim: ${model.preprocessor.features} proj_dim: ${model.decoder_out} combine_time_steps: 4 # 多少个频谱时间步构成一个对比 target quantized_targets: true # 是否使用量化器 # 提取其他损失的伪标签需要量化器 codebook_size: 300 num_groups: 2 sample_from_same_utterance_only: true sample_from_non_masked: false mlm: decoder: _target_: nemo.collections.asr.modules.ConvASRDecoder feat_in: ${model.encoder.d_model} num_classes: 90000 # 应设为对比损失中 codebook_size^num_groups300^2 90000 loss: _target_: nemo.collections.asr.losses.MLMLoss combine_time_steps: 4 targets_from_loss: contrastive # 该损失需要 target可从 manifest 获取或取自量化对比损失 loss_alpha: 1000. # 该损失相对于其他损失的权重 transpose_encoded: false # 视输入 decoder 的层而定可能需要对输入进行转置 start_step: 0 # 该损失从第几个全局步开始生效 # 训练足够长时可调大该值可能提升早期训练稳定性 output_from_layer: null # 若希望使用非最后一层 encoder 的输出作为该 decoder 的输入在此指定层名上述contrastive mlm组合正是仓库默认 Conformer SSL 配置 conformer_ssl.yaml 采用的方案该配置针对约 120M 的 Conformer Large 设计学习参数面向约 2K 的等效 batch size若用更小的 batch 需重新调参或增大accumulate_grad_batches。组合二对比 CTC除了 MLM也可以组合其他需要标签的损失如 CTC 或 RNNT。与 MLM 不同这些损失不要求 target 与步数严格对齐因此可将对比损失的reduce_ids设为true把连续相同的 id 序列折叠为单个 iddecoder_out: 128 loss_list: contr: decoder: _target_: nemo.collections.asr.modules.ConvASRDecoderReconstruction feat_in: ${model.encoder.d_model} feat_hidden: 128 feat_out: ${model.decoder_out} stride_layers: 0 non_stride_layers: 0 loss: _target_: nemo.collections.asr.losses.ContrastiveLoss in_dim: ${model.preprocessor.features} proj_dim: ${model.decoder_out} combine_time_steps: 4 quantized_targets: true codebook_size: 300 num_groups: 2 sample_from_same_utterance_only: true sample_from_non_masked: false reduce_ids: true ctc: decoder: _target_: nemo.collections.asr.modules.ConvASRDecoder feat_in: ${model.encoder.d_model} num_classes: 90000 loss: _target_: nemo.collections.asr.losses.CTCLossForSSL num_classes: 90000 targets_from_loss: contr start_step: 3000组合三对比 RNNTRNNT 组合需要引入预测网络与联合网络RNNTDecoderJointSSL并同样通过targets_from_loss: contr从对比损失获取标签decoder_out: 128 loss_list: contr: decoder: _target_: nemo.collections.asr.modules.ConvASRDecoderReconstruction feat_in: ${model.encoder.d_model} feat_hidden: 128 feat_out: ${model.decoder_out} stride_layers: 0 non_stride_layers: 0 loss: _target_: nemo.collections.asr.losses.ContrastiveLoss in_dim: ${model.preprocessor.features} proj_dim: ${model.decoder_out} combine_time_steps: 4 quantized_targets: true codebook_size: 24 sample_from_same_utterance_only: true sample_from_non_masked: false reduce_ids: true rnnt: decoder: _target_: nemo.collections.asr.modules.RNNTDecoderJointSSL decoder: _target_: nemo.collections.asr.modules.RNNTDecoder normalization_mode: null # 目前仅支持 null 以便导出 random_state_sampling: false blank_as_pad: true # 为支持 RNNT 模型导出与高效推理必须开启 vocab_size: 576 prednet: pred_hidden: 640 pred_rnn_layers: 1 t_max: null dropout: 0.1 joint: _target_: nemo.collections.asr.modules.RNNTJoint log_softmax: null # null 表示根据 CPU/GPU 设备自动设置 preserve_memory: false # 会大幅减慢训练但可能节省显存 experimental_fuse_loss_wer: false jointnet: encoder_hidden: 512 pred_hidden: 640 joint_hidden: 640 activation: relu dropout: 0.1 num_classes: 576 loss: _target_: nemo.collections.asr.losses.RNNTLossForSSL num_classes: 576 targets_from_loss: contr start_step: 1000组合四多损失使用 encoder 中间层特征loss_list还支持让不同损失从 encoder 的不同中间层取特征对应中间层 SSL 的相关研究。下面的示例使用 1 个对比损失 3 个 MLM 损失分别取 encoder 第 6 层、第 12 层与最后一层layers.5、layers.11与默认最终层的输出decoder_out: 128 loss_list: contr: decoder: _target_: nemo.collections.asr.modules.ConvASRDecoderReconstruction feat_in: ${model.encoder.d_model} feat_hidden: 128 feat_out: ${model.decoder_out} stride_layers: 0 non_stride_layers: 0 loss: _target_: nemo.collections.asr.losses.ContrastiveLoss in_dim: ${model.preprocessor.features} proj_dim: ${model.decoder_out} combine_time_steps: 4 quantized_targets: true codebook_size: 300 sample_from_same_utterance_only: true sample_from_non_masked: false loss_alpha: 5. mlm: decoder: _target_: nemo.collections.asr.modules.ConvASRDecoder feat_in: ${model.encoder.d_model} num_classes: 90000 loss: _target_: nemo.collections.asr.losses.MLMLoss combine_time_steps: 4 targets_from_loss: contr loss_alpha: 1000. mlm_2: decoder: _target_: nemo.collections.asr.modules.ConvASRDecoder feat_in: ${model.encoder.d_model} num_classes: 90000 loss: _target_: nemo.collections.asr.losses.MLMLoss combine_time_steps: 4 targets_from_loss: contr loss_alpha: 300. output_from_layer: layers.5 transpose_encoded: true mlm_3: decoder: _target_: nemo.collections.asr.modules.ConvASRDecoder feat_in: ${model.encoder.d_model} num_classes: 90000 loss: _target_: nemo.collections.asr.losses.MLMLoss combine_time_steps: 4 targets_from_loss: contr loss_alpha: 300. output_from_layer: layers.11 transpose_encoded: true优化器与训练器配置SSL 配置中的优化器与训练器与标准 ASR 训练一致。仓库默认配置使用 AdamW NoamAnnealing 学习率调度面向约 2K 等效 batch sizeoptim: name: adamw lr: 5.0 betas: [0.9, 0.98] weight_decay: 1e-3 sched: name: NoamAnnealing d_model: ${model.encoder.d_model} warmup_steps: 25000 warmup_ratio: null min_lr: 1e-6 trainer: devices: -1 # GPU 数量-1 表示使用全部可用 GPU num_nodes: 1 max_epochs: 1000 max_steps: -1 # 未设置时运行时计算 val_check_interval: 1.0 # 设为 0.25 则每 epoch 验证 4 次整数表示按迭代次数 accelerator: auto strategy: ddp accumulate_grad_batches: 1 gradient_clip_val: 1.0 precision: 32 # 16、32 或 bf16 sync_batchnorm: true benchmark: false # 变长语音输入必须为 false否则会拖慢训练启动 SSL 预训练准备好 manifest 与配置后即可通过训练脚本启动预训练manifest_filepath: ???表示必须由命令行或覆盖方式指定python examples/asr/speech_pretraining/speech_pre_training.py \ --config-pathconf/ssl/conformer \ --config-nameconformer_ssl \ model.train_ds.manifest_filepath/path/to/train.json \ model.validation_ds.manifest_filepath/path/to/val.json对应掩码 token 预测式预训练可使用masked_token_pred_pretrain.py。NEST 模型的配置模板位于 examples/asr/conf/ssl/nest其中包含nest_fast-conformer.yaml以及multi_layer_feat/下的 ECAPA-TDNN / Titanet-Small 变体可用于不同的 encoder 选型。预训练检查点加载与下游微调NeMo 的 SSL 检查点需要进一步在下游任务上微调才能使用。加载预训练检查点有两种主要方式使用restore_from()方法加载本地.nemo检查点文件使用from_pretrained()方法从 NGC 下载并配置检查点。以上说明针对微调场景。若要恢复未完成的训练实验请通过 Experiment Manager 将resume_if_exists置为True在exp_manager配置中设置。加载本地检查点NeMo 训练过程中会自动以.nemo格式保存检查点也可随时手动调用model.save_to(checkpoint_path.nemo)保存。加载本地检查点import nemo.collections.asr as nemo_asr ssl_model nemo_asr.models.MODEL_BASE_CLASS.restore_from(restore_pathpath/to/checkpoint/file.nemo)其中MODEL_BASE_CLASS为原始检查点对应的 ASR 模型类或通用的ASRModel类。加载 NGC 预训练检查点SSL 集合提供多个在不同数据集上训练的检查点可通过from_pretrained()方法加载import nemo.collections.asr as nemo_asr ssl_model nemo_asr.models.ASRModel.from_pretrained(model_nameMODEL_NAME)其中model_name即下方表格中“Model Name”列的值。例如加载 Conformer Large SSL 检查点ssl_model nemo_asr.models.ASRModel.from_pretrained(model_namessl_en_conformer_large)如果需要访问特定模型的功能也可以从具体模型类如 Conformer 对应的SpeechEncDecSelfSupervisedModel调用from_pretrained()。若希望以编程方式列出某个基类可用的模型可使用list_available_models()nemo_asr.models.MODEL_BASE_CLASS.list_available_models()将 SSL 检查点装入下游模型加载 SSL 检查点后需要将其state_dict复制到下游模型SSL 阶段使用的 decoder 在此被替换# 定义下游模型 asr_model nemo_asr.models.EncDecRNNTBPEModel(cfgcfg.model, trainertrainer) # 加载 ssl 检查点 asr_model.load_state_dict(ssl_model.state_dict(), strictFalse) # 丢弃 ssl 模型 del ssl_model其中strictFalse允许下游模型只接收匹配的 encoder 权重而忽略不匹配的 decoder 部分。若要完全通过配置文件自动完成此过程参见 SSL 配置文档。下游微调与推理将 SSL 检查点装入下游模型后即可参照 tutorials/asr 目录下的 ASR 教程如 Self_Supervised_Pre_Training.ipynb进行微调。这些教程大多以某个数据集为例演示完整流程编写自己的推理脚本时请遵循 ASR 集合示例目录中的执行流程顺序以保证推理正确。可用 SSL 模型清单以下是当前仓库文档benchmark_ssl.csv中列出的 SSL 模型Model NameModel Base Classssl_en_conformer_largeSpeechEncDecSelfSupervisedModelssl_en_conformer_xlargeSpeechEncDecSelfSupervisedModelAPI 速览SSL 集合的核心模型类与 mixin完整 API 见 api.rst模型类nemo.collections.asr.models.EncDecDenoiseMaskedTokenPredModel掩码 token 预测式模型、nemo.collections.asr.models.SpeechEncDecSelfSupervisedModel通用 SSL 模型Conformer 检查点所属类Mixinnemo.collections.asr.parts.mixins.mixins.ASRModuleMixin、nemo.core.classes.mixins.access_mixins.AccessMixin。更多资源动手教程Self_Supervised_Pre_Training.ipynbNeMo 初学者建议先完成 ASR_with_NeMo.ipynb模型架构总览ASR Featured Models数据集准备ASR Datasets检查点加载与 NGC 模型列表CheckpointsSSL 专属配置说明Configuration Files预训练脚本examples/asr/speech_pretraining配置模板examples/asr/conf/ssl。结语从技术路线看语音 SSL 分为对比式与重建式两大流派在 NeMo 中落地时关键是把握三条主线一是通过min_duration、random_segment、bucketing 控制 batch 内时长分布以满足对比损失要求二是围绕loss_list机制灵活组合对比、MLM、CTC、RNNT 等损失并可跨 encoder 中间层取特征三是牢记“预训练保留 encoder、微调替换 decoder”的迁移范式借助restore_from/from_pretrained/load_state_dict完成权重迁移。结合仓库提供的 Conformer、FastConformer 与 NEST 配置模板你可以在现有 ASR 数据基础上快速搭建自己的 SSL 预训练实验并为下游识别任务提供更强的声学编码器。【免费下载链接】SpeechA scalable generative AI framework built for researchers and developers working on Large Language Models, Multimodal, and Speech AI (Automatic Speech Recognition and Text-to-Speech)项目地址: https://gitcode.com/GitHub_Trending/nem/Speech创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考