ASR语音识别—N-gram 语言模型

最近在做ASR语音识别任务,基于阿里FunASR框架,特此记录下跟语言模型(LM)相关知识。

语言模型解码

传统基于CD-phone声学建模ASR系统解码器普遍采用HCLG构建解码网络,当前方案中paraformer声学模型直接对音素或字符建模,为此我们采用TLG(Token、Lexicon、Grammar)结构构建统一解码网络,直接将音素/字符序列[ paraformer声学模型 ]、发音词典、语言模型编译形成T、L、G三个wfst子网络,再通过composition、determinization、minimization等一系列操作生成统一解码网络。

我们借鉴EESEN方案,基于openfst/kaldi构建TLG解码网络编译pipeline,支持从原始语料和发音词典到最终解码资源的全流程编译,便于用户自行定制适合自身的解码资源。如下是TLG网络编译流程图。

为什么需要语言模型?

为什么有些句子比其他句子更 流畅(fluent),或者说 更自然(natural)
我们为什么关心这个问题呢?
因为在很多应用中,我们很关心语言的流畅性与自然性。
例如,在语音识别中,你听到一句话,并且想将它转换成文本,所以你需要区分这段语音可能对应的不同文本,并从中选择更加流畅和自然的版本。比如下面两个句子的发音很接近:recognise speech > wreck a nice beach,从流畅和自然的角度考虑,显然,左边的句子更有可能代表了讲话者的本意。而语言模型可以帮你做到这一点,它会告诉你 “recognise speech” 是人们更倾向表达的意思。

  • 那么,我们如何衡量这种 “优度(goodness)”(或者说流畅度、自然度)呢?
    我们用 概率 来衡量它,而语言模型提供了一种很自然的方式来估计句子的概率。
  • 在此基础上,一旦你构建了一个语言模型,你还可以用它来 生成(generation) 语言。

语言模型可以用于哪些任务呢?

  • 主要用于:
    • 语音识别(Speech recognition)
    • 拼写纠错(Spelling correction)
    • 查询补全(Query completion)
    • 光学字符识别(Optical character recognition)
  • 其他生成任务:
    • 机器翻译(Machine translation)
    • 概括(Summarisation)
    • 对话系统(Dialogue systems)

N-gram 语言模型

N-Gram是基于一个假设:第n个词出现与前n-1个词相关,而与其他任何词不相关(这也是隐马尔可夫当中的假设)。整个句子出现的概率就等于各个词出现的概率乘积。各个词的概率可以通过语料中统计计算得到。通常N-Gram取自文本或语料库。

概率:从联合概率到条件概率

我们的目标是得到一个由 m 个单词组成的任意序列(即一个包含 m 个单词的句子)的概率:

P(w1,w2,…,wm)

第一步是利用链式法则(chain rule)将联合概率转换成条件概率的连乘形式:

P(w1,w2,…,wm)=P(w1)P(w2∣w1)P(w3∣w1,w2)⋯P(wm∣w1,…,wm−1)

马尔可夫假设(The Markov Assumption)

目前,这仍然是一个比较棘手的问题,因为随着上下文的不断增加,我们构建的模型中将包含越来越多的参数。所以这里,我们采用一种称为 “马尔可夫假设” 的简化假设:某个单词出现的概率不再依赖于全部上下文,而是取决于离它最近的 n 个单词。因此,我们得到: P(wi∣w1,…,wi−1)≈P(wi∣wi−n+1,…,wi−1)

对于某个很小的 n:

  • 当 n=1 时,一个 unigram 模型:P(w1,w2,…,wm)=∏i=1mP(wi)在 unigram 模型中,我们假设一个句子出现的概率等于其中每个单词单独出现的概率的乘积,这意味着每个单词出现的概率之间相互独立,即我们并不关心每个单词的上下文。
  • 当 n=2 时,一个 bigram 模型:P(w1,w2,…,wm)=∏i=1mP(wi∣wi−1)在 bigram 模型中,我们假设句子中每个单词出现的概率都和它前一个单词出现的概率有关。
  • 当 n=3 时,一个 trigram 模型:P(w1,w2,…,wm)=∏i=1mP(wi∣wi−2,wi−1)在 trigram 模型中,我们假设句子中每个单词出现的概率都和它前两个单词出现的概率有关。

最大似然估计

我们如何计算这些概率?

非常简单,我们只需要一个大的用于训练的语料库(corpus),然后我们就可以根据语料库中各个单词的计数(counts),利用最大似然估计来估计该单词出现的概率:

  • 对于 unigram 模型:

其中,C 是一个计数函数,C(wi) 表示单词 wi 在语料库中出现的次数,M 表示语料库中所有单词 tokens 的数量。

  • 对于 bigram 模型:

其中,C(wi−1,wi) 表示单词 wi−1 和单词 wi 前后相邻一起出现的次数。

  • 对于 n-gram 模型:

同理,我们计算 n-gram 出现的次数,除以 (n-1)-gram(即上下文)出现的次数。

序列的开头和结尾表示

在我们进入例子之前,我们需要用一些特殊的记号表示一个序列的开始和结束:

  • <s> 表示句子的开始
  • </s> 表示句子的结束

Trigram 例子

现在,让我们来看一个玩具例子,假设我们有一个只包含两个句子的语料库。

语料库

可以看到,每个句子开头有两个起始标记,因为我们采用的是 trigram 模型。

我们希望知道下面的句子在一个 trigram 模型下的概率是多少?

说明

  • 首先,我们对要计算的句子的概率按照 trigram 模型拆分成条件概率的连乘形式。
  • 然后,对于等式右边的每一个条件概率项,按照 trigram 模型中的条件概率计算公式,分别统计 “当前单词连同它的上下文” 以及 “单独的上下文部分” 在语料库中出现的次数,并将两者相除,得到该项的计算结果。
    例如,对于上面等式右边第一个条件概率项,我们考虑句子中第一个单词 “yes” 及其相邻的 bigram 上下文 “<s><s>”:

可以看到,子序列 “<s><s>yes” 在语料库中只出现过 1 次;而子序列 “<s><s>” 在语料库中一共出现了 2 次,所以第一个条件概率项的结果为 12。其余各条件概率项的计算方式同理,另外请注意,在计算第四个条件概率项时,bigram 上下文 “nono” 在语料库中一共出现了 5 次。

N-gram 语言模型的一些问题

  • 语言通常具有长距离效应 —— 需要设置较大的 n 值
    有些词对应的上下文可能出现在句子中距离该词很远的地方,这意味着如果我们采用固定长度的上下文(例如:trigram 模型) ,我们可能无法捕捉到足够的上下文相关信息。例如:The lecture/s that took place last week was/were on processing.在上面的句子中,假如我们要决定系动词 be 是应该用第三人称单数形式 was 还是复数形式 were,我们需要回头看句子开头的主语是 lecture 还是 lectures。可以看到,它们之间的距离比较远,如果我们采用 bigram 或者 trigram 模型,我们无法得到相关的上下文信息来告诉我们当前位置应该用 was 还是 were。这是所有有限上下文语言模型(finite context language models)的一个通病。
  • 计算出的结果的概率通常会非常小
    你会发现,一连串条件概率项连乘得到的结果往往会非常小,对于这个问题,我们可以采用取对数计算 log 概率来避免数值下溢(numerical underflow)。
  • 对于不存在于语料库中的词,无法计算其出现概率
    如果我们要计算概率的句子中包含了一些没有在语料库中出现过的单词(例如:人名),我们应该怎么办?
    一种比较简单的技巧是,我们可以用某种特殊符号(例如:<UNK>)来表示这些所谓的 OOV 单词(out-of-vocabulary,即不在词汇表中的单词),并且将语料库中一些非常低频的单词都替换为这种表示未知单词的特殊 token。
  • 出现在新的上下文(context)中的单词
    默认情况下,任何我们之前没有在语料库中见过的 n-gram 的计数都为 0,这将导致计算出的 整个句子的概率为 0。这个问题和前面的 OOV 单词的问题类似,我们的语料库中可能已经包含了这些单词,但是并没有包含该单词在新句子中对应的特定的 n-gram(即上下文信息)。这意味着该单词在新的句子中对应 n-gram 对于语言模型来说是全新的,而且因为 n-gram 的组合存在如此多的可能性,以至于语料库很难将所有的可能性都覆盖到。例如:假设我们构建了一个 five-gram 语言模型,我们的语料库中一共有 20000 个词汇,那么一共存在多少种可能的 five -gram 组合?答案是:200005。这是一个非常非常大的数字,以至于无论我们的训练语料库有多大,都不可能捕捉到所有的可能性组合。这是一个相当常见的问题,并且很重要。如果我们回顾一下链式法则,可以看到所有的条件概率都连乘在一起,所以只要其中某一项在计算子序列时 n-gram 的计数为 0,那么最终 计算出的整个句子的概率就会为 0。为此,我们需要对语言模型进行 平滑处理(smoothing)

平滑处理

  • 基本思想:给之前没有见过的事件赋予概率。
  • 必须附加一个约束条件:P(everything)=1
  • 有很多不同种类的平滑处理方法:
    • 拉普拉斯平滑(Laplacian smoothing,又称 Add-one smoothing,即 “加一” 平滑)
    • “加 k” 平滑(Add-k smoothing)
    • Jelinek-Mercer 插值(又称 线性插值平滑)
    • 卡茨回退法(Katz backoff)
    • 绝对折扣(Absolute discounting)
    • Kneser-Ney
    • ……

拉普拉斯平滑(“加一” 平滑)

简单思想:假装我们看到的每一个 n-gram 都比它们实际出现的次数多 1 次。

  • 这意味着即使是那些我们在语料库中没有见过的 n-gram,我们也将它们出现的次数记为 1 次。所以对于一个新句子中的任何东西都至少有 1 次计数。
  • 对于 unigram 模型(V= 词汇表):

在之前的模型中,我们只是简单的计算单词 wi 在语料库中出现的次数 C(wi) ,然后除以语料库中所有单词 tokens 的数量 M。

现在,对于分子而言,我们总是在它此前的基础上加上 1。然后,为了保证它仍然是一个合法的概率分布,即单词 wi 遍历词汇表中所有可能情况的的概率之和 ∑i=1|V|P(wi)=1,我们需要在此前分母 M 的基础上加上词汇表的长度 |V|(即语料库中所有单词 types 的总数)。

  • 对于 bigram 模型:

同样地,我们在之前分子的基础上加 1,在分母的基础上加 |V|。

所以现在,我们解决了之前新句子中的未知单词或者 n-gram 的计数为 0 从而导致最终计算出的概率为 0 的问题。

“加 k” 平滑

  • “加一” 往往太多了
    但是很多时候,加 1 会显得太多了,我们并不想每次都加 1,因为这会导致原本的罕见事件可能变得有点过于频繁了。并且我们丢弃了所观测的 n-gram 的太多有效计数。
  • 用 “加 k” 来代替 “加一”
    这种方式也被称为 Lidstone 平滑(Lidstone Smoothing)
  • 对于 trigram 模型,公式如下

可以看到,和 “加一” 平滑类似,只是我们将分子中的加 1 变成了加 k,并且为了满足单词 wi 遍历词汇表中所有可能情况的概率之和为 1,我们在分母中的 |V| 前面乘了一个系数 k。

  • 必须选择一个 k
    事实上,如何选择一个合适的 k 值对于模型影响非常大。k 在这里实际上是一个超参数,我们需要尝试对其进行调整以便找到一个使模型表现比较好的 k 值。

 Absolute Discounting 平滑

另外一种更好的方法是采用 绝对折扣平滑(Absolute Discounting)

  • 从每个 观测到的 n-gram 计数中 “借” 一个 固定的概率质量(a fixed probability mass) d。
  • 然后将其 重新分配(redistributes) 到 未知的 n-grams 上。

Backoff 平滑

基本上,我们会按照不断改进的顺序来介绍各种平滑处理方式的变体,由此,我们可以看到对于这些平滑方式的评估。现在,我们继续介绍另一种更好的平滑方式:Backoff 平滑

  • 在之前的 Absolute Discounting 平滑中,我们从观测到的每个 n-gram 计数中 “借来” 一个固定的概率质量,并将它们重新 平均 分配给所有的未知 n-grams。
  • Katz Backoff:概率质量的重新分配是基于一个 低阶(lower order) 模型(例如:unigram 模型)

例如,假设我们现在有一个 bigram 模型,当我们将概率质量重新分配到未知的 bi-grams 时,我们将基于上下文单词的 unigram 概率进行重新分配。因为比例很简单,如果我们看到上下文出现次数越多,我们就给它更高的权重。

对于一个 bigram 模型,它的 Katz Backoff 平滑的概率公式 如下:

我们为什么将这种方式称为 Backoff(回退) 呢?

因为我们在碰到未知的 n-grams 的时候会将原来的模型回退到一个更低阶的 (n-1)-gram 模型:对于一个 bigram 模型,我们在计算未知 bi-grams 的概率时将回退到 unigram 模型;而对于一个 trigram 模型,我们在计算未知 tri-grams 的时候将回退到 bigram 模型。所以,我们总是只回退一步。

 Kneser-Ney 平滑

现在,我们将介绍一种比 Katz Backoff 更好的平滑处理方式:Kneser-Ney 平滑

  • 概率质量分配基于当前单词 w 出现在 不同上下文 中的次数。
    对于概率质量重新分配的问题,相比 Katz Backoff 中只是简单地基于低阶模型,Kneser-Ney 平滑采用的方法是基于当前单词 w 在多少个 不同的上下文 中出现过,或者说是基于该单词的 多功能性(versatility)
    回忆前面 “glasses” 和 “Francisco” 的例子,其中 ,“Francisco” 是一个非常特殊的词,它的 versatility 非常低,因为它很可能只在上下文单词 “San” 后面出现过。因此,对于其他绝大多数的上下文单词,它们后面都不太可能出现 “Francisco” 这个词。而相比之下,“glasses” 这个词具有较高的 versatility,它可能在很多不同的上下文单词之后都出现过。
  • 这种度量被称为 多功能性(versatility) 或者 延续概率(continuation probability)

可以看到,对于观测到的 n-grams,Kneser-Ney 概率和 Katz Backoff 概率两者是相同的。而对于那些未知的 n-grams,Kneser-Ney 概率中从观测 n-grams 中 “借来” 的概率质量 α(wi−1) 与之前一样保持不变,而之前关于低阶模型 P(wi) 的部分则由我们所说的延续概率 Pcont(wi) 来替代。

在延续概率 Pcont(wi) 的计算公式中:分子部分计算的是一共有多少个 唯一 的上下文单词 wi−1 和当前单词 wi 共同出现过(co-occurrence);而分母部分就是将所有可能的单词 wi 对应的不同共现上下文单词数量(即分子部分)进行一个累加。

Interpolation

我们将介绍最后一种也是最好的一种平滑处理方式:插值(Interpolation)

  • 将不同阶数的 n-gram 模型结合起来 的更好的平滑方式。
    我们在前面提到过的 Katz Backoff 平滑:对于一个 trigram 模型,如果我们遇到了一些未知的 tri-grams,我们将回退到一个低阶模型。
    但是一种更好的做法是:将不同阶数的 n-gram 模型结合起来。
  • 逐步缩短的上下文的概率加权求和
    例如,对于一个 trigram 模型,我们计算未知 tri-grams 的平滑概率时会贯穿 trigram、bigram 和 unigram 三种阶数的模型。
  • 一个 trigram 模型下的 Interpolation 平滑概率


我们可以按照下面的步骤计算单词 wm 在上下文单词 “wm−2” 和 “wm−1” 之后出现的 Interpolation 平滑概率:

  • 首先计算 trigram 概率 P3∗,并将其乘以一个系数 λ3;
  • 然后计算 bigram 概率 P2∗,并将其乘以一个系数 λ2;
  • 然后计算 unigram 概率 P1∗,并将其乘以一个系数 λ1;
  • 最后,将三者相加得到最终结果。

并且,为了保证所得到的仍然是一个合法的概率分布,我们需要满足所有 λ 之和为 1。此外,这些 λ 的值甚至并不需要我们手动设置,而是由模型通过一些留存数据学习到的,因为我们想知道对于这些不同阶数的模型,什么样的 Interpolation 方式是最高效的。

 Interpolated Kneser-Ney 平滑

基于 Interpolation,我们得到了 Kneser-Ney 的最后一种版本:Interpolated Kneser-Ney 平滑

Interpolation 替代 back-off

这里,我们所做的唯一改变就是:将之前观测 n-grams 和未知 n-grams 两种情况加在一起,取代了之前的 back-off 操作。所以,相比之前二选一的情况,现在我们都合并在一个公式里。

另外,相比之前的固定概率质量 α(wi−1),这里我们替换为归一化常数 β(wi−1),以确保上下文 wi−1 对应的所有可能的 wi 的概率 PIKN(wi∣wi−1) 之和为 1。

这就是我们到目前为止介绍过的最有效的平滑方式,在实际应用中有很多 n-gram 语言模型都是基于 Interpolated Kneser-Ney 平滑实现的。

实践应用

  • 在实践中,我们通常采用 Kneser-Ney 语言模型并将 5-grams 作为最高阶数。
  • 对于每个 n-gram 阶数都有不同的 discount 值。
  • 当我们试图学习如何在它们之间进行 Interpolation 时,我们将从数据中学习。

生成语言

在最后一部分中,我们将介绍如何利用语言模型来 生成语言(Generating Language)

我们这里讨论的是利用语言模型生成语言的一种通用的方法,并不仅仅局限于 n-gram 语言模型。

但是我们还是会以 n-gram 语言模型作为例子:

  • 给定一个初始单词,从语言模型定义的概率分布中抽取一个词作为下一个出现的单词。
  • 在我们的 n-gram 语言模型中包含 (n−1) 个起始 tokens,用于提供生成第一个单词所需的上下文。
    • 永远不会生成起始标记 <s>,它只作为初始单词的生成条件
    • 生成 </s> 来结束一个序列

例子:Bigram 语言模型

  •  Sentence =<s>
  •  P(?∣<s>)=“a”

这里是一个很简单的例子,我们有一个 bigram 语言模型。现在有一个空句子,即只包含一个起始标记 <s>。我们试图预测在给定一个起始标记 <s> 的条件下,下一个最有可能出现的单词是什么。所以,我们会利用 bigram 语言模型来逐个检查词汇表中每个单词 w 的条件概率 P(w∣<s>),并选择其中概率最大的那个单词作为我们的预测结果。这里,我们可以看到单词 “a” 出现在一个句子开头的概率最大,我们将它添加到句子中。

  •  Sentence =<s> a
  •  P(?∣a)=“cow”

现在我们的句子有了第一个单词 “a”,我们想知道下一个最有可能出现的单词是什么。还是和之前一样,我们逐一检查词汇表中各个词在给定上下文单词 “a” 的情况下,哪个词对应的条件概率最大。可以看到,这里单词 “cow” 出现在单词 “a” 之后的概率最大,所以我们将它添加到句子中。

  •  Sentence =<s> a cow
  •  P(?∣cow)=“eats”

重复上面的步骤,我们得到了下一个最有可能的单词 “eats” 并将它添加到句子中。

  •  Sentence =<s> a cow eats
  •  P(?∣eats)=“grass”

继续,我们得到单词 “grass” 并将它添加到句子中。

  •  Sentence =<s> a cow eats grass
  •  P(?∣grass)=“</s>”

最终,我们预测单词 “grass” 后面最有可能出现的是结束标记 “</s>”,我们将它添加到句子中。

  •  Sentence =<s> a cow eats grass </s>
  • 完成

现在我们得到了一个由这个 bigram 语言模型生成的句子:a cow eats grass

