Lyra编码器基础环境搭建

Lyra介绍

Google最近开源了一种语音压缩的新型超低比特率编解码器,这种编码器的最大特点是基于机器学习原理,能够使用最少的数据来重建语音,这是和传统AAC和Opus编码原理的本质区别,这种基于机器学习的编码思想也逐渐应用的图像编码和视频编码上。

其次Lyra牛逼的地方在于不仅实现了以每秒3kb网络宽带提供听起来自然清晰的语音聊天,还可以在仅90ms延迟的情况下在从高端云服务器到中端智能手机的任何设备上运行。

随着谷歌的推广,估计WebRTC后续也有相关动作支持起来,特别在网络比较差带宽较低的场景下进行实时音视频互动有一定的优势。目前已经在Google Duo中进行了应用。

Lyra代码使用C ++编写,以实现速度,效率和互操作性,并使用带有Abseil的Bazel构建框架和用于全面单元测试的GoogleTest框架。核心API提供了用于在文件和数据包级别进行编码和解码的接口。还提供了完整的信号处理工具链,其中包括各种滤波器和变换
Lyra编码器基础环境搭建_第1张图片

Google Lyra是一种基于生成模型的新语音压缩方法,通过极大地提高原始语音的声音质量(即大约需要8-16 kbps),可以仅以3 kbps的低带宽获得透明质量
语音压缩具有与音频压缩,图像压缩和视频压缩不同的特征。例如,音频压缩已经演变成一种模型化人耳特性的方法,而不是声源生成模型,而是听觉模型,因为它必须处理多种声源结合在一起的形式。图像压缩部分反映了低频成分比高频成分在视觉上更敏感的视觉特征,但是它没有积极地利用语音压缩或音频压缩等认知特征。视频压缩基本上基于图像压缩技术,并且添加了在时间序列上利用相邻图像的高度相似性的运动跟踪技术。

另一方面,由于已经清楚地识别了声音产生的机理,因此已经开发了压缩技术作为对人声器官进行建模的方法。具体地,取决于由肺的收缩引起的呼气是否通过声带而产生发声或不发声的信号,并且根据嘴的形状和舌头的位置来强调特定的频率范围。为此,低频带语音压缩算法提取人声振动频率(F0),有声或无声声音(发声/无声)和频率增强形式(频谱包络)作为参数,对其进行量化,传输,然后合成它们。这种方法称为参数语音编码,与Google Lyra基本具有相同的结构。

在各种语音压缩技术中,格里芬(Griffin)于1987年发布的MBE(多频带激励)也具有参量语音编码结构。 MBE将频域划分为相等大小的频带,传输这些频带的能量,并确定每个频带的有声/无声信息。如果是特征部分,则MBE解码器(即恢复语音信号的部分)将使用Griffin-Lim算法,该算法与基于深度学习的TTS中广泛使用的算法相同。任何信号都可以表示为多个正弦波之和,每个正弦波都有自己的能量和相位信息。 Griffin-Lim算法是一种在仅提供能量而没有相位信息的情况下恢复信号的方法,与WaveNet系列算法相比,Griffin-Lim算法在音质方面有根本的局限性。

尽管尚未公开有关Google Lyra的技术细节,但已知遵循类似于混合激励线性预测(MELP)的方法。 MELP与MBE相似,但是与MBE相比,MELP通过计算和传输线性预测系数来提高效率,MBE将频谱包络表示为每个频带的能量。另外,不是每个频带都发送浊音信息,而是利用低频区域存在浊音而高频区域存在浊音这一事实,仅发送截止频率。表达。

据此预测,假定Google Lyra具有类似于MELP的结构,但使用WaveRNN代替Griffin-Lim算法作为合成器。在基于深度学习的TTS的情况下,即使编码器部分相同,但考虑到音质差异很大,通过用WaveRNN代替Griffin-Lim代替MELP合成器似乎可以显着提高音质合成器算法的类型。

与Griffin-Lim相比,WaveRNN仍然非常复杂,语音信号传输所需的带宽明显低于图像和视频,因此增加压缩率的需求确实较低。例如,如果将16 kbps降低到3 kbps,则带宽减少到1/5,但是考虑到传输Full-HD视频所需的带宽为几Mbps或更高,则总减少量仅为1%。因此,将Google Lyra之类的技术应用于YouTube之类的视频服务似乎没有太大的必要。取而代之的是,它将对近年来使用迅速增长的基于音频的服务(例如Clubhouse)非常有用,在这种情况下,主要的技术挑战将是降低复杂性,即在设备上的操作越多越好。现有的语音压缩技术已经在智能手机中得到了有效的实施,电池消耗将大大降低。
Lyra是使用Google的构建系统Bazel构建的.可以使用bazel从Linux上构建Lyra,将其用于arm android目标或linux目标。 android目标针对实时性能进行了优化。 linux目标通常用于开发和调试。

编译器的概念

LLVM编译器(三大编译器:gcc、llvm、clang)

Clang 是LLVM的前端,可以用来编译C,C++,ObjectiveC等语言。Clang则是以LLVM为后端的一款高效易用,并且与IDE 结合很好的编译前端。
Clang 只支持C,C++和Objective-C三种语言

环境搭建–Bazel环境安装

我的环境是Ubuntu 20.04 LTS (win10上运行的Ubuntu子系统)

①安装所需的软件包:

sudo apt-get install pkg-config zip g++ zlib1g-dev unzip python 

② 下载Bazel

GitHub 地址为:

https://github.com/bazelbuild/bazel/releases

我下载 的是 bazel-4.0.0-installer-linux-x86_64.sh 这个文件

③ 运行安装程序

chmod +x bazel-4.0.0-installer-linux-x86_64.sh

./bazel-4.0.0-installer-linux-x86_64.sh --user

--user标志将Bazel安装到 $HOME/bin系统上的目录并设置.bazelrc路径$HOME/.bazelrc。使用--help命令查看其他安装选项。

④设置环境

如果您使用上述–user标志运行Bazel安装程序,则Bazel可执行文件将安装在您的$HOME/bin目录中。将此目录添加到默认路径是一个好主意,如下所示:

export PATH="$PATH:$HOME/bin"   如:export PATH="$PATH:/root/bin" 

环境搭建–安装所需工具

sudo apt update
sudo apt install ninja-build git cmake clang python

环境搭建–安装特定版本的clang

git clone https://github.com/llvm/llvm-project.git

cd llvm-project

git checkout 96ef4f307df2

mkdir build_clang

cd build_clang

cmake -G Ninja -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ -DLLVM_ENABLE_PROJECTS="clang" -DCMAKE_BUILD_TYPE=release ../llvm

ninja

sudo $(which ninja) install

sudo ldconfig

至此,环境已经准备好

lyra代码下载

github地址为 :

https://github.com/google/lyra

运行测试用例

1.可以使用默认配置来构建cc_binaries。 encoder_main是编码器的示例

	bazel build -c opt :encoder_main

2.可以运行encoder_main来对其中带有某些语音的test.wav文件进行编码,该文件由–input_path指定。 --model_path标志包含编码所需的模型数据,而–output_path指定将编码(压缩)表示形式写入的路径

bazel-bin/encoder_main --model_path=wavegru --output_dir=$HOME/temp --input_path=testdata/16khz_sample_000001.wav

3.类似地,可以构建decoder_main,并在encoder_main的输出上使用它,以将编码后的数据解码回语音。

bazel build -c opt :decoder_main

bazel-bin/decoder_main  --model_path=wavegru --output_dir=$HOME/temp/ --encoded_path=$HOME/temp/16khz_sample_000001.lyra

你可能感兴趣的:(lyra,音视频)