"深度学习多模态训练,怎么解决不同模态之间差异的问题? "

"深度学习多模态训练,怎么解决不同模态之间差异的问题? ",第1张

语音文本之间的模态差异虽大,但利用训练过的Tokenizer将所有未标注的语音和文本转换到相同的离散表示空间。这样,两种模态亦能在预训练中通过共享接口自然地交互。

如今,人工智能技术已经能够通过语音识别与语音合成实现两者的相互转换。随着自监督表征学习分别在自然语言处理(NLP)与语音领域取得了显著进展,研究者们开始关注语音和文本的联合预训练方法。

近期,微软亚洲研究院与微软云计算平台 Azure 语音组的研究员们提出了文本数据增强的语音预训练模型SpeechLM。神经科学研究显示,人类在接收语音和文字信息时会使用不同的大脑皮层分别预处理语音和文本,然后再将预处理的结果投射至同一个被称为Broca and Wernicke的区域提取语义等信息。受此启发,研究员们开始使用音素单元(phoneme unit)或隐藏单元(hidden unit)作为共享的语义接口[LZ1] 来桥接语音和文本模态。该接口具有很强的可解释性和可学习性。通过这个共享的语义接口,SpeechLM可以利用额外的文本数据来提升语音预训练模型的性能。在典型的语音-文本跨模态任务(如语音识别、语音翻译)和语音表征学习基准数据集SUPERB [1]上,SpeechLM表现优异。图1展示了在LibriSpeech数据集中使用不同数量的文本数据后,SpeechLM显示出的语音识别性能。仅仅使用少量文本数据(10K个文本句子)的SpeechLM显著地超越了之前的SOTA模型。目前,该模型已经在GitHub开源,并将集成到 Hugging Face框架中供研发者参考。

回首语音和语言联合训练

与NLP不同,语音信号是连续的,因此很难直接找到类似于BERT预训练的预测标签。想要解决这个问题,就需要一个Tokenizer将连续的语音特征映射至离散的标签。受文本预训练方法BERT的启发,语音表示学习模型HuBERT [2]利用MFCC特征或者Transformer中间层表示的k-means模型作为Tokenizer,将语音转换为离散的标签,通过迭代的方法进行模型预训练。

以往的联合预训练方法大多简单地让语音和文本共享神经网络的模型参数。这种训练方法不能保证语音和文本在同一语义空间内,存在迁移干扰和容量稀释的问题。为了缓解这两个问题,SLAM [3]和mSLAM [4]利用额外有监督的语音识别任务来增强语音与文本的一致性。然而,这些方法仍然无法使用相同的建模单元对未标注的语音和文本数据进行建模。虽然MAESTRO能够在RNN-T框架下通过模态匹配算法从语音和文本模态中学习共享表示,但该算法只能在成对的语音-文本数据上进行优化。

SpeechLM的目标就是利用文本数据来改善语音表征的学习。不同于之前的研究,SpeechLM能够利用训练过的Tokenizer将所有未标注的语音和文本转换到相同的离散表示空间。这样,两种模态亦能在预训练中通过共享接口自然地交互。

构建语音和文本的共享桥梁

语音和文本之间的模态差异极大。首先,语音信号比文本数据具有更多更丰富的信息,如韵律、音色、情感等。其次,语音是由一连串音素组成的连续信号,通常表示为连续平滑的波形,而文本是由词语、字词或字符表示的离散数据。第三,语音表示比文本表示更长,例如,一秒16KHZ的语音包含16000个采样点和几个单词。因此,如何弥合语音和文本之间的模态差异是构建两者桥梁的关键。

为了解决这一问题,研究员们探索使用了一个定义好的离散标签来桥接语音和文本,将语音和文本映射到共享离散空间中进行联合预训练。利用音素单元或者隐藏单元作为语音和文本之间的桥梁具有以下优点:

(1)将语音和文本分别对齐成共享的中间表示比直接对齐两者更容易

(2)可以充分利用额外的未标注数据来提升对齐学习

(3)可以利用更细粒度的对齐信息(例如帧级别对齐)来促进联合建模。

研究员们定义了两套不同的离散Tokenizer来实现这个目的,分别将语音文本映射到基于音素单元的表示空间和基于隐藏单元的表示空间。音素单元Tokenizer使用混合ASR模型,将未标记的语音序列转录成帧级别的音素单元,并通过词典转换未标记的文本。而隐藏单元Tokenizer使用基于HuBERT的k-means模型将语音聚类为隐藏单元,并利用非自回归模型将未标记的文本转换为隐藏单元。所有的Tokenizer模型都是用无监督数据或少量ASR数据训练获得的,并在预训练前离线使用,不直接参与预训练过程。