如何选择下一个单词

  • Argmax:在每一轮中选择与上下文共现概率最高的那个单词。
    • 贪婪搜索(Greedy search )
      这其实是一种贪婪搜索策略,因为即使在每一步中我们都选择概率最高的那个单词,也无法保证最终生成的句子具有最优的概率。
  • Beam search decoding
    一种更好的方法是 Beam search decoding,它在机器翻译中应用非常广泛。
    • 在每轮中,我们跟踪概率最高的前 N 个单词
    • 我们总是检查这几个候选单词给出的完整句子的概率
    • 这种方法可以生成具有 近似最优(near-optimal) 概率的句子
  • 从分布中随机抽样
    另一种方法是从语言模型给出的概率分布中随机抽样,例如:temperature sampling

评估语言模型

如何评估一个语言模型的质量?

评估

语言模型的评估通常有两种范式:

  • 外部的(Extrinsic)
    这种评估范式常见于下游应用中,我们根据其反馈来评估语言模型的表现。比如对于机器翻译中的某些任务,我们可以比较不同语言模型在完成该任务上的表现。
    • 例如:拼写纠错、机器翻译
  • 内部的(Intrinsic)
    在这种评估范式下,我们不依赖任何下游应用,而是观察我们的语言模型在保留测试集上的 Perplexity
    • 在保留测试集(held-out test set)上的 Perplexity
    • Perplexity(困惑) 衡量的是我们对于模型在测试数据上给出的预测的置信度。置信度越高,对应的 Perplexity 就越低,代表我们的模型越好。

 Perplexity

  • 整个测试集的逆概率(Inverse probability)
    • 通过单词 tokens(包括结束标记 </s>)的数量实现归一化(Normalization)
  • 假设我们保留的测试集语料库是一个由 m 个单词 w1,w2,…,wm 组成的序列,我们用 PP 表示 Perplexity。从下面的公式可以看到,它是通过对整个测试集的概率 P(w1,w2,…,wm) 取倒数,然后再开 m 次方得到的:
  • 如果我们遇到未知单词(OOV),我们通常是直接忽略掉,因为我们没有办法表示它们。
  • Perplexity 越低,模型表现越好。
    假如我们模型的 Perplexity 只有 1,那么这是最好的情况。因为当我们的测试集语料库上的概率 P(w1,w2,…,wm)=1 时,PP(w1,w2,…,wm)=1。而对于一个非常差的语言模型,可能在测试集上的概率 P(w1,w2,…,wm)=0,此时模型的 Perplexity 将趋近 ∞。所以,最理想的情况是 Perplexity 等于 1,当然,我们永远不可能达到这个值。

总结

  • N-gram 模型在捕捉语言的可预测性方面是一种简单且高效的方法。
    模型的构建很容易:我们只需要一个大的语料库,并且对单词和上下文进行计数即可。
  • 信息可以通过无监督的方式推导得出,可以扩展到大型语料库。
  • 由于稀疏性的存在,需要进行平滑处理才能保证有效性。
    我们需要一些工程上的技巧处理稀疏性问题,例如:smoothing、back-off、interpolation 等。

虽然 n-gram 模型非常简单,但是它在实践中的效果非常好。所以,在构建语言模型时,我们通常会选择将 n-gram 模型作为 baseline,尽管目前有很多模型都采用了深度学习。

思考

思考: Interpolation、Interpolated Kneser-Ney 和 Kneser-Ney 之间有什么区别?我们应当如何判断应该采用哪种方法?

首先,我们应该明确一点:Interpolated(插值)、Smoothing(平滑)和 Backoff(回退)都是用来解决数据稀疏问题(sparsity)的方法。我们在这节课中讨论的前 3 种平滑方法(拉普拉斯、“加 k” 和 Lidstone)都是在 和原先的 N-gram 模型相同的阶数 内重新分配概率,将概率质量从常见情况向罕见情况进行偏移。

Interpolation 和 Backoff 都是通过 结合不同阶数的 N-gram 模型 来解决这个问题。对于 Backoff 而言,如果高阶 higher-gram 的计数为 0,那么它将完全落回低阶 lower-gram;而 Interpolation 则是通过将我们所有的 N-gram 模型加权求和来将它们结合起来。

现在,当我们采用低阶模型时又会带来一个新的问题。例如,对于单词 “Old” 和 “Zealand”,很可能它们的 bi-gram “Old Zealand” 计数为 0,所以我们需要依赖 unigram 模型提供的概率。想象一下,如果单词 “Zealand” 具有一个非常高的 unigram 概率,那么对于这两个词的 bi-gram,我们还是可以得到一个相对较高的共现概率,而这不是我们希望看到的。

Kneser-Ney Smoothing 中引入了所谓 延续计数(continuation count) 的概念。因为在大多数情况下,单词 “Zealand” 只出现在上下文单词 “New” 的后面,所以对于单词 “Zealand” 出现在上下文单词 “Old” 后面这种情况(即 bi-gram “Old Zealand”)的延续计数会非常低。到这里,我们通过 在不同上下文中的频率计数 解决了上述例子中的问题。

回到原问题中提到的哪种方法更好,我们可以在 Backoff 或者 Interpolation 二者中选择一种来使用 Kneser-Ney Smoothing。通常来说,Interpolation 可能更合适,因为这种方式更灵活(因为我们考虑了所有阶数的 N-gram 模型)。

ASR语音识别—Fst热词模型

有限加权【热词】状态转换机(Weighted Finite State Transducers, WFST)

最近在做ASR语音识别任务,基于阿里FunASR框架,特此记录下跟热词模型相关知识。

wfst热词增强

热词构图,我们采用AC自动机结构进行热词网络构图,解决热词前缀重叠场景下难以有效激励的问题。例如热词列表包含“阳光保险”与“保定”两个热词,实际语音内容为“阳光保定”,在匹配到“定”时匹配失败则会根据AC自动机回退机制回退至“保定”热词路径,确保仍可继续匹配的最大子串路径可正常激励。

如下是热词网络实例图。

热词发现与匹配我们采用对主解码网络弧上ilabel音素/字符序列信息进行热词发现及匹配,而非在网络搜索出词时再对整词匹配,该方式优势是能够更早实现对尚未出词热词路径激励,避免热词路径被过早误裁减,其次也可避免由于热词分词结构不一致而导致匹配失败。

热词激励方式,我们采用过程渐进激励和整词激励相结合的方式,而非热词首字或尾字激励。采用仅首字激励方式可能存在部分case在热词后续字的解码过程中路径仍被裁剪掉的情况,而仅在尾字出词时施加激励则可能激励过晚。

过程渐进激励(incremental bias)对过程中每匹配成功一步即进行等量激励,如在后续扩展过程匹配失败则通过回退弧跳转进行激励减除。

整词激励(word bias)支持用户针对不同的热词做差异化的激励分配置,在热词整词出词时进一步施加对应的补偿或惩罚,进而提高热词综合效果。

FST热词是一种基于 有限状态转换器(Finite State Transducer)的关键词识别技术,它具有较高的准确率和实时性,适用于对大量文本进行快速匹配的场景。 但是,FST热词需要提前构建好词典和规则库,且不支持多语种和变体。

FST目前在语音识别和自然语言搜索、处理等方向被广泛应用。例如,在自然语言处理中,经常会遇到一些针对某些内容法则做出修改的操作,比如:如果c的后面紧接x的话,则把c变为b,FST则是基于这些规则上的数学操作,来把若干个规则整合成一个单程的大型规则,以有效提高基于规则的系统(rule-based system)的效率。其功能类似于字典的功能,但其查找是O(1)的,仅仅等于所查找的key长度。目前Lucene4.0在查找Term时就用到了该算法来确定此Term在字典中的位置。FST 可以表示成FST<Key, Value>的形式,我们可以用O(length(key))的复杂度,找到key所对应的值。除此之外,FST 还支持用Value来查找key以及查找Value最优的key等功能。在查找最优的Value时,会用到求最短路径的Dijikstra算法,但建图过程与此无关。

FST是一种用于映射输入符号序列到输出符号序列的有向图结构。它由一组状态组成,状态之间通过带有权重的转换(transitions)相连。每个转换关联输入符号、输出符号和权重(或代价),用于表示从一个状态转移到另一个状态时的条件。

FST与热词的结合

  • 提高权重或优先级FST可以通过增加热词的优先级或降低其识别权重,使得在解码过程中,热词的路径更容易被选择。
  • 热词优先通路:可以通过引入热词的专有路径(transition paths),使得这些词比其他普通词汇更容易通过FST的状态转换。
  • 增强精度通过调整FST中热词的权重或映射路径,系统在遇到热词时会优先选择包含热词的路径,从而提高识别或转换的准确率。

实现方法

  • 构建基础FST: 首先,需要基于词典或语言模型构建一个基础FST。这个FST将输入符号(如字母、音素或单词)映射到输出符号。在语音识别中,FST通常将输入的音素序列映射为单词。
  • 加入热词权重
    • 修改权重对热词的转换路径赋予更低的权重,降低其状态转换代价,使得解码器(decoder)在搜索时更倾向于选择这些路径。例如,使用一个加权的FST,可以将普通词的转换权重设为较大值,而将热词的权重设为较小值。
    • 插入额外路径将热词的路径单独插入到FST中,创建直接通路,以便系统在解码过程中直接选择这些热词而不需要复杂的转移。
  • 组合语言模型和热词FST在实际应用中,通常会将热词FST与其他语言模型(如N-gram或神经网络语言模型)结合起来。例如:
    • 使用热词FST作为一个小型的子图插入到更大规模的语言模型FST中。
    • 热词FST可以作为一个前端过滤器,预处理输入序列以优先选择热词的路径。
  • 动态插入热词: 热词列表可能会根据应用场景动态变化。例如,在语音助手中,用户可能会要求系统识别特定的品牌名称。在这种情况下,FST需要支持动态更新,即在运行时动态插入或删除热词路径。这可以通过以下几种方式实现:
    • On-the-fly 插入:根据实时需求,将新的热词添加到现有FST结构中,可能使用备用状态机或其他支持增量更新的FST实现。
    • 重构FST:当热词发生较大变化时,重新构建FST,以反映新的热词权重。

Seed-ASR基于大型语言模型(LLM)的语音识别模型

https://arxiv.org/abs/2407.04675

https://bytedancespeech.github.io/seedasr_tech_report/

字节推出Seed-ASR,支持复杂场景、语种、多方言超精准识别

Seed-ASR是一种基于大型语言模型(LLM)的语音识别模型。Seed-ASR是在音频条件大语言模型(AcLLM)框架上开发的,利用了大型语言模型的强大能力,将连续的语音表示和上下文信息输入到语言模型中。通过分阶段的大规模训练以及语言模型中上下文感知能力的引入,Seed-ASR 在综合评估集上(涵盖多个领域、口音/方言和语言)比传统的端到端模型有了显著提升。

摘要

ASR模型需要在各种应用场景中准确地转录给定特定上下文信息的各种语音信号(来自不同领域、语言、口音等)。融合了额外语言模型的经典端到端模型表现良好,但主要应用在数据匹配场景中,并且逐渐接近瓶颈。Seed-ASR基于大语言模型(LLM)的语音识别模型。Seed-ASR是基于audio conditioned LLM(AcLLM)的框架开发的,通过将连续语音表示与上下文信息一起输入到LLM中来利用LLMs的功能。 通过阶段式大规模训练和LLM中的上下文感知能力的启发,Seed-ASR在综合评估集(包括多个域,口音/方言和语言)上展示了端到端模型的显着改进。此外,Seed-ASR可以进一步部署,以支持各种场景中的特定需求,而无需额外的语言模型。与最近发布的大型ASR模型相比,Seed-ASR在中文和英文公共测试集上的单词(对于中文字符)错误率降低了10%-40%,进一步证明了其强大的性能。

Introduction

Seed-ASR,一个基于LLM的大规模ASR模型。为了成为一个“更智能”的语音识别模型,通过将连续语音表示与指令和上下文信息一起输入到LLM中,利用LLMs的能力。Seed-ASR具有五大特点:

Seed-ASR 具有高识别率、大模型容量、多语言支持、上下文感知和分阶段训练五大特点。通过2000万小时语音和90万小时ASR数据训练,Seed-ASR(CN)和Seed-ASR(ML)在多个数据集上表现优异。其采用了包含20亿参数的音频编码器和数百亿参数的MoE大语言模型,支持普通话、13种方言以及多种语言,并计划扩展至40多种语言。通过整合包括历史对话、视频编辑历史和会议参与详细信息,来捕获与语音内容相关的重要指标。这种集成大大提高了各种场景中ASR评估集中的关键词召回率。【关键字召回率可以定义为 ASR 系统成功识别出的关键字的数量占所有实际出现的关键字数量的比例】,增强了多场景下的表现。Seed-ASR的开发经历了一个简单而有效的训练方案:音频编码器的自监督学习(SSL) → 监督微调(SFT) → 上下文SFT → 强化学习(RL)。每个阶段都有不同的作用,确保Seed-ASR的性能逐步提高。

数据集测评:

我们建立了一个高质量评估集的系列,包括广泛的语音输入,作为不同的主题,口音/方言,语言和语音持续时间。这些集合还包括一个ASR系统在不同应用场景下的定制能力评估例如,对话场景下的关键词识别准确性和一致性)。在Seed-ASR设计中,我们选择了大规模训练的路径,利用了大模型容量和扩展训练数据以增强泛化性。 我们考虑到提供给 AcLLM 框架的上下文,通过训练模型以来详细说明其定制化能力,从而形成一个适用于不同场景的统一且紧凑的模型结构。在我们的多维评估集上,与经典的端到端模型相比,Seed-ASR展示了更全面、更强大的模型能力。Seed-ASR的性能优势在公共测试集和我们的主观理解评估中得到了进一步证明。

Motivation

ASR模型的升级可以从LLM的技术进步中得到启发,主要可以归结为三个方面:

·统一模型框架。LLM采用基于下一个令牌预测的仅解码器框架。它对输入输出文本进行排序,依靠自注意机制建立序列中标记之间的依赖关系,从而统一文本理解和文本生成;

·缩放定律的力量。大规模模型参数为LLM提供了从不同数据源学习知识的关键能力。例如,从GPT-2 到GPT-3 ,参数数量从15亿增加到1750亿,使GPT-3表现出更好的泛化和涌现能力。

·全面的训练pipline,ChatGPT经历三个阶段:预训练,监督微调(SFT)和带有人类反馈的强化学习(RLHF)。在预训练阶段,LLM是在大量的文本数据上训练的,这使得它存储了大量的知识。在SFT阶段,LLM进一步针对更高质量的面向任务的数据进行微调,增强其根据上下文进行推理和理解任务指令的能力。最后,在RLHF阶段,训练目标转变为在强化学习的帮助下使LLM的行为与人类偏好保持一致;

由于ASR的任务是将语音转换为文本,因此其文本生成过程与LLMs一致。存储在LLMs中的广泛的文本知识和上下文推理能力使它们成为向ASR提供语义指导的潜在成分。剩下的核心挑战是如何使LLMs更好地“理解”语音,这是一种不同于文本的模态。

方法

Framework and Training Recipe

基于上述动机,我们提出了Seed-ASR,一个大规模的语音识别模型建立在音频条件LLM(AcLLM)的框架。通过将编码的连续语音表示与任务指令和相关上下文一起输入到预先训练的LLM中,Seed-ASR可以利用LLM的丰富文本知识和推理能力来生成语音的相应文本转录。总体框架如图2所示。

音频是与文本不同的模态。为了使LLMs更好地理解不同的语音输入,我们在LLMs中采用了大规模预训练的概念。具体来说,我们构建了一个具有近20亿个参数的音频编码器,并对数千万小时的数据进行了自监督学习(SSL)。预训练的音频编码器获得了强大的语音表示能力,这有助于在监督微调(SFT)期间快速收敛。在大规模SSL阶段之后,我们在AcLLM框架内实现了一个简单有效的阶段式训练方法(如图3所示)。在SFT阶段,我们通过对大量的语音-文本对进行训练,建立语音和文本之间的映射关系。在上下文SFT阶段,我们使用相对少量的上下文-语音-文本三元组来引出LLM从上下文中捕获语音相关线索的能力。 这些三重数据可以根据具体场景进行定制。在强化学习阶段,我们应用MWER的训练标准[传统Attention-based Sequence-to-Sequence model使用cross-entropy作为损失函数,不是直接对WER指标进行优化,而真正的目标是直接或间接地最小化WER => MWER Training]和一些改进来进一步加强我们模型的能力。在下面的小节中,我们将更详细地介绍这些方法。

语音编码器的自监督预训练

大规模SSL使音频编码器能够从语音中捕获丰富的信息。受基于BERT的语音SSL框架的启发,我们开发了我们的音频编码器,这是一种conformer-based的模型[Conformer 是 Google 在 2020 年提出的语音识别模型,主要结合了 CNN 和 Transformer 的优点,其中 CNN 能高效获取局部特征,而 Transformer 在提取长序列依赖的时候更有效。 Conformer 则是将卷积应用于 Transformer 的 Encoder 层,用卷积加强Transformer 在 ASR 领域的效果。],可以捕获存储在音频信号中的全局和局部结构。在这项工作中,我们主要关注语音信号。由于它是在大规模无监督数据上训练的,因此我们将训练后的音频编码器称为LUISE,它代表L规模无监督迭代SpeechEncoder

LUISE秉承BERT的概念,采用掩蔽语言预测的学习范式。训练过程如图4所示。具体地,首先将从波形提取的梅尔滤波器组特征的序列输入到 tokenizer模块以获得每个帧的离散标签。然后,使用交叉熵准则进行LUISE的训练,仅针对被掩蔽的帧计算损失函数。训练后,softmax层被移除,LUISE的编码器部分用于后续的监督微调。

我们利用一个迭代的固定 tokenizer的方法来获得相应的离散标签的每一帧。在第一次迭代中,我们应用随机projection层将语音特征投影到随机初始化的码本中,并通过找到码本中最近的向量将它们映射到离散标签。在第二次迭代中,我们对先前训练的编码器的中间层的表示执行K均值聚类以获得新的码本。然后通过在新码本中找到与来自相同中间层的表示最接近的向量来获得离散标签。在中间层的选择过程中,我们冻结了第一次迭代中训练的编码器参数,并为每个中间层添加了映射层和连接主义时间分类(CTC)损失,以进行监督微调。 图5显示了通过对每个中间层的表示进行监督微调获得的字错误率(WER)。对于具有20亿个参数的LUISE,第25层(32层中)的输出展示了最佳的语义表示,并用于在后续迭代中生成离散标签。

有监督微调SFT

经过对大规模纯语音数据的训练,LUISE已经开发出强大的语音表示能力。它以40ms/帧速率输出包含丰富语音和语义信息的连续表示。为了使AcLLM更好地理解语音中相应的文本内容,我们需要将编码表示的语义信息映射到LLM的语义空间中。LLM为了实现这一点,我们使用以下两种方法:

  1. 在模型结构中,我们引入了一个转换器模块来连接我们的音频编码器(LUISE)和LLM(如图2所示)。转换器包括下采样模块和线性投影层。我们发现不同的下采样方法同样有效,因此我们使用最简洁的方法:帧拼接。具体来说,我们在特征维度上拼接4个连续的语音表示帧,然后输入到线性层中。因此,输入到LLM中的语音表示帧率为160毫秒;
  2. 在训练方法上,我们采用“可学习音频编码器+可学习转换器+固定LLM“的策略,在保持LLM参数不变的情况下,最大限度地保留了LLM丰富的语义知识和推理能力。可学习的音频编码器和转换器参数确保语音表示中包含的语义信息与LLM的语义空间对齐。LLM在训练过程中,使用交叉熵损失函数,只有生成转录文本的标记位置参与交叉熵计算;

