用神经声码器LPCNet进行1600bit / s语音编码



这是有关LPCNet第一篇文章的续篇 。 在第一个演示中,我们提出了一种将信号处理和深度学习相结合的体系结构 ,以增强神经语音合成的有效性。 这次,我们将把LPCNet变成具有非常低比特率的神经语音编解码器(请参阅科学文章 )。 它可以在当前设备甚至电话上使用。

神经声码器首次在电话的一个处理器内核上实时工作,而不是在高速GPU上实时工作。 最终的1600 bps比特率大约是普通宽带编解码器的十倍。 其质量要比现有的具有非常低比特率的声码器好得多,并且可以与使用更高比特率的更传统的编解码器相媲美。

波形编码器和声码器


语音编解码器有两种大类型:波形编码器和声码器。 波形编码器包括Opus,AMR / AMR-WB和所有可用于音乐的编解码器。 他们尝试提供尽可能接近原始波形的解码波形-通常会考虑一些感知特征。 另一方面,声码器实际上是合成器。 编码器提取有关语音路径的音高和形状的信息,将该信息传递给解码器,然后他重新合成语音。 几乎就像语音识别,然后在语音合成器中读取文本一样,不同的是文本编码器比语音识别更简单/更快(并且传达了更多的信息)。

声码器自20世纪70年代就已经存在,但是由于其解码器执行语音合成,因此它们不可能比传统的语音合成系统好得多,后者直到最近听起来简直糟透了。 这就是为什么声码器通常以低于3 kB / s的速度使用的原因。 此外,波形编码器可提供最佳质量。 这种情况一直持续到最近,当诸如WaveNet之类的神经语音合成系统出现时 。 突然之间,合成听起来好多了,当然,有些人想从WaveNet制作声码器

LPCNet概述


WaveNet产生非常高质量的语音,但是需要数百吉比特的计算能力。 LPCNet大大降低了计算复杂度。 声码器基于WaveRNN,它使用递归神经网络(RNN)和稀疏矩阵来改进WaveNet。 LPCNet通过线性预测 (LPC)进一步增强了WaveRNN,在老式声码器中效果很好。 它根据先前样本的线性组合来预测样本,最重要的是,它使它比神经网络快许多倍。 当然,它不是通用的(否则70年代的声码器听起来不错),但是它可以大大减轻神经网络的负担。 这样一来,您可以使用比WaveRNN小的网络,而无需牺牲质量。


让我们仔细看看LPCNet。 左侧的黄色部分每帧计算一次,其输出用于右侧的网络采样频率(蓝色)。 计算单元基于先前的样本和线性预测系数来预测时间t处的样本。

压缩特性


LPCNet从每帧20个字符的向量中合成语音,持续10 ms。 其中,有18个符号是表示频谱形状的倒频谱系数。 其余两个描述高度:一个参数用于音调周期(音调周期),另一个参数用于强度 (如果您通过音调引入延迟,则信号与自身的相关程度)。 如果以浮点值的形式存储参数,则在存储或传输期间,所有这些信息最多需要64 kbit / s。 这太多了,因为即使Opus编解码器也仅以16 kbit / s(对于16 kHz单声道)提供非常高质量的语音编码。 显然,您需要在此处应用强压缩。

身高


所有编解码器都严重依赖音调,但是与波形编码器不同,波形编码器仅“音调”有助于减少冗余,而声码器则没有后退。 如果您选择了错误的高度,它们将开始发出声音差(甚至难以辨认)的语音。 LPCNet编码器在不赘述的情况下(请参阅科学文章)正在努力避免在高度上犯错误。 搜索从搜索语音信号中的时间相关性开始。 参见下面的典型搜索工作原理。


音调是重复音调的时间段。 动画会延迟搜索与信号x(n)及其副本x(nT)之间的最大相关性对应的步骤。 具有最大相关性的T值是高度的间距

该信息需要使用尽可能少的位进行编码,而不会降低结果的质量。 由于我们可以自然地以对数尺度感知频率(例如,每个音乐八度音阶将以前的频率加倍),因此在对数编码中这是有意义的。 在大多数人中,语音信号的高度在62.5到500 Hz之间(我们此处不尝试覆盖女高音)。 使用7位(128个可能的值),我们得到的分辨率约为四分之一音(与re和re之间的差是一个音)。

那么,高度完成了吗? 好吧,不是那么快。 人们不像1960年代电影中的机器人那样说话。 即使在40毫秒的数据包内,音高也会有所不同。 您需要考虑到这一点,保留用于更改高度的参数的位:3位以对数据包开始和结束之间的差异进行编码,最多不超过2.5个半音。 最后,您需要编码音高阶跃的相关性,以区分元音和辅音(例如s和f)。 两位足够用于相关。

倒谱


音调包含语音的外部特征(韵律,情感,强调等),而频谱特征则决定说话的内容 (除了音调语言(例如中文,音调对于含义很重要)之外)。 对于任何元音,声带产生的声音几乎相同,但是声道的形状决定了将说出哪种声音。 语音路径充当过滤器,编码器的任务是评估该过滤器并将其传递给解码器。 如果将频谱转换为频谱,则可以有效地做到这一点(是的,这是一个字母顺序改变的“频谱”,在数字信号处理中我们是可笑的家伙)。

