Microsoft UniLM项目中的SpeechLM:基于文本增强的语音预训练模型解析
2025-07-05 08:17:57作者:鲍丁臣Ursa
概述
SpeechLM是微软UniLM项目中的一个创新语音预训练框架,其核心思想是通过引入非配对的文本数据来增强语音预训练效果。该模型在2022年10月发布,相关论文《SpeechLM: Enhanced Speech Pre-Training with Unpaired Textual Data》详细阐述了其技术原理。
技术亮点
SpeechLM的主要创新点在于:
- 跨模态预训练:将语音和文本两种模态数据结合进行预训练
- 双流架构:同时处理语音和文本输入,学习两种模态间的对齐关系
- 层级表示:构建从底层声学特征到高层语义特征的统一表示空间
模型架构与版本
SpeechLM提供两种主要架构变体:
- SpeechLM-P:基于音素(Phoneme)单元的双流模型
- SpeechLM-H:基于隐藏(Hidden)单元的双流模型
每种架构又分为Base和Large两个规模:
- Base模型:基于960小时LibriSpeech语音和4000万文本数据预训练
- Large模型:基于6万小时LibriLight语音和4000万文本数据预训练
预训练模型与应用
可用模型
SpeechLM提供了多种预训练和微调模型,适用于不同任务:
- 基础预训练模型:未微调的原始预训练模型
- ASR微调模型:在100小时LibriSpeech上微调的语音识别模型
- ST微调模型:在CoVoST-2多语言语音翻译数据集上微调的模型
特征提取
使用预训练模型提取语音特征的示例代码:
import torch
from SpeechLM import SpeechLMConfig, SpeechLM
# 加载模型
checkpoint = torch.load('path/to/checkpoint.pt')
cfg = SpeechLMConfig(checkpoint['cfg']['model'])
model = SpeechLM(cfg)
model.load_state_dict(checkpoint['model'])
model.eval()
# 处理输入音频
wav_input_16khz = torch.randn(1,10000)
# 提取特征
rep = model.extract_features(wav_input_16khz)[0] # 最后一层表示
实践指南
环境配置
搭建SpeechLM开发环境:
# 安装依赖
pip install --editable fairseq/
pip install sacrebleu==1.5.1
语音识别(ASR)任务
数据准备
需要准备以下文件:
train.tsv
:音频文件清单train.ltr
:对应的文本标签dict.ltr.txt
:词汇表文件
模型微调
Base模型微调示例:
model_path=path/to/pretrained_model
data_dir=dataset/LibriSpeech/asr
bash speechlm/scripts/tune_speechlm_asr/finetune_base_ctc.sh $model_path $data_dir 'tag400k'
解码与评估
使用4-gram语言模型解码:
bash speechlm/scripts/tune_speechlm_asr/inference_ctc_kenlm.sh $model_path $data_dir
语音翻译(ST)任务
数据准备
- 下载Common Voice数据集
- 准备语音-翻译对的数据清单
lang=de # 目标语言
cv_root=dataset/CommonVoice/v4
bash speechlm/data_process/prepare_covost2_enxx.sh $lang $cv_root
模型微调
Base模型微调示例:
model_path=path/to/pretrained_model
data_dir=dataset/CommonVoice/v4/en/en-de
bash speechlm/scripts/tune_speechlm_st/ft_base_covost_enxx.sh $model_path $data_dir de 'tag400k'
预训练流程
数据准备
SpeechLM需要两种类型的数据:
- 语音数据:转换为音素或隐藏单元序列
- 文本数据:转换为(音素,字母)对或隐藏单元序列
启动预训练
Base版SpeechLM-P预训练示例:
data_dir=dataset/LibriSpeech/phone_unit
text_data_dir=dataset/LibriLM/phone_unit/bin-idx
bash speechlm/scripts/pretrain_speechlm/base_speechlmp.sh $data_dir $text_data_dir
分词器详解
SpeechLM使用多种分词器处理不同模态数据:
-
音素单元分词器(语音):
- 基于Kaldi训练的HMM模型
- 将语音转为帧对齐的音素序列
-
音素单元分词器(文本):
- 实现"单词→音素→上采样音素"的转换流程
- 生成(音素,字母)配对数据
-
隐藏单元分词器(语音):
- 基于wav2vec 2.0框架
- 提取语音的离散隐藏单元表示
-
隐藏单元分词器(文本):
- 基于FastSpeech-like模型
- 将文本转为语音风格的隐藏单元
总结
SpeechLM通过创新性地结合语音和文本数据进行预训练,在语音识别、语音翻译等任务上展现了优越性能。其双流架构和层级表示学习为跨模态语音处理提供了新思路。开发者可以利用提供的预训练模型快速构建语音应用,或基于开源代码进行更深入的研究和定制开发。