上下文SFT

在大规模语音-文本对数据上进行训练后,我们的SFT模型在覆盖多个领域的测试集上表现出色。然而,SFT模型的训练方式决定了它缺乏在给定上下文信息(上下文)的情况下识别模糊语音内容的能力这些问题在涉及口音(语音歧义)和同音异义词或稀有词(语义歧义)的情况下更加明显。因此,我们引入了上下文感知训练和联合波束搜索的方法,以增强模型有效利用上下文的能力(图6中给出了一个示例)。

  • 上下文感知训练:首先,我们使用我们的内部大型语言模型来生成与语音转录相关的上下文。在我们的实验中,它比使用长段语音中的开头和结尾的转录文本作为上下文表现得更好。使用生成的自然语言上下文还可以提供更完整的语义,从而除了从上下文复制相关转录内容之外还能够学习推理。然后,我们构建了一个<context,speech,text>三元组的数据集,并将其与一定比例的一般ASR数据(语音-文本对数据)混合用于上下文感知训练。如图2所示,在上下文感知训练期间,我们将上下文和语音表示输入到LLM中。LLM这种训练的目标是增强模型从上下文中捕获语音内容相关线索的能力。
  • 联合波束搜索:我们发现,直接使用本地波束搜索存在严重的幻觉问题。为了解决这个问题,我们提出了一种联合波束搜索的解码策略来缓解这个问题。具体地,我们使用联合波束搜索来找到最佳得分 Pjoint⁢(𝒚|𝒙,𝒄) ,其中 𝒚 表示预测的假设, 𝒙 是语音信息,并且 𝒄 是给定的上下文信息。超参数 α 用于在解码期间平衡语音信息和上下文信息的重要性:

同时,我们引入了一种修剪策略,首先使用上下文无关的得分 P⁢(𝒚|𝒙) 过滤出声学上不可信的候选令牌,然后对剩余的候选令牌应用联合波束搜索。修剪策略在缓解幻觉中起着重要作用。

强化学习

由于SFT和上下文SFT阶段中的训练基于交叉熵目标函数,因此与推断期间使用的评估度量(例如WER)不匹配。随着强化学习(RL)的发展,它可以在序列建模任务中学习相对最优的决策策略。因此,我们通过构建基于ASR度量的奖励函数来引入RL阶段。

单词错误率(WER)通常被认为是评估ASR模型性能的核心指标,但句子中的某些内容(例如关键字)在理解整个句子中起着更关键的作用。因此,我们还引入加权WER(WWER)作为额外的奖励函数,强调关键字错误的重要性具体来说,我们应用最小字错误率(MWER)作为另一个训练目标,在我们的RL阶段中使用交叉熵目标 ℒCE 进行插值:

    在传统的 MLE 训练中,损失函数通常是基于每个时间步的交叉熵损失。这意味着模型优化的目标是每个时间步的预测概率分布,这可能导致最终的序列输出与实际参考输出在词级别上不匹配。MWER 训练则直接优化序列的 WER,这是更接近于最终应用的评价标准,尤其是在语音识别和自然语言处理任务中。

MWER 训练的实现方法:
候选序列生成:在 MWER 训练过程中,模型会先使用其当前参数生成多个候选的输出序列(通常使用采样或束搜索策略)。这些候选序列代表了模型对给定输入的不同潜在输出。

损失计算:计算每个候选序列的词错误率(WER),然后通过比较这些候选序列与参考序列之间的WER来评估损失。具体来说,损失函数会惩罚那些与参考序列WER较高的候选序列,同时奖励那些WER较低的候选序列。

最小化损失:使用反向传播算法更新模型参数,以最小化平均 WER 损失。由于损失函数直接反映了序列级别的错误率,这种方法能够更有效地训练模型来生成更准确的输出。

为了提高强化学习的训练效率,我们部署了一个远程服务来生成假设,并在更新当前服务器上的模型参数的同时计算MWER损失。在强化学习训练过程中:1)我们使用前一阶段训练的上下文SFT模型初始化模型参数; 2)我们利用高质量的数据进行强化学习训练,数据规模为数千小时。3)为了保持初始化模型的上下文感知能力,我们的训练数据还包括一定比例的上下文、语音、文本三元组。在完成RL训练之后,我们获得了我们的Seed-ASR模型。

表1:RL阶段的消融研究。作为奖励函数的加权WER在所有三个评估集上显示出比WER更好的性能(这些集的详细信息在第4.1节中介绍)。在强化学习阶段使用的上下文、语音、文本三元组的训练数据保证了上下文感知能力的不下降。Seed-ASR使用最后一行中的策略。WER或加权WER的度量计算中文、日文和韩文的字符错误,以及英文和其他语言的单词错误。

Observations

在改进Seed-ASR性能的过程中,我们也得到了一些观察:

Scaling Law

在LLM领域,可以观察到,较大的模型可以通过在更多数据上进行训练来不断降低损失值。据我们所知,在基于LLM的框架下,没有关于音频编码器的缩放律的相关研究。在SSL阶段,我们进行实验,以探讨不同的模型大小的LUISE的性能。具体来说,我们选择了五组型号尺寸:75 M、0.2B、0.6B、2B和5B。训练数据包括770万小时的无监督语音数据,覆盖多个领域,确保模型容量的充分利用。不同大小的模型在大多数训练配置中保持一致性,只是随着模型大小的增加,我们会按比例扩大模型的宽度和深度,适当增加批量大小和权重衰减,并降低学习率。

图7:(a)描绘了我们的音频编码器(LUISE)的预训练损失与模型参数大小的以2为底的对数之间的相关性。(b)描述了SFT之后的贪婪WER与模型参数大小的以2为底的对数之间的相关性。(c)描述了SFT之后的贪婪WER与LUISE的预训练损失之间的相关性。

我们首先关注验证集上的交叉熵预训练损失值与模型大小之间的相关性。如图7所示,我们观察到两者之间几乎呈线性相关。此外,我们比较了基于训练的LUISE的小规模SFT数据训练后的性能。使用贪婪搜索进行推理。如图7所示,多域评估集上的WER度量也与LUISE的模型大小呈现出近乎线性的相关性。此外,这揭示了SFT之后测试集上的WER度量与图7中SSL阶段中的损失函数值之间的正相关性。这些关于缩放律的发现为我们的编码器选择(考虑性能和效率的平衡)和后续优化提供了指导。

Long-form Ability

我们的Seed-ASR是在AcLLM的框架下建模的,它自然地利用LLM的语义知识和长上下文建模能力。因此,我们还探索了直接将整个长格式语音输入LLM进行识别的选项。该方法有效地避免了与对多个独立推断的长形式语音进行分割相关联的两个问题:1)分割过程可能导致边界处的信息丢失,从而降低识别准确性; 2)分割过程破坏了长形式语音中的强全局上下文信息,从而影响识别的准确性和一致性。

具体来说,我们构建了一系列长格式视频测试集,包括来自不同来源的5个数据集。在训练过程中,整个长格式数据被输入到模型中,而没有任何分割处理。测试集的持续时间分布与训练集的持续时间分布相当。如表2所示,使用长形式数据进行训练和测试,与短形式训练相比,相对WER降低了近8.8%,短形式训练采用域自适应VAD将长形式语音分割成几个部分进行训练和测试。长格式视频测试集的最大持续时间为5分钟,并具有显著长度延长的调度器。

模型与评价

目前,我们专注于在多样化场景下全面提升中文和多语种(不含中文)语音识别性能。因此,我们提出了两个具有相同模型结构和训练配方的Seed-ASR模型:汉语多方言模型,称为Seed-ASR(CN),和多语言模型,称为Seed-ASR(ML)。虽然我们也有同时支持中文和多语言的模型,但本报告将特别详细介绍两种分别专注于中文和多语言(不包括中文)的Seed-ASR模型。

Seed-ASR(CN)不仅可以用单个模型对普通话和13种汉语方言进行转录,而且在多领域、多方言、多口音和公共集等多维评估集上,与其他已发布的大型模型相比,性能有了显著的提高。此外,在上下文SFT阶段的训练赋予种子ASR(CN)有效的上下文感知能力,如在对话上下文评估集上所示。同样,Seed-ASR(ML)在8种多语言公共集(包括英语)和多领域评估集上取得了与其他已发布模型相比具有竞争力的结果,并且正在扩展到40多种语言。在下面的部分中,字错误率(WER)的度量被用作主要的客观度量。除非另有说明,否则WER的度量计算中文、日语、韩语的字符错误,并计算英语和其他语言的单词错误。

Seed-ASR (CN)

Seed-ASR(CN)遵循图3所示的完整训练管道。在SSL阶段,我们使用了具有近2B参数的LUISE编码器,并对来自各个领域的近800万小时的普通话和汉语方言语音数据进行了训练。在SFT阶段,我们使用经过训练的LUISE和具有超过百亿个参数的LLM进行模型初始化。训练数据包括包含多个域的普通话数据和方言数据的混合。SSL和SFT阶段的详细数据分布见附录A.3。在上下文SFT阶段,我们使用一定比例的SFT阶段数据与一些上下文、语音、文本三元数据混合进行训练。在RL阶段,我们使用训练好的上下文SFT模型进行初始化,并构建高质量的训练数据进行训练。在这个全面的训练过程之后,我们获得了Seed-ASR(CN)

为了全面评估Seed-ASR(CN)模型的ASR能力,我们在公开数据集上将其与其他已发布的模型进行了比较,并构建了一系列评估集,包括多领域集、多源视频集、硬案例集、多方言集、多口音集、上下文感知集和主观可懂度评估。

最后的结果是上述6个测试集的WER(中文字符)的平均值。我们用于比较的基线包括Paraformer-Large、Qwen-Audio和最近发布的基于LLM的ASR模型,其结构为Hubert+ Baichuan 2。他们的研究结果来自他们各自的论文。如表3所示。Seed-ASR(CN)表现出比其他模型更显著的性能优势,在这些公共数据集上获得了最先进的结果。对于6套的平均WER,Seed-ASR(CN)比其他已发布模型实现了超过24%-40%的WER降低。

对多域多源视频集的评估:

我们还对多领域评估集进行了全面的性能比较,该评估集包含来自视频,直播,语音搜索,会议,智能助手等各种场景的高质量评估数据,并将多领域集合中总共7个集合的加权平均WER作为最终指标。我们选择基于传感器的端到端模型[20],其具有MoE编码器和超过300 M的参数作为基线之一。此外,我们还在多域评估集上运行Paraformer-large(离线解码)的结果作为另一个基线。从表4中的结果来看,Seed-ASR(CN)显示出显著的性能优势,与我们强大的端到端模型相比,WER指标相对降低了47%以上。在覆盖7个不同子集的视频评估集上,Seed-ASR(CN)也获得了相当大的性能改善。 这些结果证明了Seed-ASR(CN)强大的基础能力。

此外,我们通过引入10个硬案例测试集来评估高级ASR能力,这些测试集覆盖了包括书名、汽车名称、成语、药品名称、电影名称、古诗、产品名称、音乐名称等在内的话语。这些测试集旨在评估模型识别包含专有名词的语音内容的能力,这些专有名词具有很强的专业性和领域特异性,反映了ASR模型的知识储备和识别准确率。硬案例集的评估指标是每个句子中给定关键字的F1分数。如表4所示,与端到端模型基线相比,Seed-ASR(CN)模型实现了F1值3. 3%的绝对增长,证明了AcLLM模型框架在利用LLM常识知识和语义推理能力方面的有效性。

多方言集和多口音集的评估:

由于我们的Seed-ASR(CN)模型支持普通话和13种汉语方言的识别,我们还引入了方言评估集。这套共包括13种方言(广东话、西南话、吴语、吉鲁话、中原话、闽语等)。并使用汉字的相同或相似发音对文本进行人工标注。我们的方言评估集的具体演示可在我们的网站2上获得。我们使用WER作为这个方言评估集的客观度量。

我们使用微调的Whisper Medium-v2,769 M参数作为我们的基线。为了进行公平的比较,我们使用相同的方言训练集训练Whisper Medium-v2和Seed-ASR(CN)。Seed-ASR(CN)需要在保持普通话综合能力的同时提高方言上的ASR性能,因此它使用来自多个领域的更大比例的普通话数据进行训练。相比之下,Whisper Medium-v2在多域集等综合评估集上显示出较差的结果。尽管如此,具有更大建模能力的Seed-ASR(CN)模型在13种方言集上仍然显示出优于基线的性能优势,13种方言的平均WER从21.68下降到19.2(相对WER降低11.4%),并且在单个方言测试集上相对WER降低超过21%。

为了进一步验证Seed-ASR(CN)对不同语音的识别性能,我们引入了一系列口音评估集,包括来自安徽、福建、甘肃、广东、贵州、湖南、江西、辽宁、陕西、山西和云南的11个中国口音。具体的口音语音样本也可在我们的网站2.如表6所示,与从头开始训练的强E2 E模型相比,Seed-ASR(CN)在口音测试集上表现出显着的改进。我们还通过在训练过程中移除重音SFT数据来进行消融研究,但Seed-ASR(CN)仍然在重音集上实现了强大的性能。在多方言、多口音评价集上的实验结果表明,该算法对不同地区的汉语语音识别具有较强的鲁棒性。

对对话上下文集的评估:

在语境感知的评估中,我们构建了一个高质量的对话语境集,其中对话历史被用作语境信息。如图8所示,我们提供了两个对话示例。每个测试用例包括对应的对话历史文本和当前识别的语音内容。我们将对话语境评估分为严格和宽松两个子集。严格子集包含对历史对话有很强依赖性的样本,以准确识别语音内容,例如人名。松散子集的历史对话和演讲内容之间的依赖性较弱,如专有名词。我们使用关键字召回作为评估指标。

总结:

在包括SFT → context SFT → RL的逐步训练配方之后,我们的Seed-ASR(CN)模型产生了。在上述综合评估集上,我们观察到我们的Seed-ASR(CN)模型的某些能力在不同的训练阶段得到了增强。在这里,我们对每个阶段的效果进行了详细的消融研究,结果如表9所示。首先,RL阶段的引入带来了对大多数评估集的改进,例如多域,多源视频,多方言,硬案例和代码切换。重音测试集中的轻微降级可能是由于训练数据比率。此外,上下文SFT阶段的训练对大多数测试集产生了积极的影响,特别是在上下文严格测试集上的召回度量方面带来了显着的改善。这进一步证明了我们的上下文感知训练和解码策略在上下文SFT阶段的有效性。

Seed-ASR (ML)

如上所述,Seed-ASR(CN)在识别普通话和汉语方言方面表现出很强的性能。为了将这些优势扩展到其他国家用户使用的语言,我们还将Seed-ASR方法应用于多语言场景,从而形成了我们的多语言模型:Seed-ASR(ML)。Seed-ASR(ML)的训练与Seed-ASR(CN)的主要区别在于训练数据。Seed-ASR(CN)专注于普通话和中国方言,而Seed-ASR(ML)则是在各种多语言数据集上进行训练的。在SSL阶段,Seed-ASR(ML)的音频编码器也使用了具有2B参数的LUISE,并使用来自多域源的数千万小时无监督多语言数据进行训练。在随后的阶段中,我们从我们的多语言ASR训练集中选择训练数据,这些训练数据总计数十万小时,涵盖9种语言:英语,中文,阿拉伯语,西班牙语,法语,印度尼西亚语,日语,韩语和葡萄牙语。 SSL和SFT阶段的详细数据分布见附录A.3。我们对多个评估集和公共数据集进行性能比较。

Evaluation on Multi-domain and Multi-accent Sets:

在多域评估集上,覆盖的域与第4.1.2节中介绍的种子ASR(CN)上的多域评估集相同。硬盒测试集涵盖了医疗健康、食品和饮料、体育、技术、服装、游戏、娱乐和美容等领域。我们还建立了对不同口音的英语的评估,包括来自英国,美国,澳大利亚,加拿大,中国,印度,新加坡,新西兰和南非的发言者。对于多语言评估,我们报告了7种非英语语言的平均WER性能:阿拉伯语(AR),西班牙语(ES),法语(FR),印度尼西亚语(ID),日语(JA),韩语(KO)和葡萄牙语(PT)。如表10所示,用于比较的基线包括Google USM [50](API call 3)、Whisper Large v3 [39](离线解码)和Universal-1 [41](API调用4)。由于Universal-1在我们的多语言多域评估集中仅支持3种语言,因此其相应结果未包含在此处。我们将这些模型在多语言多域评估集上的语言性能比较附在附录A.1中。从表10中的结果来看,与最强的基线相比,Seed-ASR(ML)在英语和多语言多领域评估集上分别表现出相对超过42%和40%。在英语多重音和硬格评估集上也观察到类似的显着改进。

除了内部多域评估集之外,我们还将Seed-ASR(ML)与英语和其他语言的公共测试集上的其他模型进行了比较,包括Librispeech[36] test clean/other,MLS[38],Tedo 3[24],Callhome,Switchboard[19],AMI[30]和Fleurs[13]。测试集的详细信息见附录A.2。结果如表11所示。请注意,基线模型的所有结果都是由基线模型的相应论文或技术报告的WER(Whisper Large-v3结果来自Universal-1的技术报告[41])。 如表11所示,Seed-ASR(ML)在不同语言的大多数测试集上都实现了最佳性能,提高了10%到40%,这表明Seed-ASR(ML)对训练期间看不到的领域具有泛化能力。

与Seed-ASR(CN)类似,Seed-ASR(ML)在广泛的评估集上表现出与多个强基线相比的卓越性能。该模型在识别具有不同声学环境、语义上下文和多种语言口音的语音方面表现出色,强调了该模型的泛化能力及其在训练过程中处理来自各种看不见的领域的语音的有效性。总体而言,上述中文和多语言环境下的评估集的结果证明了Seed-ASR在涵盖多语言,多方言,多口音,多领域和多定制需求的多种应用场景中的泛化能力和强大的基础能力。

总结

通过包括SFT、上下文SFT和RL在内的逐阶段训练的Seed-ASR模型,与最近发布的强大端到端模型相比,在不同声学和语义领域、口音/方言/语言和长距离语音持续时间的各种评估集上展示了上级能力。大规模的LUISE预训练和连接LUISE和LLMSFT赋予Seed-ASR理解不同语音内容的能力。上下文SFT阶段的引入显著提高了模型对相关上下文的关键词的召回率,展示了模型在利用LLMs的上下文感知能力方面的强大定制能力。RL阶段进一步巩固了Seed-ASR的文本生成行为与准确转录的要求之间的一致性,特别是语义重要部分的转录。 总体而言,结果肯定了Seed-ASR作为涉及多种语言,方言,口音,域和定制需求的各种应用程序的最佳ASR模型的地位。未来,我们将专注于扩展Seed-ASR在单个模型中处理多个任务的能力,进一步增强长格式能力并增加支持的语言数量。

OpenVoice-语音克隆用于批量合成高质量语音数据

OpenVoice: Versatile Instant Voice Cloning

https://github.com/myshell-ai/OpenVoice

它能够仅使用一小段参考发言者的音频片段来复制其声音,然后能生成多种语言的语音。 OpenVoice被设计为尽可能地解耦语音中的组件。语言、音色和其他重要的语音特征的生成是相互独立的,从而能够灵活地操纵各个语音风格和语言类型。 解耦的结构降低了对模型大小和计算复杂性的要求 ,同时不使用自回归或者扩散模型,加快推理速度。支持训练数据集之外的说话人和语言,适合为语音大模型提供大规模的合成语音数据。【核心:将语音克隆任务解耦为独立的子任务,其中每个子任务都比耦合的任务更容易实现。