对于16 kHz的输入信号,倒频谱基本上代表每10 ms 18个数字的向量,需要尽可能地对其进行压缩。 由于我们在40 ms的数据包中有四个这样的向量,并且它们通常彼此相似,因此我们希望尽可能地消除冗余。 这可以通过使用相邻向量作为预测变量并仅传达预测与实际值之间的差异来完成。 同时,如果其中一个消失了,我们不想过分依赖以前的软件包。 看来问题已经解决了...

如果您只有锤子,那么一切看起来都像钉子-亚伯拉罕·马斯洛(Abraham Maslow)。

如果您使用视频编解码器进行 大量工作 ,那么您可能会想到B帧的概念。 与视频编解码器不同,视频编解码器将一帧分为许多数据包,相反,我们在一个数据包中有许多帧。 我们首先对关键帧 (即独立向量)和数据包的末尾进行编码。 使用矢量量化 (VQ)对该矢量进行编码,无需预测,占用37位:7代表总能量(第一倒频谱系数),30代表其他参数。 然后是(分层的)B帧。 在这两个关键字中(一个来自当前软件包,一个来自上一个关键字),可以预测它们之间的倒谱。 作为对实际值和预测之间的差异进行编码的预测器,可以选择两个关键帧之一或它们的平均值。 我们再次使用VQ并使用总共13位(包括预测变量的选择)对该向量进行编码。 现在我们只剩下两个向量和很少的位。 使用后3位可以简单地为其余向量选择预测变量。 当然,图中所有这些都容易理解:


包k的倒谱预测和量化。 绿色向量被独立量化,蓝色向量被预测,红色向量使用预测而没有残留量化。 预测用箭头表示。

全部放在一起


加上以上所有内容,我们每40毫秒数据包可获得64位或每秒1600位。 如果要计算压缩率,则未压缩的宽带语音为256 kbps(16 kHz,每个样本16位),这意味着160倍的压缩率! 当然,您始终可以使用量化器并获得较低或较高的比特率(对质量有相应的影响),但是您需要从某个地方开始。 这是一张表格,其中列出了这些位的位置。

位分配
参量
节距6
高度调制3
海拔相关2
能量7
独立倒谱VQ(40毫秒)30
预测的VQ倒谱(20 ms)13
倒谱倒插(10 ms)3
合计64

每个数据包64位40 ms,每秒25个数据包,可获得1600 bps。

实作


LPCNet源代码在BSD许可下可用。 它包括一个简化编解码器使用的库。 请注意,开发尚未完成:格式和API都必将发生变化。 该存储库还具有一个lpcnet_demo演示应用程序,可以在其中轻松地从命令行测试编解码器。 有关完整说明,请参见README.md文件。

谁想要更深入地研究,可以选择训练新模型和/或将LPCNet用作其他应用程序的构建基块,例如语音合成(LPCNet只是合成器的一个组件,它不能自行执行合成)。

性能表现


神经语音合成需要大量资源。 在去年的ICASSP会议上,来自Google / DeepMind的Bastian Klein和同事提出了一个基于WaveNet的2400 bps编解码器 ,并从codec2接收了比特流。 尽管听起来很棒,但是数百吉比特的计算复杂性意味着,如果没有昂贵的GPU和认真的努力,就无法实时启动它。

相反,我们的1600 bit / s编解码器仅产生3 gigaflops,旨在在价格更便宜的设备上实时工作。 实际上,它现在可以在实际应用中使用。 为了进行优化,需要为AVX2 / FMA和Neon指令集编写一些代码(仅嵌入式代码,不带汇编器)。 因此,我们现在不仅可以在PC上,也可以在或多或少的现代手机上实时编码(尤其是解码)语音。 以下是x86和ARM处理器的性能。

性能表现
中央处理器频次一核心的百分比实时
AMD 2990WX(剥线器)3.0 GHz *14%7.0倍
英特尔至强E5-2640 v4(Broadwell)2.4 GHz *20%5.0倍
骁龙855( Galaxy S10上为Cortex-A76)2.82 GHz31%3.2倍
骁龙845( Pixel 3上的Cortex-A75)2.5 GHz68%1.47倍
AMD A1100(Cortex-A57)1.7 GHz的102%0.98倍
BCM2837(Raspberry Pi 3上的Cortex-A53)1.2 GHz310%0.32倍
*涡轮模式


这些数字很有趣。 尽管只显示了Broadwell和Threadripper,但是在x86平台上,Haswell和Skylake处理器具有类似的性能(考虑到时钟频率)。 但是,ARM处理器彼此之间明显不同。 即使考虑到频率差异,A76的速度也比A53快五到六倍:这是可以预料的,因为A53主要用于提高能源效率(例如,在big.LITTLE系统中)。 尽管如此,LPCNet可能仅使用一个内核就可以在现代电话上实时工作。 尽管在Raspberry Pi 3上实时运行它会很不错,但到目前为止,还没有,但是没有什么是不可能的。

