首页
/ Microsoft UniLM项目中的SpeechLM:基于文本增强的语音预训练模型解析

Microsoft UniLM项目中的SpeechLM:基于文本增强的语音预训练模型解析

2025-07-05 08:17:57作者:鲍丁臣Ursa

概述

SpeechLM是微软UniLM项目中的一个创新语音预训练框架,其核心思想是通过引入非配对的文本数据来增强语音预训练效果。该模型在2022年10月发布,相关论文《SpeechLM: Enhanced Speech Pre-Training with Unpaired Textual Data》详细阐述了其技术原理。

技术亮点

SpeechLM的主要创新点在于:

  1. 跨模态预训练:将语音和文本两种模态数据结合进行预训练
  2. 双流架构:同时处理语音和文本输入,学习两种模态间的对齐关系
  3. 层级表示:构建从底层声学特征到高层语义特征的统一表示空间

模型架构与版本

SpeechLM提供两种主要架构变体:

  1. SpeechLM-P:基于音素(Phoneme)单元的双流模型
  2. SpeechLM-H:基于隐藏(Hidden)单元的双流模型

每种架构又分为Base和Large两个规模:

  • Base模型:基于960小时LibriSpeech语音和4000万文本数据预训练
  • Large模型:基于6万小时LibriLight语音和4000万文本数据预训练

预训练模型与应用

可用模型

SpeechLM提供了多种预训练和微调模型,适用于不同任务:

  1. 基础预训练模型:未微调的原始预训练模型
  2. ASR微调模型:在100小时LibriSpeech上微调的语音识别模型
  3. 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)任务

数据准备

  1. 下载Common Voice数据集
  2. 准备语音-翻译对的数据清单
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需要两种类型的数据:

  1. 语音数据:转换为音素或隐藏单元序列
  2. 文本数据:转换为(音素,字母)对或隐藏单元序列

启动预训练

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使用多种分词器处理不同模态数据:

  1. 音素单元分词器(语音)

    • 基于Kaldi训练的HMM模型
    • 将语音转为帧对齐的音素序列
  2. 音素单元分词器(文本)

    • 实现"单词→音素→上采样音素"的转换流程
    • 生成(音素,字母)配对数据
  3. 隐藏单元分词器(语音)

    • 基于wav2vec 2.0框架
    • 提取语音的离散隐藏单元表示
  4. 隐藏单元分词器(文本)

    • 基于FastSpeech-like模型
    • 将文本转为语音风格的隐藏单元

总结

SpeechLM通过创新性地结合语音和文本数据进行预训练,在语音识别、语音翻译等任务上展现了优越性能。其双流架构和层级表示学习为跨模态语音处理提供了新思路。开发者可以利用提供的预训练模型快速构建语音应用,或基于开源代码进行更深入的研究和定制开发。