主要功能:可以用于合成音频数据

1.准确的音色克隆。OpenVoice可以准确地克隆参考音色,并生成多种语言和口音的语音。

2.灵活的语音风格控制。OpenVoice支持对语音风格的精细控制,例如情感和口音,以及其他风格参数,包括节奏、停顿和语调

3.零样本跨语言语音克隆。即使这些语言未在训练集中出现也能进行声音复制。

4、支持的语言包括英语(英国、美国、印度、澳大利亚)、西班牙语、法语、中文、日语、韩语

OpenVoice V2的新增特性:

  • 更好的音频质量: 采用新的训练策略以提升音频质量。
  • 原生多语言支持: V2 版本原生支持英语、西班牙语、法语、中文、日语和韩语。
  • 集成 MeloTTS: V2 版本引入了 MeloTTS 技术,通过 pip install git+https://github.com/myshell-ai/MeloTTS.git 进行安装,这是一个新的文本到语音转换系统,增强了声音的自然度和表现力。
  • 免费商业使用: 自2024年4月起,V1和V2版本均以 MIT 许可证发布,支持商业和研究用途的免费使用。
  1. 声音样式和语言的解耦设计:
    • OpenVoice 的设计哲学是将声音的不同特性(如音色、风格、语言)进行解耦,使得可以独立控制各个参数,从而达到灵活调整的目的。这一设计减少了模型的大小和复杂性,提高了操作的灵活性和推断速度。
  2. 基础发音者TTS模型与音色转换器:
    • 基础发音者TTS模型:这一模型允许对风格参数进行控制,如情绪和口音等。它是一个单发音者或多发音者模型,可以通过改变输入的风格和语言嵌入来输出不同风格的语音。
    • 音色转换器:这一组件采用编码器-解码器结构,负责将基础发音者的音色转换为参考发音者的音色。通过这种方式,即使基础声音与目标声音风格不同,也能保持原有风格的同时改变音色。
  3. 训练策略和数据处理:
    • 在训练过程中,采用了大量的多语种、多风格的音频样本。通过这些样本,模型学习如何准确复制音色并控制声音的不同风格。使用特定的损失函数来确保在保留风格的同时去除或转换音色,从而实现高质量的声音生成。

背景

目前语音克隆有以下问题:

1、除了克隆音色,如何灵活控制其他重要的风格参数,如情感,重音,节奏,停顿和语调?这些特征对于生成上下文中的自然语音和对话至关重要,而不是单调地叙述输入文本。以前的方法只能克隆参考说话人的单调音色和风格,但不允许灵活操纵风格。

2、zreo-shot能力:如果要生成的说话人没有训练集里 或者 要说话者的语言没有出现在训练集里,模型可以克隆参考语音并生成该语言的语音吗?

3.如何在不降低质量的情况下实现超高速实时推理,这对于大规模商业生产环境至关重要。

为了解决前两个问题,OpenVoice被设计为尽可能地解耦语音中的组件。语言、音色和其他重要的语音特征的生成是相互独立的,从而能够灵活地操纵各个语音风格和语言类型。这是在不标记MSML训练集中的任何语音风格的情况下实现的。我们想澄清的是,本研究中的零激发跨语言任务与VALLE-X中的任务不同。在VALLE-X中,所有语言的数据都需要包含在MSML训练集中,并且模型不能泛化到MSML训练集之外的未知语言。相比之下,OpenVoice被设计为推广到MSML训练集之外的完全看不见的语言。第三个问题是默认解决的,因为解耦的结构降低了对模型大小和计算复杂性的要求。 我们不需要一个大模型来学习一切。此外,我们避免了自回归或扩散成分,以加快推理

方法

将说话人音色和说话人风格、语言解耦,分别进行处理,base speaker TTS用于合成说话人风格参数(例如,情感、重音、节奏、停顿和语调)、重音和语言 。提取器用于控制合成音色信息。

很明显,同时为任何说话者克隆音色、实现对所有其他风格的灵活控制以及轻松添加新语言可能是非常具有挑战性的。它需要大量的组合数据集,其中受控参数相交,数据对只在一个属性上不同,并被很好地标记,以及一个相对大容量的模型来拟合数据集。

我们还注意到,在常规的单一说话人TTS中,不需要语音克隆,就可以相对容易地添加对其他风格参数的控制以及添加新语言。例如,在10K短音频样本的单说话人数据集,该10K短音频样本具有标记的情绪和语调,足以训练提供对情绪和语调的控制的单说话者TTS模型。添加新的语言或口音也很简单,只需要通过在数据集中添加另一个说话者。

OpenVoice背后的直觉是将IVC任务解耦为独立的子任务,其中每个子任务都比耦合的任务更容易实现。音色的克隆与对所有其余风格参数和语言的控制完全分离。我们提出使用基本说话人TTS模型来控制风格参数和语言,并使用音色转换器来将参考音色体现到生成的语音中。

Model Structure

OpenVoice的两个主要组件是base说话人TTS模型和音色转换器。base说话人TTS模型是单说话人或多说话人模型,其允许控制风格参数(例如,情感、重音、节奏、停顿和语调)、重音和语言。由该模型生成的语音被传递到音色转换器,该音色转换器将base说话人的音色改变为参考说话人的音色。

Base说话人TTS模型。Base Speaker TTS模型的选择非常灵活。例如,可以修改VITS模型,以在其文本编码器和持续时间预测器中接受样式和语言嵌入。其他选项如InstructTTS也可以接受样式提示。也可以使用商业上可用的(和便宜的)模型,例如Microsoft TTS,它接受指定情感,停顿和发音的语音合成标记语言(SSML)。人们甚至可以跳过基本说话人TTS模型,以他们想要的任何风格和语言自己阅读文本。在我们的OpenVoice实现中,我们默认使用VITS模型,但其他选择也是完全可行的。我们将基本模型的输出表示为 𝐗⁢(LI,SI,CI) ,其中三个参数分别表示语言、风格和音色。 类似地,来自参考说话者的语音音频表示为 𝐗⁢(LO,SO,CO) 。

音色转换器. 音色转换器是一个编码器-解码器结构,中间有一个可逆的归一化流程。编码器是一个1D卷积神经网络,它将 𝐗⁢(LI,SI,CI) 的短时傅立叶变换频谱作为输入。所有的卷积都是单步的。由编码器输出的特征图被表示为 𝐘⁢(LI,SI,CI) 。音色提取器是一个简单的2D卷积神经网络,它对输入语音的梅尔频谱图进行操作,并输出一个编码音色信息的单个特征向量。我们将其应用于  𝐗⁢(LI,SI,CI)  以获得矢量 𝐯⁢(CI) ,然后将其应用于 𝐗⁢(LO,SO,CO) 以获得矢量 𝐯⁢(CO) 。

标准化flow层将 𝐘⁢(LI,SI,CI) 和 𝐯⁢(CI) 作为输入,并输出消除色调音色信息但保留所有剩余样式属性的特征表示 𝐙⁢(LI,SI) 。 特征字母表(LI,SI)沿时间维度与国际音标(IPA)沿着对齐。然后,我们在反方向上应用归一化流层,其将 𝐙⁢(LI,SI) 和 𝐯⁢(CO) 作为输入并输出 𝐘⁢(LI,SI,CO) 。这是将来自参考说话者的音色 CO 体现到特征图中的关键步骤。然后 𝐘⁢(LI,SI,CO) 被HiFi-Gan解码为原始波形 𝐗⁢(LI,SI,CO) 。我们的OpenVoice实现中的整个模型是前馈的,没有任何自回归组件。音色转换器在概念上类似于语音转换,但是在其功能性、其模型结构上的归纳偏差和训练目标上具有不同的重点。 音色转换器中的flow层在结构上类似于基于流的TTS方法,但是具有不同的功能和训练目标。

替代方法和缺点。虽然有其他方法来提取 𝐙⁢(LI,SI) ,但我们根据经验发现,所提出的方法实现了最佳的音频质量。可以使用HuBERT来提取离散或连续的声学单元以消除音色信息,但我们发现这种方法也从输入语音中消除了情感和口音。当输入是看不见的语言时,这种类型的方法也存在保留音素的自然发音的问题。我们还研究了另一种方法,该方法仔细构建信息瓶颈以仅保留语音内容,但我们观察到这种方法无法完全消除音调音色。

OpenVoice的贡献在于提供了一个解耦的框架,将语音风格和语言控制从音色克隆中分离出来。这非常简单,但非常有效,特别是当你想控制风格,口音或推广到新的语言。如果想要在XTTS这样的耦合框架上拥有相同的控制权,可能需要大量的数据和计算,并且很难流利地说每种语言。在OpenVoice中,只要单扬声器TTS说话流利,克隆的语音就会流利。 将语音风格和语言的生成与音色的生成脱钩是OpenVoice的核心理念。

Training

为了训练base speaker TTS模型,我们从两个英语说话人(美国口音和英国口音)、一个汉语说话人和一个日语说话人收集了音频样本。共30K句,平均句长7s。中英文数据都有情感分类标签。我们对VITS模型【无需任何情感标注,通过对参考语音使用情感提取模型 提取语句情感embedding输入网络,实现情感可控的VITS合成】进行了改进,并将情感范畴嵌入、语言范畴嵌入和说话人id输入到文本编码器、时长预测器和flow层。培训遵循VITS作者提供的标准程序。训练后的模型能够通过在不同的基本说话人之间切换来改变口音和语言,并以不同的情绪来阅读输入文本。我们还用额外的训练数据进行了实验,证实了节奏、停顿和语调可以用和情绪完全一样的方式学习。

为了训练音色转换器,我们从20 K个人中收集了300 K音频样本。大约180K个样本是英语,60k个样本是中文,60k个样本是日语。这就是我们所说的MSML数据集。音色转换器的训练目标是双重的。首先,我们要求编码器-解码器产生自然的声音。在训练过程中,我们将编码器输出直接馈送到解码器,并使用具有mel频谱图损失和HiFi-GAN损失的原始波形来监督生成的波形。

其次,我们要求流层从音频特征中消除尽可能多的音色信息。在训练过程中,对于每个音频样本,其文本被转换为IPA中的音素序列,每个音素由可学习的向量嵌入表示。向量嵌入的序列被传递到Transformer编码器以产生文本内容的特征表示。将该特征表示为 𝐋∈ℝc×l ,其中 c 是特征通道的数量, l 是输入文本中的音素的数量。音频波形由编码器和流层处理以产生特征表示 𝐙∈ℝc×t ,其中 t 是特征沿时间维度沿着的长度。 然后,我们使用动态时间扭曲(替代方案是单调对齐)沿着时间维度对齐 𝐋 和 𝐙 以产生 𝐋¯∈ℝc×t ,并最小化 𝐋¯ 和 𝐙 之间的KL发散。由于 𝐋¯ 不包含任何音色信息,因此最小化目标将鼓励流层从其输出 𝐙 中移除音色信息。流层以来自音色编码器的音色信息为条件,这进一步帮助流层识别需要消除的信息。此外,我们不提供任何风格或语言信息供流层进行调节,这会阻止流层消除除音色以外的信息。 由于流层是可逆的,因此将它们调节在新的音色信息上并运行其逆过程可以将新的音色添加回特征表示,然后将特征表示解码为包含新的音色的原始波形。

总结

OpenVoice展示了卓越的实例语音克隆能力,并且在语音风格和语言方面比以前的方法更灵活。这种方法背后的直觉是,只要我们不要求模型能够克隆参考说话者的音调颜色,就可以相对容易地训练基本说话者TTS模型来控制语音风格和语言。因此,我们建议将音色克隆与其他语音风格和语言分离,我们认为这是OpenVoice的基本设计原则。

The Dataset of Speech Recognition数据集

语音识别数据集汇总:

https://github.com/double22a/speech_dataset/tree/main?tab=readme-ov-file

Chinese

nameduration/haddressremarkapplication
THCHS-3030https://openslr.org/18/
Aishell150https://openslr.org/33/
ST-CMDS110https://openslr.org/38/
Primewords99https://openslr.org/47/
aidatatang200https://openslr.org/62/
MagicData755https://openslr.org/68/
ASR&SD160http://ncmmsc2021.org/competition2.htmlif available
Aishell21000http://www.aishelltech.com/aishell_2if available
TAL ASR100https://ai.100tal.com/dataset
Common Voice63https://commonvoice.mozilla.org/zh-CN/datasetsCommon Voice Corpus 7.0
ASRU2019 ASR500https://www.datatang.com/competitionif available
2021 SLT CSRC398https://www.data-baker.com/csrc_challenge.htmlif available
aidatatang_1505zh1505https://datatang.com/opensourceif available
WenetSpeech10000https://github.com/wenet-e2e/WenetSpeech
KeSpeech1542https://openreview.net/forum?id=b3Zoeq2sCLqspeech recognition, speaker verification, subdialect identification, voice conversion
MagicData-RAMC180https://arxiv.org/pdf/2203.16844.pdfconversational speech data recorded from native speakers of Mandarin Chinese
Mandarin Heavy Accent Conversational Speech Corpus58.78https://magichub.com/datasets/mandarin-heavy-accent-conversational-speech-corpus/
Free ST Chinese Mandarin Corpushttps://openslr.org/38/

English

nameduration/haddressremark
Common Voice2015https://commonvoice.mozilla.org/zh-CN/datasetsCommon Voice Corpus 7.0
LibriSpeech960https://openslr.org/12/
ST-AEDS-201801004.7http://www.openslr.org/45/
TED-LIUM Release 3430https://openslr.org/51/
Multilingual LibriSpeech44659https://openslr.org/94/limited supervision
SPGISpeech5000https://datasets.kensho.com/datasets/scribeif available
Speech Commands10https://www.kaggle.com/c/tensorflow-speech-recognition-challenge/data
2020AESRC160https://datatang.com/INTERSPEECH2020if available
GigaSpeech10000https://github.com/SpeechColab/GigaSpeech
The People’s Speech31400https://openreview.net/pdf?id=R8CwidgJ0yT
Earnings-2139https://arxiv.org/abs/2104.11348
VoxPopuli24100+543https://arxiv.org/pdf/2101.00390.pdf24100(unlabeled), 543(transcribed)
CMU Wilderness Multilingual Speech Dataset13http://festvox.org/cmu_wilderness/Multilingual
MSR-86K9795.46https://huggingface.co/datasets/Alex-Song/MSR-86KMultilingual

Chinese-English

nameduration/haddressremark
SEAME30https://www.isca-speech.org/archive_v0/archive_papers/interspeech_2010/i10_1986.pdf
TAL CSASR587https://ai.100tal.com/dataset
ASRU2019 CSASR200https://www.datatang.com/competitionif available
ASCEND10.62https://arxiv.org/pdf/2112.06223.pdf

Japanese (ja-JP)

nameduration/haddressremark
Common Voice26https://commonvoice.mozilla.org/zh-CN/datasetsCommon Voice Corpus 7.0
Japanese_Scripted_Speech_Corpus_Daily_Use_Sentence18https://magichub.io/cn/datasets/japanese-scripted-speech-corpus-daily-use-sentence/
LaboroTVSpeech2000https://arxiv.org/pdf/2103.14736.pdf
CSJ650https://github.com/kaldi-asr/kaldi/tree/master/egs/csj
JTubeSpeech1300https://arxiv.org/pdf/2112.09323.pdf
MSR-86K1779.03https://huggingface.co/datasets/Alex-Song/MSR-86KMultilingual

Korean (ko-KR)

nameduration/haddressremark
korean-scripted-speech-corpus-daily-use-sentence4.3https://magichub.io/cn/datasets/korean-scripted-speech-corpus-daily-use-sentence/
korean-conversational-speech-corpus5.22https://magichub.io/cn/datasets/korean-conversational-speech-corpus/
MSR-86K10338.66https://huggingface.co/datasets/Alex-Song/MSR-86KMultilingual

Russian (ru-RU)

nameduration/haddressremark
Common Voice148https://commonvoice.mozilla.org/zh-CN/datasetsCommon Voice Corpus 7.0
OpenSTT20000https://arxiv.org/pdf/2006.08274.pdflimited supervision
MSR-86K3188.52https://huggingface.co/datasets/Alex-Song/MSR-86KMultilingual

French (fr-Fr)

nameduration/haddressremark
MediaSpeech10https://arxiv.org/pdf/2103.16193.pdfASR system evaluation dataset
MSR-86K8316.70https://huggingface.co/datasets/Alex-Song/MSR-86KMultilingual

Spanish (es-ES)

nameduration/haddressremark
MediaSpeech10https://arxiv.org/pdf/2103.16193.pdfASR system evaluation dataset
MSR-86K13976.84https://huggingface.co/datasets/Alex-Song/MSR-86KMultilingual

Turkish (tr-TR)

nameduration/haddressremark
MediaSpeech10https://arxiv.org/pdf/2103.16193.pdfASR system evaluation dataset

Arabic (ar)

nameduration/haddressremark
MediaSpeech10https://arxiv.org/pdf/2103.16193.pdfASR system evaluation dataset
MSR-86K873.84https://huggingface.co/datasets/Alex-Song/MSR-86KMultilingual

noise & nonspeech

nameduration/haddressremark
MUSANhttps://openslr.org/17/
Room Impulse Response and Noise Databasehttps://openslr.org/28/
AudioSethttps://ieeexplore.ieee.org/document/7952261

The Dataset of Speech Synthesis

Chinese

nameduration/haddressremark
Aishell385https://openslr.org/93/
Opencpophttps://wenet.org.cn/opencpop/download/Singing Voice Synthesis

English

nameduration/haddressremark
Hi-Fi Multi-Speaker English TTS Dataset291.6https://openslr.org/109/
LibriTTS corpus585https://openslr.org/60/
Speechocean762https://www.openslr.org/101/
RyanSpeech10http://mohammadmahoor.com/ryanspeech/

The Dataset of Speech Recognition & Speaker Diarization

Chinese

nameduration/haddressremarkapplication
Aishell4120https://openslr.org/111/8-channel, conference scenariosspeech recognition, speaker diarization
ASR&SD160http://ncmmsc2021.org/competition2.htmlif availablespeech recognition, speaker diarization
zhijiangcuphttps://zhijiangcup.zhejianglab.com/zhijiang/match/details/id/6.htmlif availablespeech recognition, speaker diarization
M2MET120https://arxiv.org/pdf/2110.07393.pdf8-channel, conference scenariosspeech recognition, speaker diarization

English

nameduration/haddressremarkapplication
CHiME-6https://chimechallenge.github.io/chime6/download.htmlif availablespeech recognition, speaker diarization

The Dataset of Speaker Recognition

Chinese

nameduration/haddressremarkapplication
CN-Celebhttps://openslr.org/82/
KeSpeech1542https://openreview.net/forum?id=b3Zoeq2sCLqspeech recognition, speaker verification, subdialect identification, voice conversion
MTASS55.6https://github.com/Windstudent/Complex-MTASSNet
THCHS-3040http://www.openslr.org/18/

English

nameduration/haddressremark
VoxCeleb Datahttp://www.robots.ox.ac.uk/~vgg/data/voxceleb/

中文语音识别数据集总结

OpenSLR国内镜像

http://openslr.magicdatatech.com/

Free ST Chinese Mandarin Corpus

1)基本信息:
参与者:855人
这个语料库是用手机在室内安静的环境中录制的。它有855个speakers。每个演讲者有120个话语。所有的话语都经过人仔细的转录和核对。保证转录精度

语料库包含:
1音频文件;
2转录;
3元数据;

2)链接

下载:(8.2G)

http://www.openslr.org/resources/38/ST-CMDS-20170001_1-OS.tar.gz