在x86上,性能限制的原因是理论最大值的五倍。 如您所知,矩阵向量乘法运算的效率比矩阵矩阵运算低,因为每个运算的下载量更多-具体来说,每个FMA操作只有一个矩阵下载。 一方面,性能与二级缓存有关,后者每个周期仅提供16位。 另一方面,英特尔声称L2在Broadwell上每个周期最多可以放弃32位,在Skylake上每个周期最多可以放弃64位。

结果


我们进行了MUSHRA风格的音频测试,以比较编码质量。 测试条件:

  • 样本 :原始(如果您获得比原始结果更好的结果,则您的测试显然存在问题)
  • 1600 bps LPCNet :我们的演示
  • 未压缩的LPNet第一篇文章中的 “具有122个等效单位的LPNet”
  • Opus 9000 bps宽带 :Opus 1.3编码宽带音频的最低比特率
  • 2400 bps的MELP :低比特率的著名声码器(质量类似于编解码器2)
  • Speex 4000 bps :永远不要使用这种宽带声码器,但它是底部的一个很好的参考

在第一个测试(第1组)中,我们有八个男人和两个女人的陈述的语音片段。 第一组中的文件属于用于训练的相同数据库(即,相同的记录条件),但是这些特定人员被排除在训练集中。 在第二个测试(第2组)中,我们使用了Opus测试中的一些文件(未压缩),在不同条件下录制声音,以确保LPCNet可以进行某种概括。 在这两个测试中,每个参与者100名,因此误差非常小。 请参阅下面的结果。


两次测试的主观质量(MUSHRA)

总的来说,LPCNet的1600 bps看起来不错-比2400 bps的MELP更好,并且不落后于Opus 9000 bps。 同时,未压缩的LPCNet在9000 bps的质量上比Opus稍好。 这意味着可以在2000-6000 bps的比特率下提供比Opus更好的质量。

听你自己


以下是音频测试的示例:

女人(1套)


男人(一套1)


混合(组2)



可以在哪里使用?


我们认为这本身就是一项很酷的技术,但它也有实际应用。 这里只是一些选择。

连接不良的国家/地区的VoIP


并非每个人都总是有高速连接。 在某些国家/地区,通讯非常缓慢且不可靠。 1600位语音编解码器在这种情况下可以正常工作,甚至出于可靠性考虑甚至多次发送数据包。 当然,由于包头的开销(IP + UDP + RTP为40字节),最好制作更大的包:40、80或120 ms。

业余/高频广播


十年来, David Rowe一直致力于无线电通信的语音编码。 他开发了Codec2 ,它以700到3200 bps的速度传输语音。 在过去的一年中,David和我讨论了如何使用神经综合来改进Codec2,现在我们终于做到了。 David在他的博客中了他自己的基于LPCNet的编解码器实现与FreeDV集成的实现

丢包可靠性更高


以少量的比特编码质量好的比特流的能力对于在不可靠的信道上提供冗余很有用。 Opus具有称为LBRR的前向纠错(FEC)机制,该机制以较低的比特率编码前一帧并在当前帧中发送它。 它运作良好,但会增加大量开销。 1600 bit / s的流复制效率更高。

计划


使用LPCNet的可能性更多。 例如,改进现有编解码器(相同的Opus)。 与其他编解码器一样,Opus质量在非常低的比特率(低于8000 bps)下会迅速下降,因为波形编解码器没有足够的比特来匹配原始比特。 但是,传输的线性预测信息足以使LPCNet合成听起来不错的语音-优于Opus在此比特率下的表现。 此外,Opus传输的其余信息(残差预测)有助于LPCNet综合获得更好的结果。 从某种意义上讲,LPCNet可以用作精美的后置过滤器,以提高Opus(或其他任何编解码器)的质量,而无需更改位流(即,同时保持完全兼容性)。

其他资源


  1. J.-M. Valin, J.Skoglund使用LPCNet的1.6 Kbps宽带神经声码器 ,已发送至Interspeech 2019 ,arXiv: 1903.12087
  2. J.-M. Valin,J。Skoglund, LPCNet:通过线性预测进行高级神经语音合成 ICASSP,2019 ,arXiv: 1810.11846
  3. A.van den Oord,S.Dileman,H.Zen,K.Simonyan,O.Vinyals, A.Graves ,N.Kalkhbrenner, E.Senor ,K.Kavukuglu, WaveNet:未处理声音的生成模型 ,2016年。
  4. N.Karlbrenner,E.Elsen,C.Simonyan,S.Nouri,N.Casagrande,E.Lockhart,F.Stimberg,A.van den Oord,S.Dileman,K。
  5. V.B. Klein,F.S.K。Lim,A.Lyubs,J.Skoglund,F.Stimberg,K.Wang,T.S.Walters, 基于Wavenet的低比特率语音编码 ,2018年
  6. LPCNet 的源代码
  7. David Rowe 基于LPCNet的FreeDV编解码器
  8. 在irc.freenode.net上加入关于#opus开发的讨论(→ Web界面

Source: https://habr.com/ru/post/zh-CN446656/


All Articles