你好,matlab里面以关键字 function 返回值=函数名(输入);这样形式的都是被调用函数。

就好比c里面的函数,别的程序可以直接调用它。

就拿你这里来说,需要另外一个程序。你可以这样写:

clear all

clc

a=wavread('E:\GMM文献\失真下说话人识别研究文献\abcwav');%这是读入一个wav文件的语句

b=mfcccoef(a);%这样就可以求得mfcc参数了

%%不过你这程序里面包含很多的调用程序,比如那个enframe推荐你看一下《MATLAB扩展编程》这本书。

通过介绍说话人确认系统,采用能够反映人对语音的感知特性的Mel频率倒谱系数(MFCC)作为特征参数,同时提出了用训练得到的码本以及平均失真作为表征说话人的模型,对说话人确认系统中距离测度做出相应的改动。

语音信号是受外界干扰的随机信号,在进行语音信号处理(语音编码、语音合成、语音识别)时,必须经过特征提取车里才能有效的降低信号的冗余度。现在说一下语音特征参数有能量、基因频谱、共振峰值、短时过零率等,相比之下比较常用的是线性预测倒谱:lpcc与mel倒谱系数,这是因为MFCC和LPCC在实际应用中最为成熟,特别是在真实信道噪声和频谱是真的情况下,也就是在噪声干扰比较强状态下,特征参数MFCC相对于LPCC语音特征系数,能更好的反映人耳的听觉感知情况,所以应用的比较多。

1、SpeechEmotionRecognition,一个用PyTorch实现的语音情感识别模型。

2、speechpy,一个基于Python的语音信号处理库,它可以用于提取语音信号的MFCC、滤波器组、能量和零交叉率等特征。

  首先,我们知道声音实际上是一种波。常见的mp3、wmv等格式都是压缩格式,必须转成非压缩的纯波形文件来处理,比如Windows PCM文件,也就是俗称的wav文件。wav文件里存储的除了一个文件头以外,就是声音波形的一个个点了。

 在开始语音识别之前,有时需要把首尾端的静音切除,降低对后续步骤造成的干扰。这个静音切除的操作一般称为VAD,需要用到信号处理的一些技术。要对声音进行分析,需要对声音分帧,也就是把声音切开成一小段一小段,每小段称为一帧。分帧操作一般不是简单的切开,而是使用移动窗函数来实现,这里不详述。帧与帧之间一般是有交叠的。

 每帧的长度为25毫秒,每两帧之间有25-10=15毫秒的交叠。我们称为以帧长25ms、帧移10ms分帧。每帧的长度为25毫秒,每两帧之间有25-10=15毫秒的交叠。我们称为以帧长25ms、帧移10ms分帧。

 分帧后,语音就变成了很多小段。但波形在时域上几乎没有描述能力,因此必须将波形作变换。常见的一种变换方法是提取MFCC特征,根据人耳的生理特性,把每一帧波形变成一个多维向量,可以简单地理解为这个向量包含了这帧语音的内容信息。这个过程叫做声学特征提取。实际应用中,这一步有很多细节,声学特征也不止有MFCC这一种,具体这里不讲。

 至此,声音就成了一个12行(假设声学特征是12维)、N列的一个矩阵,称之为观察序列,这里N为总帧数。观察序列如下图所示,图中,每一帧都用一个12维的向量表示,色块的颜色深浅表示向量值的大小。

 接下来就要介绍怎样把这个矩阵变成文本了。首先要介绍两个概念:音素:单词的发音由音素构成。对英语,一种常用的音素集是卡内基梅隆大学的一套由39个音素构成的音素集,参见The CMU Pronouncing Dictionary。汉语一般直接用全部声母和韵母作为音素集,另外汉语识别还分有调无调,不详述。状态:这里理解成比音素更细致的语音单位就行啦。通常把一个音素划分成3个状态。

 语音识别是怎么工作的呢?实际上一点都不神秘,无非是:第一步,把帧识别成状态(难点);第二步,把状态组合成音素;第三步,把音素组合成单词。

欢迎分享,转载请注明来源:浪漫分享网

原文地址:https://hunlipic.com/qinggan/7907974.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-09-07
下一篇2023-09-07

发表评论

登录后才能评论

评论列表(0条)

    保存