国内镜像:

http://cn-mirror.openslr.org/resources/38/ST-CMDS-20170001_1-OS.tar.gz

Primewords Chinese Corpus Set 1

1)基本信息
参与人数:296人
时长:178小时

这个免费的中文普通话语料库由上海普力信息技术有限公司发布。(www.primewords.cn)包含178个小时的数据。该语料由296名以中文为母语的人的智能手机录制。转录精度大于 98%,置信度为 95%。免费用于学术用途。转述和词句之间的映射以 JSON 格式提供。

2)链接

下载:(9.0G)

http://www.openslr.org/resources/47/primewords_md_2018_set1.tar.gz

国内镜像:

http://cn-mirror.openslr.org/resources/47/primewords_md_2018_set1.tar.gz

爱数智慧中文手机录音音频语料库(Mandarin Chinese Read Speech )

1)基本信息

时长:755小时

参与人数:1000人

音频格式:PCM

MagicData中文手机录音音频语料库包含755小时的中文普通话朗读语音数据,其中分为训练集712.09小时、开发集14.84小时和测试集28.08小时。本语料库的录制文本覆盖多样化的使用场景,包括互动问答、音乐搜索、口语短信信息、家居命令控制等。采集方式为手机录音,涵盖多种类型的安卓手机;录音输出为PCM格式。1000名来自中国不同口音区域的发言人参与采集。MagicData中文手机录音音频语料库由MagicData有限公司开发,免费发布供非商业使用。

2)链接

包:

https://freedata.oss-cn-beijing.aliyuncs.com/MAGICDATA_Mandarin_Chinese_Speech.zip

下载地址

http://www.imagicdatatech.com/index.php/home/dataopensource/data_info/id/101

THCHS30

1)基本信息

时长:40余小时

THCHS30是一个经典的中文语音数据集,包含了1万余条语音文件,通过单个碳粒麦克风录取,大约40小时的中文语音数据,内容以文章诗句为主,全部为女声。它是由清华大学语音与语言技术中心(CSLT)出版的开放式中文语音数据库。原创录音于2002年由朱晓燕教授在清华大学计算机科学系智能与系统重点实验室监督下进行,原名“TCMSD”,代表“清华连续”普通话语音数据库’。13年后的出版由王东博士发起,并得到了朱晓燕教授的支持。他们希望为语音识别领域的新入门的研究人员提供玩具级别的数据库,因此,数据库对学术用户完全免费。

2)链接

国内镜像:

https://link.ailemon.me/?target=http://cn-mirror.openslr.org/resources/18/data_thchs30.tgz

国外镜像:

https://link.ailemon.me/?target=http://www.openslr.org/resources/18/data_thchs30.tgz

ST-CMDS

1)基本信息:

时长:100余小时

参与人数:855人

ST-CMDS是由一个AI数据公司发布的中文语音数据集,包含10万余条语音文件,大约100余小时的语音数据。数据内容以平时的网上语音聊天和智能语音控制语句为主,855个不同说话者,同时有男声和女声,适合多种场景下使用。

2)链接

下载地址:

国内镜像:

https://link.ailemon.me/?target=http://cn-mirror.openslr.org/resources/38/ST-CMDS-20170001_1-OS.tar.gz

国外镜像:

https://link.ailemon.me/?target=http://www.openslr.org/resources/38/ST-CMDS-20170001_1-OS.tar.gz

MAGICDATA Mandarin Chinese Read Speech Corpus

1)基本信息

时长:755小时

参与人数:1080人

应用:语音识别,机器翻译,说话人识别和其他语音相关领域

Magic Data技术有限公司的语料库,语料库包含755小时的语音数据,其主要是移动终端的录音数据。邀请来自中国不同重点区域的1080名演讲者参与录制。句子转录准确率高于98%。录音在安静的室内环境中进行。数据库分为训练集,验证集和测试集,比例为51:1:2。诸如语音数据编码和说话者信息的细节信息被保存在元数据文件中。录音文本领域多样化,包括互动问答,音乐搜索,SNS信息,家庭指挥和控制等。还提供了分段的成绩单。该语料库旨在支持语音识别,机器翻译,说话人识别和其他语音相关领域的研究人员。因此,语料库完全免费用于学术用途。

2)链接

下载地址见参考:
https://blog.ailemon.me/2018/11/21/free-open-source-chinese-speech-datasets/
镜像:
http://www.openslr.org/68/

AISHELL

AISHELL开源版1

1)基本信息

时长:178小时

参与人数:400人

采样:44.1kHz & 16kHz 16bit

AISHELL是由北京希尔公司发布的一个中文语音数据集,其中包含约178小时的开源版数据。该数据集包含400个来自中国不同地区、具有不同的口音的人的声音。录音是在安静的室内环境中同时使用3种不同设备: 高保真麦克风(44.1kHz,16-bit);Android系统手机(16kHz,16-bit);iOS系统手机(16kHz,16-bit)。进行录音,并采样降至16kHz,用于制作AISHELL-ASR0009-OS1。通过专业的语音注释和严格的质量检查,手动转录准确率达到95%以上。该数据免费供学术使用。他们希望为语音识别领域的新研究人员提供适量的数据。

2)链接

下载地址:

http://www.aishelltech.com/kysjcp

AISHELL-2 开源中文语音数据库

1)基本信息

时长:1000小时

参与人数:1991人

希尔贝壳中文普通话语音数据库AISHELL-2的语音时长为1000小时,其中718小时来自AISHELL-ASR0009-[ZH-CN],282小时来自AISHELL-ASR0010-[ZH-CN]。录音文本涉及唤醒词、语音控制词、智能家居、无人驾驶、工业生产等12个领域。录制过程在安静室内环境中, 同时使用3种不同设备: 高保真麦克风(44.1kHz,16bit);Android系统手机(16kHz,16bit);iOS系统手机(16kHz,16bit)。AISHELL-2采用iOS系统手机录制的语音数据。1991名来自中国不同口音区域的发言人参与录制。经过专业语音校对人员转写标注,并通过严格质量检验,此数据库文本正确率在96%以上。(支持学术研究,未经允许禁止商用。)

2)链接

下载地址:

http://www.aishelltech.com/aishell_2

AISHELL-翻译机录制语音数据库

1)基本信息

时长:31.2小时

参与人数:12人

采样: 44.1kHz & 16kHz 16bit

文件:wav

来自AISHELL的开源语音数据产品:翻译机录制语音数据库

2)链接

下载地址:

http://www.aishelltech.com/aishell_2019C_eval

AISHELL-家居环境近远讲同步语音数据库

1)基本信息

时长:24.3小时

参与人数:50人

采样: 44.1kHz & 16kHz 16bit

文件:wav

AISHELL-2019A-EVAL 随机抽取 50 个发音人。每人从位置 A(高保真 44.1kHz,16bit)与位置 F(Android 系统手机 16kHz,16bit)中,各选取 232 句到 237 句。
此数据库经过专业语音校对人员转写标注,并通过严格质量检验,文本正确率 100%。

AISHELL-2019A-EVAL 是 AISHELL-ASR0010 的子库,共 24.3 小时。

2)链接

下载地址:

http://www.aishelltech.com/aishell_2019A_eval

AISHELL-语音唤醒词数据库

1)基本信息

时长:437.67小时

参与人数:86人

采样: 44.1kHz & 16kHz 16bit

文件:wav

来自希尔贝壳的语音唤醒词数据库

2)链接

下载地址:

http://www.aishelltech.com/aishell_2019B_eval

AISHELL-3 语音合成数据集

1)基本信息
希尔贝壳中文普通话语音数据库AISHELL-3的语音时长为85小时88035句,可做为多说话人合成系统。录制过程在安静室内环境中, 使用高保真麦克风(44.1kHz,16bit)。218名来自中国不同口音区域的发言人参与录制。专业语音校对人员进行拼音和韵律标注,并通过严格质量检验,此数据库音字确率在98%以上。(支持学术研究,未经允许禁止商用。)
2)下载链接
国内镜像: https://openslr.magicdatatech.com/resources/93/data_aishell3.tgz
国外镜像:https://www.openslr.org/resources/93/data_aishell3.tgz

Aidatatang

aidatatang_1505zh(完整的1505小时中文普通话语音数据集)

1)基本信息

参与人数:6408人

时长:1505小时

包含6408位来自中国不同地区的说话人、总计1505小时时长共3万条语音、经过人工精心标注的中文普通话语料集可以对中文语音识别研究提供良好的数据支持。采集区域覆盖全国34个省级行政区域。经过专业语音校对人员转写标注,并通过严格质量检验,句标注准确率达98%以上,是行业内句准确率的最高标准。

2)使用效果:

3)链接

数据申请:

https://www.datatang.com/webfront/opensource.html

Aidatatang_200zh(基于完整数据集精选的200小时中文普通话语音数据集)

1)基本信息
时长:200小时

参与人数:600人

采样: 16kHz 16bit

Aidatatang_200zh是由北京数据科技有限公司(数据堂)提供的开放式中文普通话电话语音库。语料库长达200小时,由Android系统手机(16kHz,16位)和iOS系统手机(16kHz,16位)记录。邀请来自中国不同重点区域的600名演讲者参加录音,录音是在安静的室内环境或环境中进行,其中包含不影响语音识别的背景噪音。参与者的性别和年龄均匀分布。语料库的语言材料是设计为音素均衡的口语句子。每个句子的手动转录准确率大于98%。数据库按7:1:2的比例分为训练集、验证集和测试集。在元数据文件中保存诸如语音数据编码和扬声器信息等详细信息。还提供分段转录本。

2)特点

该语料库旨在为语音识别、机器翻译、声纹识别等语音相关领域的研究人员提供支持。因此,该语料库完全免费供学术使用。

数据堂精选了200小时中文普通话语音数据在OpenSLR发布,并在Kaldi平台提供了训练代码,对应的训练方法也在github平台发布。

3)链接

训练:

https://github.com/datatang-ailab/aidatatang_200zh/blob/master/README.md

国内镜像:

https://link.ailemon.me/?target=http://cn-mirror.openslr.org/resources/62/aidatatang_200zh.tgz

国外镜像:https://link.ailemon.me/?target=http://www.openslr.org/resources/62/aidatatang_200zh.tgz

hkust

  1. 基本信息
    200h,16khz,16bit。中文电话数据集,电话对话,espnet,kaldi里面都有egs。
    2)链接下载链接:http://catalog.ldc.upenn.edu/LDC2005S15

Speechocean 10小时中文普通话语音识别语料库

1)基本信息
这是一个10.33小时的语料库,它同时通过4个不同的麦克风收集。在安静的办公室中,由20位说话者(10位男性和10位女性)录制​​了该语料库。每个扬声器在一个通道中记录了大约120声。包括转录文件。句子的转录精度高于98%。它完全免费用于学术目的。
2)下载链接
百度云盘(提取码:sktk):https://pan.baidu.com/share/init?surl=1glZHlKIXjlPOOht6_yQXQ

cn-celeb

1)基本信息
此数据是“在野外”收集的大规模说话人识别数据集。该数据集包含来自1000位中国名人的13万种语音,涵盖了现实世界中的11种不同流派。所有音频文件都编码为单通道,并以16位精度以16kHz采样。数据收集过程由清华大学语音与语言技术中心组织。它也由国家自然科学基金61633013和博士后科学基金2018M640133资助。
2)下载链接

HI-MIA

1)基本信息
内容为中文和英文的唤醒词“嗨,米娅”。使用麦克风阵列和Hi-Fi麦克风在实际家庭环境中收集数据。下文描述了基准系统的收集过程和开发。挑战中使用的数据是从1个高保真麦克风和1/3/5米的16通道圆形麦克风阵列中提取的。内容是中文唤醒词。整个集合分为火车(254人),开发(42人)和测试(44人)子集。测试子集提供了成对的目标/非目标答案,以评估验证结果。
2)下载链接
国内镜像(train) :http://openslr.magicdatatech.com/resources/85/train.tar.gz
国内镜像(dev) :http://openslr.magicdatatech.com/resources/85/dev.tar.gz
国内镜像(test) :http://openslr.magicdatatech.com/resources/85/test_v2.tar.gz
国内镜像(filename_mapping):http://openslr.magicdatatech.com/resources/85/filename_mapping.tar.gz

MobvoiHotwords

1)基本信息
MobvoiHotwords是从Mobvoi的商业智能扬声器收集的唤醒单词的语料库。它由关键字和非关键字语音组成。对于关键字数据,将收集包含“ Hi xiaowen”或“ Nihao Wenwen”的关键字语音。对于每个关键字,大约有36k语音。所有关键字数据均收集自788名年龄在3-65岁之间的受试者,这些受试者与智能扬声器的距离(1、3和5米)不同。在采集过程中,具有不同声压级的不同噪声(例如音乐和电视等典型的家庭环境噪声)会在后台播放。

2)下载链接
国内镜像 :http://openslr.magicdatatech.com/resources/87/mobvoi_hotword_dataset.tgz
国外镜像:http://www.openslr.org/resources/87/mobvoi_hotword_dataset.tgz

zhvoice: Chinese voice corpus

1)基本信息
zhvoice语料由8个开源数据集,经过降噪和去除静音处理而成,说话人约3200个,音频约900小时,文本约113万条,共有约1300万字。

zhvoice语料比较原始数据而言,更加清晰和自然,减少了噪声的干扰,减少了因说话人说话不连贯造成的不自然。

zhvoice语料包含文本、语音和说话人3个方面的信息,可适用于多种语音相关的任务。

zhvoice语料由智浪淘沙清洗和处理。
2)下载链接
https://github.com/fighting41love/zhvoice

AudioPaLM-可以听说的大模型

AudioPaLM,一个用于语音理解和生成的大型语言模型。AudioPaLM融合了基于文本和基于语音的语言模型,将PaLM-2和AudioLM集成到一个统一的多模式架构中,该架构可以处理和生成文本和语音,可以实现包括语音识别和语音到语音翻译。AudioPaLM继承了AudioLM保留说话人身份和语调等非语言信息的能力,以及仅存在于PaLM-2等文本大型语言模型中的语言知识。我们证明,使用纯文本大型语言模型的权重初始化AudioPaLM可以改善语音处理,成功地利用预训练中使用的大量文本训练数据来帮助语音任务。 由此产生的模型显著优于现有的语音翻译任务系统,并且能够为许多语言执行零样本语音到文本的翻译,这些语言在训练中没有看到输入/目标语言组合。

https://google-research.github.io/seanet/audiopalm/examples/

https://arxiv.org/html/2306.12925

AudioPaLM的核心是一个联合词汇表,它可以用有限数量的离散tokrn来表示语音和文本,结合任务的基本标记描述,允许在涉及任意交织的语音和文本的混合任务上训练单个仅解码器模型。这包括语音识别、文本到语音合成和语音到语音翻译,将传统上由异构模型解决的任务统一到单个架构和训练运行中。此外,由于AudioPaLM的底层架构是大型Transformer模型,因此我们可以使用在文本上预训练的大型语言模型的权重来初始化其权重,这允许其受益于诸如PaLM的模型的语言和常识知识。

图1:AudioPaLM模型,以语音到语音翻译和自动语音识别为例。我们采用一个预训练的纯文本模型(虚线),并扩展其嵌入矩阵来建模一组新的音频令牌,这里的token基于w2v-BERT 或者USM-v提取的,但token中同时含有语义信息和说话人声学信息【 k-means聚类之前不对嵌入进行归一化 ,用于保留说话人信息】。模型架构在其他方面没有改变:文本和音频令牌的混合序列作为输入被送入,并且模型解码文本或音频令牌。音频令牌通过后面的AudioLM阶段或SoundStorm转换回原始音频。

我们使用一个只有解码器的Transformer来建模由文本和音频令牌组成的序列。就模型而言,文本和音频只是任意整数的序列,因为输入在馈送到模型之前被标记化,并且任何输出在返回给模型的用户之前都被去token化。通过在有限的词汇表中用离散的标记来表示语音,我们可以构建一个多模态词汇表,它是这个音频词汇表和一个用于表示文本的SentencePiece的结合。因此,原则上,我们的设置和通常的纯文本解码器设置之间几乎没有区别,除了在我们的设置中,一些令牌代表音频和一些文本,并且我们使用预训练的纯文本检查点初始化我们的多模态模型。

方法

音频嵌入和令牌化

将原始波形转换为令牌。这涉及从现有的语音表示模型中提取嵌入,然后将这些嵌入离散化为有限的音频令牌集合。从w2v-BERT模型中提取嵌入,通过K-means进行离散化。在这项工作中,我们实验了以下方法来获得一组离散的音频令牌:

1、我们使用了一个w2v-BERT模型,该模型已经在多语言数据上进行了训练,其次,我们在执行k-means聚类之前不对嵌入进行归一化。虽然Borsos等人发现标准化在不降低性能的情况下删除了说话者身份信息,但我们发现在多语言环境中,标准化确实会导致性能下降保留了说话人的声学信息,所以这里的token可以认为是声学token+语义token】。该方法以25 Hz的速率产生令牌,令牌词汇表的大小为1024。

2、USM-v1:我们使用更高性能的通用语音模型(USM)编码器执行相同的过程,以替换w2v-BERT编码器。我们使用这个多语言语音编码器的最大2B参数变体,并从中间层提取嵌入。与w2v-BERT类似,该方法以25 Hz的速率生成令牌,令牌词汇表的大小为1024。

修改纯文本解码器以适应文本和音频

在Transformer解码器中,输入预处理后模型的第一层是标记嵌入矩阵 𝐄 ,它将整数值标记映射到密集嵌入;给定 t 标记的词汇表和大小为 m 的嵌入, 𝐄 是 t×m 矩阵,其第 i 行给出第 i 标记的嵌入。 另一个嵌入矩阵 𝐄′ 出现在最后的softmax层中,用于计算每个位置上所有标记的logit;它是一个 m×t 矩阵,与模型的 m 维输出相乘,以获得logit的 t 维向量,每个标记一个。 在PaLM架构中,这些矩阵具有共享变量,因此一个是另一个的转置,即 𝐄′=𝐄 。

解码器架构的其余部分对建模的令牌数量完全无关。 因此,我们只需要做一个小的修改,将纯文本模型转换为同时对文本和音频进行建模的模型:我们将嵌入矩阵 𝐄 的大小扩展为大小 (t+a)×m ,其中 a 是音频令牌的数量( 𝐄′=𝐄 的大小相应地改变)。

为了利用预训练的文本模型,我们通过向嵌入矩阵 𝐄 添加 a 新行来更改现有的模型检查点。实现细节是前 t 令牌(从零到 t )对应于SentencePiece文本令牌,而接下来的 a 令牌(从 t 到 t+a )表示音频令牌。 虽然我们可以重用预训练模型的文本嵌入,但新的音频嵌入是新初始化的,必须经过训练。我们发现有必要训练所有模型参数,而不是保持以前的权重固定。我们使用混合语音和文本任务进行训练。

3、将音频令牌解码为原始音频

为了从音频令牌合成音频波形,我们实验了两种不同的方法:i)自回归解码,遵循AudioLM的设置非自回归解码,ii) 使用最近提出的SoundStorm模型。在这两种情况下,音频令牌首先用于生成声音流令牌,然后用卷积解码器将其转换为音频波形。

AudioLM中的声学生成分两个阶段进行:先将音频token声音流令牌,然后再在合成语音“阶段2”是仅解码器的Transformer模型,其将AudioPaLM产生的音频令牌和语音调节作为输入,并生成SoundStream令牌,其可用于以所需语音实现语音,但比特率非常低。“阶段3”重建SoundStream的残差矢量量化器的更高级别,这增加了比特率并提高了音频质量。

SoundStorm提出了一种替代的非自回归解码方案,该方案应用了一种迭代方法,该方法在所有令牌上并行进行。SoundStorm产生的音频质量与AudioLM相同,但在语音和声学条件方面具有更高的一致性,同时速度快了两个数量级。

通过提供原始输入语音的一部分作为语音调节,该模型能够在将其语音翻译为不同语言时保留原始说话者的语。

实验

由于 AudioPaLM 是基于 Transformer 模型的大语言模型,它可以使用基础的文本预训练模型来初始化权重,从而受益于 PaLM 或 PaLM 2 等模型的语言和常识知识。由于统一的多模态架构,AudioPaLM 能够使用直接映射或组合任务的方式来解决语音识别、语音合成和语音翻译等问题。单一任务包括自动语音识别(ASR)、自动语音翻译(AST)、语音到语音翻译(S2ST)、文本到语音(TTS)和文本到文本机器翻译(MT)等。为了指定模型在给定输入上执行的任务,可以在输入前加上标签,指定任务和输入语言的英文名称,输出语言也可以选择加上。例如,[ASR French]表示执行法语的自动语音识别任务,[TTS English]表示执行英语的文本到语音任务,[S2ST English French]表示执行从英语到法语的语音到语音翻译任务,而组合任务的标签[ASR AST S2ST English French]表示依次进行从英语到法语的自动语音识别、自动语音翻译、语音到语音翻译。微调使用的数据集包含音频、音频的转录、音频的翻译、音频的翻译文本等。一个数据集可以用于多个任务,将同一数据集中的多个任务结合起来可以提高性能。

AudioPaLM 在语音翻译基准测试中展示了最先进的结果,并在语音识别任务上表现出竞争性能。利用 AudioLM 的语音提示,该模型还可以对未见过的讲话者进行 S2ST,超越现有方法,以客观和主观评估的方式衡量语音质量和声音保持。另外,该模型展示了零样本迁移的能力,可以使用训练中未曾出现过的语音输入/目标语言组合进行 AST。

SpeechTokenizer: Unified Speech Tokenizer for Speech Language Models

语音语言模型的统一语音标记器

https://github.com/ZhangXInFD/SpeechTokenizer

SpeechTokenizer: Unified Speech Tokenizer for Speech Language Models

SpeechTokenizer是一个统一的语音语言模型的语音分词器,它采用了编码器-解码器架构与残差矢量量化(RVQ)。统一语义和声学标记SpeechTokenizer在不同的RVQ层上分层地解开语音信息的不同方面。具体地,RVQ的第一量化器输出的代码索引可以被认为是语义令牌,并且其余量化器的输出主要包含音色信息,其用作对由第一量化器丢失的信息的补充。

目前的Speech Langauge Model(speech LM)大多依赖于语音的离散表示。具体来说,这些模型首先将连续的语音信号转换成离散的tokens,进而像处理文本一样以自回归的方式进行训练,再通过一个解码器将离散tokens恢复为语音。

比较常用的语音离散表示大致可分为两种:语义semantic token和 声学acoustic token。token如其名,通常认为semantic token建模语音中较为global的内容信息,它们来自于以mask langauge modeling为training objective的自监督预训练模型,比较常见的有HuBERT, W2VBERT等;acoustic token建模语音中的局部声学细节,通常来自于以reconstruction为training objective的neural audio codec,比较常见的有SoundStream, EnCodec。

基于这两种token,目前已有的speech LM建模范式大致可分为三类

  1. Semantic language models: 基于semantic token的自回归模型,常外接一个unit-vocoder来恢复语音,比如SpeechGPT。这类模型虽然可以完成一些语音内容相关的任务,但是它们产生的音质比较一般,并且无法完成一些副语言学相关的任务,比如音色转换等。
  2. Acoustic language models: 基于acoustic token的speech LM,比如VALL-E。这类模型产生的语音音质比较好,并且可以较好地完成一些比如zero-shot TTS的任务,但是会存在内容不准确的问题。
  3. Hierarchical speech language models: 这类模型由Semantic language models和Acoustic language models 级联而成,既可以产生比较精确的内容,也可以产生较好的音质,比如AudioPaLM。但是这类模型,建模阶段太多,较为复杂,需要两种tokenizer的参与;而且在semantic token和acoustic token之间其实存在有很大的信息冗余,会带来一些不必要的建模难度。

因此,如果想要打造好的speech LM,需要有一个理想的speech tokens,它应该具有以下两个特征:

  1. 和文本的对齐程度比较高
  2. 保留了语音中各个方面的信息

但是现有的speech tokens都不是专门为构建speech LM而设计的,并不清楚它们和speech LM的适配性。因此我们建立了SLMTokBench来评估不同类型speech token在构建speech LM方面的适用性。它从文本对齐程度和信息保留程度两个方面来量化分析speech tokens,具体评测方法可以看我们论文。通过SLMTokBench,我们发现semantic tokens和文本的对齐程度比较高,但是损失了语音中很大一部分说话人信息。acoustic tokens保留了语音中的各个方面信息,但是和文本的对齐程度不够高。因此,他们都不适合于构建speechLM。

方法

虽然说SoundStream和Encodec这样的基于RVQ-VAE的压缩建模方法包含了语音的声学特征,但其中也不可避免地带入了语义特征。二者提取的实际上更像是一种语义特征和声学特征的混合体。基于此,SpeechTokenizer在二者的基础上,引入了语义引导信息来解耦语义特征和声学特征。语义特征和声学特征的解耦对于最终的语音合成有着相当的重要性。SpeechTokenizer的具体做法是:使用HuBERT的特征对RVQ1的特征做语义蒸馏,其余部分保留声学信息。

基于此,我们想统一semantic token和acoustic token,我们提出了SpeechTokenizer,它基于EnCodec架构,在不同的RVQ层上对语音信息进行解耦和分层建模,从而让第一层token建模语音中的内容信息,剩下几层token补充除内容信息之外的其他信息,如下图。这是首个专为speech LM设计的语音离散化工具。

具体实现方法为在EnCodec的整体框架上,使用HuBERT representation对RVQ-1的quantized output进行semantic guidance,从而达到第一层token建模语音中的内容信息的效果,并且残差结构会使得剩下的几层来补充内容信息之外的其他信息。使用EnCodec的基于卷积的编码器-解码器网络,该网络使用选定的步幅因子执行时间缩减。值得注意的是,我们已经用两层BiLSTM代替了最初在EnCodec编码器中的卷积块之后的两层LSTM,以增强语义建模能力。我们对附录B中的模型结构进行了消融研究。我们使用残差向量量化(RVQ)来量化编码器的输出,RVQ是一种可以在初始量化步骤之后使用不同码本来量化残差的方法。有关模型结构的更多详细信息,请参见附录D。 在训练期间,语义教师提供语义表示以指导残差量化过程。

并且基于SpeechTokenizer,我们可以统一上面讲的三种speech LM建模范式,从而构建unified speech language model(USLM),模型结构如下图

在SpeechTokenizer上构建一个统一的语音语言模型。它由自回归模型和非自回归模型组成,可以对语音信息进行分层建模。自回归(AR)模型通过对来自第一RVQ量化器的令牌进行建模来捕获内容信息。非自回归(NAR)模型通过从以第一层令牌为条件的后续量化器生成令牌来补充AR模型的语言信息。我们在零拍TTS任务上验证了统一语音语言模型的有效性。

回归(AR)模型通过对来自第一RVQ量化器的令牌进行建模来捕获内容信息。非自回归(NAR)模型通过从以第一层令牌为条件的后续量化器生成令牌来补充AR模型的语言信息。

NAR模型可以是条件流匹配[speech-Gen]、扩散模型 【Seed-TTS】等

在推理过程中,我们将文本输入转换为音素序列,将语音提示转换为语音标记。它们连接在一起形成AR和NAR模型的提示。在此基础上,AR模型生成第一级令牌,而NAR模型迭代地生成后续级别的令牌。由AR和NAR模型生成的令牌然后被连接以构造语音令牌矩阵。最后,我们使用SpeechTokenizer解码器来生成以完整令牌矩阵为条件的波形。

Speech Language Model Token Benchmark:

文本对齐评估:

下游模型采取语音令牌作为输入。具体来说,对于每个离散表示,我们首先建立一个嵌入矩阵,该矩阵可以随机初始化,也可以从离散化过程中获得的k均值质心矩阵或矢量量化码本中导出。我们使用嵌入矩阵来嵌入离散表示并获得连续表示,然后将其输入下游模型。我们在LibriSpeech train-clean-100子集上训练下游模型,并使用dev-clean子集来估计互信息。我们还计算了测试集上的单词错误率(WER)。

信息保存评估:

为了评估离散语音表示中语音信息的保留,我们将语音令牌转换回语音,并通过内容和音质的自动度量来评估重新合成的语音。我们训练一个单元-HiFIGAN(Polyak 等人,2021)在LibriSpeech数据集上将HuBERT单位转换为波形。值得注意的是,为了避免额外信息的干扰,我们在训练期间不提供任何说话人信息。对于Encodec令牌,我们使用Encodec解码器直接产生波形。通过使用Whisper en-medium模型转录重新合成的语音来计算WER来评估内容保存(拉德福 等人,2023年)。通过利用WavLM-TDNN(Chen 等人,2022)来计算合成语音和地面实况语音之间的说话人相似度。 我们从LibriSpeech测试集中随机抽取300个语音样本进行评估。

比较语义 & 声学令牌

我们使用HuBERT L9单元来表示语义令牌,使用EnCodec代码来表示声学令牌语义标记实现了与文本的高互信息,但其重新合成的语音具有低说话人相似性。声学标记实现低WER和高说话人相似度的再合成语音,但与文本的互信息低。

SpeechTokenizer

模型结构

我们的模型基于 RVQ-GAN 框架,遵循与 SoundStream和 EnCodec相同的模式。如图 2 所示,模型使用了 EnCodec 中基于卷积的编码器-解码器网络,通过选择的步长因子进行时间下采样。值得注意的是,我们将 EnCodec 编码器中卷积模块后原本使用的两层 LSTM 替换为两层 BiLSTM,以增强语义建模能力。我们在附录 B 中进行了模型结构的消融研究。我们使用残差矢量量化(RVQ)对编码器输出进行量化,这种方法可以在初始量化步骤后使用不同的码书对残差进行量化。模型结构的进一步细节可参见附录 D。在训练期间,一个语义教师为残差量化过程提供语义表示指导。

语义提炼

为了实现跨不同RVQ层的不同信息的分层建模,我们采用语义指导的第一个量化器,使其能够捕获内容信息。利用残差结构使得后续量化器能够补充剩余的非语言信息。

我们采用HuBERT(Hsu 等人,2021)作为我们在这项研究中的语义老师,因为HuBERT被证明包含大量的内容信息(Mohamed 等人,2022年)。我们介绍了两种类型的蒸馏:连续表示蒸馏和伪标签预测。

对于连续表示蒸馏,我们采用第9层HuBERT表示或所有HuBERT层的平均表示作为语义教师。训练目标是最大化RVQ第一层和语义教师表示的输出之间的所有时间步长在维度级别上的余弦相似性。形式上,连续蒸馏损失定义为:

其中 𝐐1 和 𝐒 分别表示RVQ第一层和语义教师表示的量化输出。 𝐀 表示投影矩阵, D 是语义教师表征的维度。上标 (:,d) 表示包括来自维度 d 处的所有时间步的值的向量。 cos⁡(⋅) 表示余弦相似性, σ⁢(⋅) 表示S形激活。这种连续蒸馏损失函数偏离了常用的方法,该方法基于学生和教师模型在同一时间步输出的表示来计算损失。附录C对这两种方法进行了比较分析。

对于伪标签预测,我们采用HuBERT单元作为目标标签。培训目标如下:

其中 𝐪1t 和 𝐮t 分别表示第一VQ层和HuBERT单元在时间步t的量化输出。 T 表示时间步长的数量, 𝐀 是投影矩阵。

Training Objective

我们的训练方法包括重建任务和语义蒸馏任务。在重建任务中,我们采用了GAN目标,优化了重建项,判别损失项和RVQ承诺损失的组合。在语义蒸馏任务中,训练目标涉及语义蒸馏损失项。在下文中, 𝐱 表示语音信号,并且 𝐱^ 表示通过网络重构的信号.

重建损失重建损失包括时域和频域损失。鉴别损失我们使用与HiFi-CodecYang等人(2023)相同的鉴别器,其中包括三个鉴别器:基于多尺度STFT(MS-STFT)的鉴别器;多周期鉴别器(MPD)和多尺度鉴别器(MSD)。鉴别器的更多详细信息可参见附录D。对抗性损失用于提高感知质量,并且它被定义为在多个鉴别器上和在时间上平均的在多个鉴别器的logits上的铰链损失。RVQ Commitment Loss 我们在预量化值和其量化值之间添加承诺损失 ℒw ,而不为量化值计算梯度。RVQ承诺损失被定义为: ℒw=∑i=1Nq∥𝐳i−𝐳qi∥22. ,其中 𝐳i 和 𝐳qi 分别表示对应码本中的当前残差和最近条目。

通常,生成器被训练以优化以下损失:

RVQ token中信息解耦的效果如何?

我们做了one-shot voice conversion的实验。具体做法为把source speech的RVQ-1 token和reference speech的RVQ-2:8 token拼在一起送到decoder中得到converted speech。我们发现这种简单拼接RVQ token的做法也可以有不错的音色转换的效果,说明信息解耦是比较成功的。可以到我们的demo page上听效果。

SpeechTokenizer能否直接应用到unseen langauge上?

SpeechTokenizer在训练过程中只见过英语,我们直接用它直接来tokenize 德语和中文speech。发现RVQ-1送到decoder得到的speech比较机械,没有音色和韵律,说明也有比较好的解耦效果,大家可以去project page听demo。从下面频谱图也可以看出RVQ-1得到的语音丢掉了一些如共振峰等特征。

paraformer-工业级非自回归端到端语音识别模型

论文地址:https://arxiv.org/abs/2206.08317

代码:https://github.com/modelscope/FunASR/

摘要:

Transformers在 ASR 领域占据主导地位。虽然能够产生良好的性能,但它们使用自回归(AR)解码器来逐一生成令牌,这在计算效率上是低效的。为了加快推理速度,可以使用非自回归 (NAR) 方法,例如单步 NAR 的设计是为了实现并行生成。然而,由于输出标签之间的独立性假设,单步 NAR 的性能不如 AR 模型,尤其是在大规模语料库的情况下。改进single-step NAR 面临两个挑战:首先是准确预测输出 token 的数量并提取隐藏变量;其次,增强输出标签之间相互依赖性的建模。为了应对这两个挑战,我们提出了一种快速且准确的并行Transformer,称为 Paraformer。该模型属于单步非自回归模型。这利用基于连续积分和激发的预测器来预测令牌的数量并生成隐藏变量。然后,扫视语言模型(GLM)采样器生成语义嵌入,以增强 NAR 解码器对上下文相互依赖进行建模的能力。最后,我们设计了一种策略来生成负样本以进行最小错误率训练,以进一步提高性能。使用公共 AISHELL-1、AISHELL-2 基准和工业级 20,000 小时任务的实验表明,所提出的 Paraformer 可以达到与最先进的 AR Transformer相当的性能,并且加速超过 10 倍。

1. Paraformer使用基于CIF的predictor预测输出标签的个数并产生隐变量;【文献18】

2. GLM sampler用于产生语义向量增强非自回归模型对上下文的建模能力;【文献19】

3. 最后作者设计了一个策略产生负例,并用MWER损失训练使模型的识别能力进一步提升。【文献20】

介绍:

过去几年,端到端(E2E)模型在自动语音识别(ASR)任务上的性能已经超越了传统层级系统。存在三种流行的 E2E 方法:连接主义时间分类 (CTC)、循环神经网络转换器 (RNN-T) 和基于注意力的编码器-解码器 (AED) 。其中,AED 模型由于其卓越的识别精度而在 ASR 的 seq2seq 建模中占据主导地位。例如 Transformer 和 Conformer。虽然性能良好,但此类 AED 模型内的自回归 (AR) 解码器需要一一生成令牌,因为每个令牌都以所有先前的令牌为条件。因此,解码器的计算效率低下,并且解码时间随着输出序列长度线性增加。为了提高效率并加速推理,有人提出使用非自回归(NAR)模型并行生成输出序列。

基于推理时需要的迭代次数,NAR 模型可以分为迭代模型或单步模型。在前者中,A-FMLM 是单步自回归模型的最早尝试,旨在通过不断迭代来预测以未屏蔽标记为条件的屏蔽标记。由于需要预先定义目标令牌长度,性能受到影响。为了解决这个问题,Mask-CTC 和变体提出通过 CTC 解码来增强解码器输入。即便如此,这些迭代 NAR 模型需要多次迭代才能获得有竞争力的结果,限制了实践中的推理速度。最近,提出了几种单步 NAR 模型来克服这一限制。它们通过消除时间依赖性同时生成输出序列。虽然单步 NAR 模型可以显着提高推理速度,但其识别精度明显不如 AR 模型,尤其是在大规模语料库上评估时。

前面提到的单步非自回归模型主要关注如何预测输出标签的个数和准确提取隐变量。和机器翻译通过predictor预测输出标签个数相比,ASR预测输出标签个数确实比较难,因为有很多的潜在影响因素,比如说话人的语速、静音、噪音。另一方面,经过作者的观察和分析,单步非自回归模型相比自回归模型具有更多的替换错误,如下图1。作者认为缺少上下文依赖信息导致预测标签个数准确率差不多,但替换错误上升明显(AR和vanilla NAR比较),尤其是单步自回归模型的条件独立假设。另外,所有的非自回归模型都是在学术基准阅读音频上实验的,并没有验证这些模型在工业基准数据上的效果。这篇论文的目标是提升单步非自回归模型的识别效果,使其达到和自回归模型相同的水准,并在大规模工业级数据上验证。

图1

文章提出了一个又快又准的并行transformer模型,可以克服上面提到的两个挑战。首先,不像前面的基于CTC的工作,作者提出了使用基于CIF【continuous integrate-and-fire】的predictor网络评估目标长度并产生隐变量。对于第二个挑战,作者设计了基于GLM【glancing language mode】的sampler模块增强非自回归解码器对输出上下文的建模能力。这个工作受到了机器翻译工作的启发。作者另外设计了一个包含负例的策略,利用MWER损失指导模型学习提升模型性能。

Paraformer是第一个在性能上可以和自回归模型媲美,并且在大规模数据集上相比自回归模型有10倍+的推理速度提升。

方法

整体框架

如上图所示,整个框架包含五个模块:encoder、 predictor、sampler、decoder、loss function。其中Encoder和自回归模型的Encoder一样,本文使用SAN-M【multihead-attention的部分换成了san-M】和FFN,也可以使用conformer等结构。Predictor用于生成声学特征指导解码。Sampler模块使用声学特征和标签特征生成语义特征【用于学习输入的上下文内容语义信息,增强非自回归解码器对输出上下文的建模能力】。Decoder和自回归解码器相同,只不过这里是双向解码器[类似bert]。解码器包含多个SAN-M、FNN和cross MHA模块。除了CE loss,还会使用MAE loss训练predictor,MWER损失也一起参与模型训练。

整个流程阐述:
输入音频为X,长度为T;音频对应的文本标签为Y,长度为N。Encoder的输入为X,输出为H。Predictor的输入为H,输出为预测的输出标签长度N’并生成声学向量Ea。第一轮解码Decoder的输入为H和Ea,输出为Y’。图中红色虚线Pass1标记部分表示输入Ea,但是并不对这个输入进行反向传播学习。第二轮解码前会首先经过Sampler模块。Sampler模块在声学向量Ea和输出标签向量Ec之间进行采样得到语义向量Es。其中Char指的是标签Y。采样过程依赖Y和Y’之间的距离。第二轮解码Decoder的输入为H和Es,输出为Y’‘,这次进行反向传播学习。此次反向传播学习指导decoder学习上下文语音信息,同时也会指导predictor和encoder的学习。Sampler使用Y’进行距离计算不会进行反向传播学习。最后输出的Y’’会被采样为MWER训练生成负例候选。使用N和N’计算MAE。MWER、MAE和CE loss一起作为loss进行训练。
推理时,sampler模块是不激活的,并且双向并行解码器只使用声学向量Ea和隐向量H通过一轮输出最终的预测结果。尽管decoder在每次训练时会前向推理两次,但是因为在推理时只进行了一次所以并不会使计算复杂度变大。

Predictor

Predictor由两个卷基层组成,输出的float weight α 在0~1之间。作者通过累计此权重预测输出标签的长度。MAEloss定义为:

其实就是将所有α 进行了累加,加起来的长度就是预测的长度。LOSS就是真实长度和预测长度差的绝对值。作者引入了CIF机制产生声学向量。CIF是一个软的(非0/1,可以是小数)和单一对齐的,在AED模型中作为流式解决方案的实现。声学向量的生成时,CIF对权重α 进行累计,如果超过了设定的阈值β ,说明某一个声学向量的边界确定了。对边界之内的向量H根据权重α 进行缩放累计即可得到某一个声学向量。此过程重复直到结尾,可得到所有的声学向量。如下图所示:

在训练时权重α会根据N进行缩放(比如累计的α为N’,使用N/N’对所有的α 进行缩放,使用缩放后的α计算声学向量Ea。缩放是为了让的Ea维度和Ec的维度保持一致),但是在推理时无法进行缩放,导致训练和推理之间存在不一致。为了弥补这个不一致,作者提出了使用动态阈值β而不是固定阈值。计算公式如下:

下面是一个向上取整,所以分子小于等于分母,阈值β < = 1 。

Sampler 【参考字节Glancing Transformer

GLM目的就是更好的学习输出序列的上下文语义关系,利用上下文进行当前的文本预测 学习输出标签之间的依赖关系

在普通的单步非自回归模型中,优化的目标为:

然而,正如上面所说的,单步非自回归模型中的输出标签独立性假设导致模型识别效果不如自回归模型。GLM模块的loss定义如下:

其中GLM(Y,Y′)表示Sampler模块在Ea​和Ec​中选中Ec​替换Ea​对应的Y′′中token的集合;GLMˉ(Y,Y′)表示Sampler模块在Ea​和Ec​中未选中Ec​替换Ea​对应的Y′′的token的集合;GLM(Y,Y′)的定义如下:

上面公式的含义是从Ec​中采样⌈αd(Y,Y′)⌉个向量替换对应位置的Ea​,生成新的向量为Es​。其中α是控制采样率的采样因子,越大表示使用Ec​替换Ea​的概率越大。该采样概率应该在最初模型效果不好时设置的稍微大一些,然后随着整个的训练过程的进行逐渐减小。为了达到这个目的,作者简单实用汉明距离,其定义为:

也就是,最开始的时候模型学习不好,d会比较大,当模型学习越来越好时,d也逐渐减小。表示最开始训练时,使用较多的Ec​替换Ea​,也就是上下文信息更多和准确,减小模型的学习难度;当模型学习的越来越好时,使用较少的标签信息迫使模型进一步学习。

总结,sampler模块结合了标注标签向量Ec​,实现方法是随机替换Ea​中⌈αd(Y,Y′)⌉个向量生成新的含有语义的向量Es​。训练并行decoder使用语义上下文GLM(Y,Y′)预测目标标签GLMˉ(Y,Y′),使模型学习输出标签之间的依赖关系

补充Glancing Transformer 原理:

自回归模型中最为常用的训练方式是最大似然估计(MLE),不少非自回归模型也直接使用 MLE 进行训练。但是非自回归模型的输出方式是并行的,输出语句中的任何部分在输出之前都无法获得输出语句中其余词的确切值。所以直接使用 MLE 训练并行输出的非自回归模型无法有效地建模输出语句中词之间的依赖关系。值得注意的是,词之间依赖关系的建模对输出通顺的语句至关重要,拥有良好生成质量的自回归模型和多轮迭代解码的模型均对这种依赖关系进行了有效的建模。

直接训练完全并行生成来学习目标语句中词之间的依赖关系对模型并不友好。一种更为简单有效的依赖关系学习方式是根据部分输入词预测其余目标词。但是这种学习方式需要部分目标词作为输入,不符合非自回归模型并行生成的要求。作者观察到随着模型自身更好地学习到词之间的依赖关系,模型对于依赖关系的学习可以逐渐摆脱使用目标语句部分词作为输入的需求。基于以上观察,Glancing Transformer(GLAT)利用了一种 glancing language model 的方法,通过渐进学习的方式进行词之间依赖关系的建模。在渐进学习的过程中,模型会先学习并行输出一些较为简单的语句片段,然后逐渐学习整句话的单步并行生成。

具体地,在第一次解码的时候,和常规的非自回归模型一样,模型使用完全并行解码的方式输出语句。然后将第一次解码得到的输出和训练数据中的目标语句进行对比。如果输出和目标语句差距较大,说明模型在训练中难以拟合该训练样本,因此这时 GLAT 会选择提供更多目标词作为输入来帮助学习词之间依赖关系。反之,如果输出和目标语句比较接近,则模型自身已经较好地学习了如何并行生成该目标语句,所需要的目标词数量也相应减少。

在第二步解码之前,模型的解码器可以得到部分目标词作为输入,这些词的数量由第一步的解码结果所决定。这时,模型在并行输出之前可以获得部分目标词的确切值,所以在学习输出剩余目标词的过程中就可以对目标语句中词之间的依赖关系进行建模。

随着训练的进行,模型对数据拟合程度更高,因此能够更准确地生成目标语句。与此同时,需要作为解码器输入的目标语句中的词的数量会越来越少,在训练后期逐渐接近学习完全并行生成的训练场景(例如上图右边的例子)。具体的方法细节和实现方式可以参考论文。

Loss Function:

一共定义了三个loss:CE、MAE、MWER。训练时进行联合训练:

对于MWER,具体的计算公式如下:

非自回归模型使用贪婪搜索,所以只有一个输出路径。正如前面提到的,在使用MWER训练时作者使用负例采样策略通过随机遮蔽top1分值标签产生多个候选路径。

实验

实验设置

在AISHELL-1、AISHELL-2以及工业级2wh数据集上验证上述方法的效果。其中工业级的测试集有两个:普通30h、远场15h。具体的工业级语料介绍可以参考文献21和28。RTF的测试在NVIDIA tesla V100上完成。

结果如上表格。在上述两个测试集上的测试都是在ESPNET框架上实现的,不包含LM和预训练模型。
AISHELL-1 的AR baseline参考文献15,效果在所有AR模型中是最好的(排除使用更多数据知识的模型)。因为作者当前的目标是通过模型结构提升模型效果而不是通过数据。普通的NAR和Paraformer的结构相同,但是没有Sampler。

结论:
1. 普通NAR的表现超过了其它的NAR工作,比如文献15和文献12
2. 普通NAR模型的表现比AR模型稍微差一些,因为缺乏了输出标签之间的上下文信息。
3. Paraformer通过使用基于GLM的Sampler模块对普通NAR模型增强,得到了和AR模型相近的识别表现。
4. Paraformer模型在dev和test测试上的CER分别为:4.6%和5.2%,推理速度比AR基线模型快12倍

工业级2wh数据集

结果如上表格所示,进行了多个扩展实验。动态β表示2.2节中的动态阈值,CTC表示带有LM的DFSMN-CTC-sMBR系统,参考文献32。RTF在OpenNMT上进行评估。
实验有两个模型,一个41M的一个63M的。AR基线模型中attention的维度为256,和文献21一致。这里的结论和前面有所不同。

结论

  1. 可以看到在大型数据集上,普通NAR模型和AR模型的识别效果差距很大(AISHELL上差别较小)。
  2. 普通NAR模型虽然和CTC都有输出标签独立假设限制,但是普通NAR模型效果优于CTC效果。
  3. 普通NAR模型结合GLM时,效果提升。
  4. 当进一步结合MWER训练方法时,效果进一步提升。
  5. Paraformer模型效果和AR模型效果很接近,差别在相对2%以内,但是推理速度提升10倍+。
  6. Paraformer结合动态β \betaβ,效果进一步提升。因为相比固定阈值,动态阈值减少了推理和训练的不一致,更准确地提取了声学向量信息。
  7. 将模型变大时,得到了和前面相似的结论。Paraformer相比普通NAR模型效果提升;和AR模型效果相当,但是推理速度提升10倍+。
  8. Paraformer-63M和AR transformer-41M模型相比较,尽管Paraformer模型较大,但是Paraformer推理速度更快。也就是说,在远场测试集上Paraformer-63M模型相比AR transformer-41M模型,识别效果相对提升6.0%,并且推理速度提升7.4倍。 也就是,在实际生产中,可以通过使用较大的Paraformer模型达到比AR模型更好的识别效果以及更快的推理速度。

对采样因子α的超参数测试结果参见上表格。和预期相同α变大时,模型效果变好,因为在训练时提供了更多的上下文信息;然而如果该参数太大会导致训练和测试不一致。基本上,α 在0.5~1.0之间的表现比较稳定。

  1. 在小型训练集上普通NAR和AR模型的识别性能差别不大,但是在工业级大数据集上差距明显。这是第一个在大规模工业级数据上验证NAR模型效果的研究。
  2. Paraformer相比普通NAR模型识别效果相对提升11%,和精细训练的AR模型效果相当。

分析:见文章第一张图。普通NAR模型相比AR模型,插入错误多一点,但是删除错误少一点。说明普通NAR模型的predictor预测输出的标签个数较准确。然而替换错误比较多,侧面反应两者性能差距很大。作者认为这是由普通NAR模型的条件独立假设造成的。Paraformer模型相比普通NAR模型替换错误下降很多,也暗示了识别效果提升很多。作者认为这是由于GLM模块使NAR模型学习到了标签之间的依赖关系。Paraformer模型相比AR模型替换错误稍微多一些,也暗示着识别准确率稍微差一些。作者认为AR模型中基于LM的beam search解码扮演了很重要的角色,相比GLM效果更好。为了减少这个性能差距,作者将在未来工作中在Paraformer模型上结合外部语言模型。

个人思考/疑问

  1. MWER loss没看懂,需要看文献20.
  2. Char 的 Embedding使用的torch.nn.Embedding,直接学习嘛?还是预设值好的。
  3. 端到端语音识别中的Embedding,例如wenet框架的token 的 Embedding能不能使用NLP领域用文字训练得到的Embedding,如果能的话为啥主流的不是这种的,这个Embedding不比直接学习更好嘛?
  4. wenet的重打分架构,decoder能不能直接根据CTC N-best结果得到矫正的识别结果,相当于做矫正/纠错?
  5. Paraformer能不能直接结合在当前的wenet框架中,使用conformer那套encoder,而不是SAN-M。从文章结论看,可以使用更大的模型训练Paraformer,效果比之前的模型效果好,且推理速度快,是一个可以实践的方向。
  6. Paraformer结构能不能和wenet重打分那套结合?Pafaformer的输出替代CTC的那一支,然后再加上decoder部分的重打分。这样相当于有了两个decoder。按道理就是训练会慢,但是推理应该还好吧?可能可行。——》Paraformer输出只有一个结果,重打分啥啊。。这个做不了。但是decoder可以作为纠错模型对结果进行纠错。
  7. 作者提出的在外面再结合一个语言模型应该是可行的。

[18] L. Dong and B. Xu, “CIF: Continuous integrate-and-fire for end-to-end speech recognition,” in ICASSP 2020-2020 IEEE Interna-tional Conference on Acoustics, Speech and Signal Processing(ICASSP). IEEE, 2020, pp. 6079–6083.
[19] L. Qian, H. Zhou, Y. Bao, M. Wang, L. Qiu, W. Zhang, Y. Yu,and L. Li, “Glancing transformer for non-autoregressive neural machine translation,” arXiv preprint arXiv:2008.07905, 2020.
[20] R. Prabhavalkar, T. N. Sainath, Y. Wu, P. Nguyen, Z. Chen, C.-C. Chiu, and A. Kannan, “Minimum word error rate training for attention-based sequence-to-sequence models,” in 2018 IEEE International Conference on Acoustics, Speech and Signal Processing (ICASSP). IEEE, 2018, pp. 4839–4843

ChatTTS

https://github.com/2noise/ChatTTS/blob/main/docs/cn/README.md
https://2noise.com/
https://github.com/libukai/Awesome-ChatTTS
  1. 对话式 TTS: ChatTTS 针对对话式任务进行了优化,能够实现自然且富有表现力的合成语音。它支持多个说话者,便于生成互动式对话。
  2. 精细的控制: 该模型可以预测和控制精细的韵律特征,包括笑声、停顿和插入语。
  3. 更好的韵律: ChatTTS 在韵律方面超越了大多数开源 TTS 模型。我们提供预训练模型以支持进一步的研究和开发。

数据集和模型

  • 主模型使用了 100,000+ 小时的中文和英文音频数据进行训练。
  • HuggingFace 上的开源版本是一个在 40,000 小时数据上进行无监督微调的预训练模型。
###################################
# Sample a speaker from Gaussian.

rand_spk = chat.sample_random_speaker()
print(rand_spk) # save it for later timbre recovery

params_infer_code = ChatTTS.Chat.InferCodeParams(
    spk_emb = rand_spk, # add sampled speaker 
    temperature = .3,   # using custom temperature
    top_P = 0.7,        # top P decode
    top_K = 20,         # top K decode
)

###################################
# For sentence level manual control.

# use oral_(0-9), laugh_(0-2), break_(0-7) 
# to generate special token in text to synthesize.
params_refine_text = ChatTTS.Chat.RefineTextParams(
    prompt='[oral_2][laugh_0][break_6]',
)

wavs = chat.infer(
    texts,
    params_refine_text=params_refine_text,
    params_infer_code=params_infer_code,
)

###################################
# For word level manual control.

text = 'What is [uv_break]your favorite english food?[laugh][lbreak]'
wavs = chat.infer(text, skip_refine_text=True, params_refine_text=params_refine_text,  params_infer_code=params_infer_code)
torchaudio.save("output2.wav", torch.from_numpy(wavs[0]), 24000)

模型组成:LlamaModel、DVAE(VQVAE)、VOCOS声码器

文本控制

  • 1. Input Text : 需要转换的文本,支持中文和英文混杂
  • 2. Refine text : 是否对文本进行口语化处理
  • 3. Text Seed : 配置文本种子值,不同种子对应不同口语化风格
  • 4. 🎲 : 随机产生文本种子值
  • 5. Output Text : 口语化处理后生成的文本

音色控制

  • 6. Timbre : 预设的音色种子值
  • 7. Audio Seed : 配置音色种子值,不同种子对应不同音色
  • 8. 🎲 : 随机产生音色种子值
  • 9. Speaker Embedding : 音色码,详见 音色控制

情感控制

  • 10. temperate : 控制音频情感波动性,范围为 0-1,数字越大,波动性越大
  • 11. top_P :控制音频的情感相关性,范围为 0.1-0.9,数字越大,相关性越高
  • 12. top_K :控制音频的情感相似性,范围为 1-20,数字越小,相似性越高

系数控制

  • 13. DVAE Coefficient : 模型系数码
  • 14. Reload : 重新加载模型系数

播放控制

  • 15. Auto Play : 是否在生成音频后自动播放
  • 16. Stream Mode : 是否启用流式输出
  • 17. Generate : 点击生成音频文件
  • 18. Output Audio : 音频生成结果
  • 19. ↓ : 点击下载音频文件
  • 20. ▶️ : 点击播放音频文件

示例控制

  • 21. Example : 点击切换示例配置

快速体验

网址类型
Original Web原版网页版体验
Forge WebForge 增强版体验
LinuxPython 安装包
Samples音色种子示例
Cloning音色克隆体验

热门分支

功能增强

项目Star亮点
jianchang512/ChatTTS-ui提供 API 接口,可在第三方应用中调用
6drf21e/ChatTTS_colab提供流式输出,支持长音频生成和分角色阅读
lenML/ChatTTS-Forge提供人声增强和背景降噪,可使用附加提示词
CCmahua/ChatTTS-Enhanced支持文件批量处理,以及导出 SRT 文件
HKoon/ChatTTS-OpenVoice配合 OpenVoice 进行声音克隆

功能扩展

项目Star亮点
6drf21e/ChatTTS_Speaker音色角色打标与稳定性评估
AIFSH/ComfyUI-ChatTTSComfyUi 版本,可作为工作流节点引入
MaterialShadow/ChatTTS-manager提供了音色管理系统和 WebUI 界面

FunAudioLLM:人类和LLMs之间自然交互的语音理解和生成基础模型

https://funaudiollm.github.io/  [阿里团队]
arxiv.org/abs/2407.04051

[Paper] [Code] [Modelscope:SenseVoiceCosyVoice] [HuggingFace: SenseVoice]

我们介绍FunAudioLLM,本报告介绍了FunAudioLLM,这是一个旨在增强人类与大型语言模型之间的自然语音交互的框架(LLMs)。其核心是两个创新模型:SenseVoice用于高精度多语言语音识别,情感识别和音频事件检测;CosyVoice用于多语言,音色和情感控制的自然语音生成。SenseVoice具有极低的延迟并支持50多种语言,而CosyVoice在多语言语音生成、零触发语音生成、跨语言语音克隆和指令遵循功能方面表现出色。与SenseVoice和CosyVoice相关的模型已经在Modelscope和Huggingface上开源,沿着相应的训练,推理和微调代码发布在GitHub上。 通过将这些模型与LLMs集成,FunAudioLLM可以实现语音翻译、情感语音聊天、交互式播客和富有表现力的有声读物叙述等应用,从而推动语音交互技术的发展。

SenseVoice支持多语言语音识别,其训练时间超过30万小时。具体来说,SenseVoice-Small在推理方面非常高效,其中识别延迟小于80 ms,分别比Whisper-Small和Whisper-large快5倍和15倍以上,SenseVoice-Large支持50多种语言的高精度ASR。此外,SenseVoice支持丰富的转录,包括最先进的情感识别、音频事件检测、反向文本标准化(Pusateri 等人,2017)和标点符号(Chen 等人,2020年)。

语音生成模型,CosyVoice,可以生成多语言的语音,这是超过17万小时和五种语言,包括中文(ZH),英语(EN),日语(JP),广东话(Yue)和韩语(KO)的训练。CosyVoice生成的样本可以实现低于2%的WER和超过75%的说话人相似度,达到人类平价的质量水平。CosyVoice支持零样本上下文学习,这使得语音克隆只需要3秒的提示语音。音色、情感、韵律和风格可以在语言内部或跨语言复制。我们还发布了一个指令模型,它可以控制说话者身份,说话风格(例如,情感)和其他具有自然纹理指令的细粒度语言特征。

Speech-to-Speech Translation:

通过集成SenseVoice、LLMs和CosyVoice,我们可以毫不费力地执行语音到语音翻译(S2ST)。

Emotional VoiceChat 情感语音聊天:

通过集成SenseVoice、LLMs和CosyVoice,我们可以开发一个情感语音聊天应用程序。

Interactive Podcast 互动播客:通过集成SenseVoice,一个基于LLM的多智能体系统,具有实时世界知识,以及CosyVoice,我们可以创建一个交互式播客。

有声书:通过LLMs的分析能力来构建和识别书籍中的情感,并将其与CosyVoice合成,我们实现了具有增强表现力的有声读物。

CosyVoice:

在推理阶段概述CosyVoice模型。概括地说,CosyVoice包括一个自回归Transformer,用于为输入文本生成相应的语音标记,一个基于ODE的扩散模型,流匹配,用于从生成的语音标记重建Mel频谱,以及一个基于HiFiGAN的声码器,用于合成波形。虚线模块在特定模型用途中是可选的,例如跨语言、SFT推理等。[论文]

图1:所提出的CosyVoice模型的概述。(a)演示了 𝒮3
标记器,其中虚线模块仅在训练阶段使用。(b)是CosyVoice的示意图,由文本到令牌LLM和令牌到语音流匹配模型组成。 S、E和T表示“start of sequence”、“end of sequence”和“turn of speech”标记。虚线表示推理阶段的自回归解码。(c)提供了我们的流匹配模型的放大视图,该模型以概率密度路径上的时间步长 t处的说话者嵌入 𝐯、语义标记 μ、掩蔽语音特征 X~和中间状态 Xt为条件。
图2:(a)零触发上下文学习和(B)跨语言语音克隆的序列构建。LID表示目标语言标识符。

CosyVoice由四个组件组成,即文本编码器、语音分词器[ speech tokenizer]、大语言模型和条件流匹配模型。具体地说,文本编码器用于对齐文本和语音token的语义空间,而  speech tokenizer 用于提取语义记号,如图1(a)所示。我们采用一个大的语言模型来学习整个文本编码和语音标记序列,将TTS重新表述为一个给定文本作为提示的自回归序列生成问题。然后,如图1(c)所示,利用条件流匹配模型,通过最佳路径上的去噪过程将语音令牌转换为Mel频谱图 。2020)用于以所生成的Mel频谱图作为输入来合成波形。

语音的受监督语义令牌 [ speech tokenizer] :

采用有监督的自动语音识别(ASR)模型来导出用于语音的有监督的语义语音( 𝒮3 )分词器。该模型是我们专有的SenseVoice ASR模型的微调版本。它接受了多语言音频数据的训练,并具有丰富的音频内容理解能力。 与原始ASR模型不同,我们将编码器分为两部分,并在它们之间插入矢量量化层。给定Mel频谱图 X 作为输入,其经历位置编码和 Encoder1 以获得上下文感知表示 H :

然后,一个矢量量化器(VQ)参与获得离散令牌。 对于帧 l 处的隐藏表示 𝐡l ,码本 C 中的最近嵌入的索引被视为该时间步处的语音令牌 μl :

语音令牌的对应码本嵌入被用作量化的隐藏表示 H¯={𝐜μ1,𝐜μ2,…,𝐜μL} ,并通过剩余的编码器层 Encoder2 :

 在 Encoder2 之后,接下来是基于transformer的ASR解码器,预测文本标签的后验概率:

TTS的大型语言模型:

我们将TTS任务表述为具有大型语言模型的自回归语音令牌生成问题(LLM)。对于LLM,序列构建是最重要的事项,其构建如下:

S and E denote the start and end of sequence, respectively.T is “turn of speech” tokens. 𝐯 is a speaker embedding vector extracted from the speech X with a pre-trained voice-print model2. The text encodings Y¯={𝐲¯u}u⁣∈⁣[1:U] is obtained by passing the text through a Byte Pair Encoded (BPE) tokenizer and text encoder:

由于文本和语音标记位于不同的语义层,因此文本编码器用于对齐它们的语义空间并有利于LLM建模。 在文本编码和语音标记 {μl}l⁣∈⁣[1:L] 之间插入开始标识符T报告问题,语音标记 {μl}l⁣∈⁣[1:L] 是用2.1中描述的监督语义标记器提取的。在训练阶段,我们采用教师强迫方案,其中左移序列作为模式输入,原始序列作为期望输出。 注意,在训练期间仅考虑语音标记的交叉熵损失和:

Optimal-transport Conditional Flow Matching:

在CosyVoice中,采用最优传输条件流匹配模型(OT-CFM)来学习Mel谱图的分布,并以生成的语音令牌为条件从其生成样本。 与扩散概率模型(DPM)相比,OT-CFM可以实现更好的性能,具有更简单的梯度,更容易的训练和更快的生成.

  在连续时间归一化流(CNF)中,从先验分布 p0⁢(X) 到Mel谱图 q⁢(X) 的数据分布构造概率密度路径。 概率密度路径由依赖于时间的矢量场 νt⁢(X):[0,1]×ℝL∗D→ℝL∗D 定义,其通过以下常微分方程(ODE)生成流 ϕt :

流匹配模型(The flow matching model)用于估计条件概率 P(S|X, v, Sref)。其中,X 和 v 分别表示语音片段和说话人嵌入,S 和 Sref 分别表示目标和参考语音的梅尔频谱。该模型使用卷积 Transformer U-Net 来确定最优传输 ODE 中先验分布与目标分布之间的矢量场。在推理阶段,只需五到十次迭代即可生成令人满意的梅尔频谱图。此外,还采用无分类器指导技术,通过屏蔽 70% 到 100% 的前置特征条件来增强上下文学习能力。

在从预测的梅尔频谱图合成波形时,我们使用改进的 HiFTNet 声码器,以支持流式生成。

可以实现的任务:

(a)零触发上下文学习和(B)跨语言语音克隆的序列构建。LID表示语言标识符。

Multi-lingual Voice Generation 【多语言的语音合成】

Zero-shot In-context Generation 零样本上下文生成

CosyVoice模型具有零触发的上下文学习能力,允许仅用简短的参考语音样本复制任意语音。这个过程需要仔细构造令牌语言模型(LM)的输入序列,如图2所示。 对于同一语言的提示语音和输入文本,我们将它们合并成一个统一的输入,将提示语音标记视为预生成的。利用该输入序列,自回归LM迭代地预测后续令牌,直到其遇到针对前一元素的“序列结束”令牌E。 然而,当提示语音和输入文本在语言上不同时,我们省略与提示相关联的文本和标记,以防止原始语言的韵律特征影响目标语言。 重要的是要注意,提示文本(对应于提示语音的内容)可以通过人工注释或ASR模型(如SenseVoice)转录。与提示文本类似,提示令牌是使用 𝒮3 tokenizer从提示语音中提取的。在生成语音标记之后,它们被附加在提示标记之后,形成流匹配模型的复合条件。此外,说话人嵌入和梅尔声谱图的提示语音,以进一步提高音色和环境的一致性。

Instructed Voice Generation指令语音生成:

Speaker Identity Control、细粒度控制、Style Control、情感丰富的声音生成、Speaker Fine-tune、Speaker Interpolation

为了进一步实现对CosyVoice的可控性,我们尝试集成额外的指令微调(Ji 等人,2023年)。CosyVoice-instruct扩展了CosyVoice-base,具有增强的后续功能。具体地说,它支持对诸如说话人身份(即,说话者的特征)、说话风格(包括情感、性别、语速和音调)以及细粒度的副语言特征。这些功能包括插入笑声、呼吸、边笑边说以及强调某些单词的能力。

SenseVoice:

SenseVoice 是具有音频理解能力的音频基础模型,包括语音识别(ASR)、语种识别(LID)、语音情感识别(SER)和声学事件分类(AEC)或声学事件检测(AED)。提出了具有不同大小和架构的两个模型以适应不同的要求:SenseVoice-Small,用于快速语音理解的仅编码器语音基础模型,以及SenseVoice-Large,编码器-解码器(Vaswani 等人,2017)语音基础模型,用于更准确的语音理解,支持更多语言。

SenseVoice模型概述。SenseVoice是一个语音基础模型,具有多种语音理解功能,包括ASR、LID、SER和AED。SenseVoice-Small是一种用于快速语音理解的仅编码器语音基础模型,SenseVoice-Large是一种编码器-解码器语音基础模型,用于更准确的语音理解,支持更多语言。

𝐞LID 、 𝐞SER 、 𝐞AEC 、 𝐞ITN/NoITN 是四个特殊标记的嵌入:

⟨LID⟩ 表示LID任务。如果 ⟨LID⟩ 被放置 ,则模型被训练以预测输出的对应位置处的语言标记。 在训练阶段,我们根据概率0.8用真实语言标记随机替换 ⟨LID⟩ ,以便模型可以预测语言标记,或者在推理阶段配置指定的语言标记。

⟨SER⟩ 表示SER任务。如果 ⟨SER⟩ 被放置,则训练模型以预测输出的对应位置处的语音情感标签。

⟨AEC⟩ 表示AEC任务。如果 ⟨AEC⟩ 被放置 ,则模型被训练以预测输出的对应位置处的音频事件标签。

⟨ITN⟩ 或 ⟨NoITN⟩ 指定转录样式。如果提供了 ⟨ITN⟩ ,则模型被训练为使用反向文本规范化(ITN)和标点符号进行转录。如果提供了 ⟨NoITN⟩ ,则模型被训练为在没有ITN和标点符号的情况下转录。

在训练阶段,利用交叉熵损失对LID、SER和AEC任务进行优化。ASR任务使用CTC损失来优化

SenseVoice-Large是一个自回归编码器-解码器模型,用于多语言ASR和多语音理解任务。与Whisper类似(拉德福 等人,2023),SenseVoice-Large通过解码器的输入令牌序列来指定任务。具体来说,我们通过分别包括 ⟨LID⟩ 、 ⟨SER⟩ 、 ⟨AED⟩ 令牌来指定是否预测具有时间戳的语言、语音情感和音频事件。与SenseVoice-Small相比,SenseVoice-Large的优势在于转录准确性和支持大量语言(50+)。

SenseVoice 专注于高精度多语言语音识别、情感辨识和音频事件检测

  • 多语言识别: 采用超过 40 万小时数据训练,支持超过 50 种语言,识别效果上优于 Whisper 模型。
  • 富文本识别:
    • 具备优秀的情感识别,能够在测试数据上达到和超过目前最佳情感识别模型的效果。
    • 支持声音事件检测能力,支持音乐、掌声、笑声、哭声、咳嗽、喷嚏等多种常见人机交互事件进行检测。
  • 高效推理: SenseVoice-Small 模型采用非自回归端到端框架,推理延迟极低,10s 音频推理仅耗时 70ms,15 倍优于 Whisper-Large。
  • 微调定制: 具备便捷的微调脚本与策略,方便用户根据业务场景修复长尾样本问题。
  • 服务部署: 具有完整的服务部署链路,支持多并发请求,支持客户端语言有,python、c++、html、java 与 c# 等。

推理效率:

表1. 比较了SenseVoice、Paraformer和Whisper的模型结构、参数规模、支持的语言和推理效率。SenseVoice-small采用非自回归架构,与Whisper相比,它在推理效率方面具有显着优势。

性能评测:

我们在开源基准数据集(包括AISHELL-1、AISHELL-2、Wenetspeech、Librisepeech和Common Voice)上比较了SenseVoice和Whisper的多语言识别性能和推理效率。使用A800机器进行推理效率评估。SenseVoice-small采用非自回归端到端架构,推理延迟极低-与Whisper-small相比快7倍,与Whisper-large相比快17倍。

1、文本识别:[在开源基准数据集(包括 AISHELL-1、AISHELL-2、Wenetspeech、Librispeech 和 Common Voice)上比较了 SenseVoice 与 Whisper 的多语言语音识别性能和推理效率。在中文和粤语识别效果上,SenseVoice-Small 模型具有明显的效果优势。]

2、情感识别

SenseVoice也可以用于离散情感识别。支持快乐、悲伤、愤怒和中立。我们在7个流行的情感识别数据集上对其进行了评估。SenseVoice-Large可以在大多数数据集上接近或超过SOTA结果,即使没有目标语料库微调。

由于目前缺乏被广泛使用的情感识别测试指标和方法,我们在多个测试集的多种指标进行测试,并与近年来 Benchmark 上的多个结果进行了全面的对比。所选取的测试集同时包含中文 / 英文两种语言以及表演、影视剧、自然对话等多种风格的数据,在不进行目标数据微调的前提下,SenseVoice 能够在测试数据上达到和超过目前最佳情感识别模型的效果。

我们还在测试集上对多个开源情感识别模型进行对比,结果表明,SenseVoice-Large 模型可以在几乎所有数据上都达到了最佳效果,而 SenseVoice-Small 模型同样可以在多数数据集上取得超越其他开源模型的效果。

3、事件检测

SenseVoice-Small和SenseVoice-Large模型都可以检测到语音中的音频事件,包括音乐、掌声、笑声。SenseVoice-Large可以预测音频事件的开始和结束位置,而SenseVoice Small只能预测音频中发生了什么(只有一个事件),但是,它可以检测更多的事件,例如在人机交互过程中可能发生的咳嗽,打喷嚏,呼吸和哭泣。

尽管 SenseVoice 只在语音数据上进行训练,它仍然可以作为事件检测模型进行单独使用。我们在环境音分类 ESC-50 数据集上与目前业内广泛使用的 BEATS 与 PANN 模型的效果进行了对比。SenseVoice 模型能够在这些任务上取得较好的效果,但受限于训练数据与训练方式,其事件分类效果专业的事件检测模型相比仍然有一定的差距。

限制:

1、SenseVoice有一些需要解决的局限性。首先,对于资源不足的语言,ASR性能通常要低得多。其次,SenseVoice不是为流式转录而设计的。因此,未来的工作可能会集中在开发基于SenseVoice的流式语音理解模型。

2、CosyVoice也有一些限制。首先,它支持的语言数量有限。虽然它可以根据明确的指令表达情感和说话风格,但它不能根据文本的语义内容推断出适当的情感或风格。此外,CosyVoice在唱歌时表现不佳。在保持声音原有音色的同时,实现富有表现力的情感变化仍有改进的空间。

3、另一个限制是FunAudioLLM中的两个创新模型没有使用LLMs进行端到端的训练。这种流水线方法可能会引入错误传播,这可能会影响整体性能。

sensevoice 推理代码:

    def inference(
        self,
        data_in,
        data_lengths=None,
        key: list = ["wav_file_tmp_name"],
        tokenizer=None,
        frontend=None,
        **kwargs,
    ):


        meta_data = {}
        if (
            isinstance(data_in, torch.Tensor) and kwargs.get("data_type", "sound") == "fbank"
        ):  # fbank
            speech, speech_lengths = data_in, data_lengths
            if len(speech.shape) < 3:
                speech = speech[None, :, :]
            if speech_lengths is None:
                speech_lengths = speech.shape[1]
        else:
            # extract fbank feats
            time1 = time.perf_counter()
            audio_sample_list = load_audio_text_image_video(
                data_in,
                fs=frontend.fs,
                audio_fs=kwargs.get("fs", 16000),
                data_type=kwargs.get("data_type", "sound"),
                tokenizer=tokenizer,
            )
            # print(audio_sample_list)
            time2 = time.perf_counter()
            meta_data["load_data"] = f"{time2 - time1:0.3f}"
            speech, speech_lengths = extract_fbank(
                audio_sample_list, data_type=kwargs.get("data_type", "sound"), frontend=frontend
            )
            time3 = time.perf_counter()
            meta_data["extract_feat"] = f"{time3 - time2:0.3f}"
            meta_data["batch_data_time"] = (
                speech_lengths.sum().item() * frontend.frame_shift * frontend.lfr_n / 1000
            )

        speech = speech.to(device=kwargs["device"])
        speech_lengths = speech_lengths.to(device=kwargs["device"])
        print("speech", speech.shape, speech_lengths)
        language = kwargs.get("language", "auto")
        language_query = self.embed(
            torch.LongTensor(
                [[self.lid_dict[language] if language in self.lid_dict else 0]]
            ).to(speech.device)
        ).repeat(speech.size(0), 1, 1)
        print("language_query", language_query.shape)
        use_itn = kwargs.get("use_itn", False)
        textnorm = kwargs.get("text_norm", None)
        if textnorm is None:
            textnorm = "withitn" if use_itn else "woitn"
        textnorm_query = self.embed(
            torch.LongTensor([[self.textnorm_dict[textnorm]]]).to(speech.device)
        ).repeat(speech.size(0), 1, 1)
        print("textnorm_query", textnorm_query.shape)
        speech = torch.cat((textnorm_query, speech), dim=1)
        speech_lengths += 1
        print("speech_add_textnorm", speech.shape, speech_lengths)
        event_emo_query = self.embed(torch.LongTensor([[1, 2]]).to(speech.device)).repeat(
            speech.size(0), 1, 1
        )
        print("event_emo_query", event_emo_query.shape)
        input_query = torch.cat((language_query, event_emo_query), dim=1)
        print("input_query", input_query.shape)
        speech = torch.cat((input_query, speech), dim=1)
        speech_lengths += 3
        print("speech_final", speech.shape, speech_lengths)

        # Encoder
        encoder_out, encoder_out_lens = self.encoder(speech, speech_lengths)
        print("encoder_out", encoder_out.shape, encoder_out_lens)
        if isinstance(encoder_out, tuple):
            encoder_out = encoder_out[0]

        # c. Passed the encoder result and the beam search

        # 束搜索和CTC解码
        ctc_logits = self.ctc.log_softmax(encoder_out)

        results = []
        b, n, d = encoder_out.size()
        if isinstance(key[0], (list, tuple)):
            key = key[0]
        if len(key) < b:
            key = key * b
        for i in range(b):

#对每个 batch 样本提取 CTC logits 输出的前 encoder_out_lens[i] 帧。
#使用 argmax 找到每个时间步概率最大的类别 ID (yseq)。
#使用 torch.unique_consecutive 去除连续的重复类别 ID(CTC 解码中的常见步骤,用于去除重复的符号)。
            x = ctc_logits[i, : encoder_out_lens[i].item(), :]
            yseq = x.argmax(dim=-1)
            yseq = torch.unique_consecutive(yseq, dim=-1) # 使用 torch.unique_consecutive 去除连续的重复类别 ID(CTC 解码中的常见步骤,用于去除重复的符号)

            ibest_writer = None
            if kwargs.get("output_dir") is not None:
                if not hasattr(self, "writer"):
                    self.writer = DatadirWriter(kwargs.get("output_dir"))
                ibest_writer = self.writer[f"1best_recog"]

#使用 mask 去掉 CTC 解码中的 blank ID。
#将整数 ID 列表转化为对应的字符或单词(通过 tokenizer.decode)。
            mask = yseq != self.blank_id
            token_int = yseq[mask].tolist()

            # Change integer-ids to tokens
            text = tokenizer.decode(token_int)

            result_i = {"key": key[i], "text": text}
            results.append(result_i)

            if ibest_writer is not None:
                ibest_writer["text"][key[i]] = text

        return results, meta_data

CTC使用blank id来对齐不同长度的输入和输出:

  • 在语音识别等任务中,输入的语音帧数往往远多于输出的字符数。CTC 通过引入 blank ID 来解决这个问题,使模型能够生成对齐(alignment),从而允许输入长度大于输出长度。
  • blank 用来表示在某个时间步模型没有输出任何字符,或者保持上一个字符的状态不变。

去除重复和冗余:

  • 语音帧与字符之间的对齐并不是一一对应的,CTC 会允许模型在多个时间步中输出相同的字符,同时在其他时间步输出 blank
  • 解码过程中,当遇到连续的相同字符时,只保留第一个字符,忽略重复出现的字符和 blank,这帮助去除冗余。
  • 例如,模型输出可能是 [a, blank, blank, a, a, blank, t, blank, blank],最终解码结果会变为 "a, t"