突破压缩极限的AI语音编解码器

news2025/2/27 21:15:49

I. Speech Codecs

语音编码的目的是在保持语音质量的前提下尽可能地减少传输所用的带宽,主要是利用人的发声过程中存在的冗余度和人的听觉特性达到压缩的目的。经过了多年的发展,目前语音编解码器大致可以分为以下几类:

  1. 波形编码,将时域波形经过采样量化编码,常见的就是PCM编码格式

  1. 参数编码,根据人的发声机制建立数学模型,然后对语音进行压缩,常见的是LPC-10

  1. 混合编码,结合波形编码和参数编码的压缩方式,常见的AMR等

  1. 深度学习编码,利用神经网络将语音编码成隐向量,然后利用神经网络将其恢复成语音信息,微软的Satin以及今天要介绍的Lyra就是其代表

虽然目前很多领域仍是直接把PCM封装成IP包进行传输,但是在带宽限制的领域,如VoIP语音会议,语音编解码是较为关键的技术之一。

II. Lyra

Lyra去年就已经在Github上开源了,并且同时支持Linux和Android系统。当时年轻的我使用VM创建了一个Ubuntu的虚拟机,许多个夜晚睡觉前敲下编译命令:

bazelbuild-copt:encoder_main

第二天兴冲冲地醒来却发现虚拟机已经卡死。如今我吸取了以前的教训,首先我升级了硬件,给我的暗影精灵增加了4G的内存条,然后我抛弃了VM转投双系统的怀抱,关于如何装双系统可以参考我的博客。本以为天时地利人和皆在我,但还是由于一些环境和网络问题花了很多精力才编译成功,如果你不想自己编译的话,本文末尾有对应链接。如果你想自行编译的话,这里给你一些我踩过的坑:1)删除WORKSPACE中关于Android SDK和NDK的repo;2)科学上网采用全局模式。

废话不多说了,我们直接进入正题。目前常用的编解码器Opus是一种混合编解码器,对于窄带语音信号使用SILK进行编码,对于宽带和超宽带使用CELT编码。

而Lyra的整体流程如下所示:

可以看出Lyra整体流程非常简单,在编码过程中,Lyra每40ms提取一次特征,所使用的特征是160维的log melspectrum,然后将它们量化到3kbps;在解码过程中,则使用生成模型将量化后的特征重构语音信号,如果读者对语音合成或者语音转换等任务有所了解的话,那么对解码部分应该不会感到陌生。可惜的是Google只开源了应用,没有开源如何训练这个模型,因此具体的网络结构也不得而知,只能从部分代码中窥探一二。

III. Experiment

下面我们看下Lyra编解码的效果,原始音频如下所示,可以看到原始音频音量比较小,并且能量大多集中在5K以下,该样本PCM格式文件大小的为236KB。

Lyra编码后的文件大小为2.77KB,解码后的音频如下所示,可以看到Lyra一些原始音频中的频率成分没有正确的重构,但同时一些背景噪声也被抑制干净。

从频响曲线中看得更明显:

Lyra中高频部分明显低于原始音频,但是低频部分保留的较为完整,这就可以满足听得懂这个最低的要求。但是由于高频的缺失会导致,听起来声音很闷,不够明亮。由于本人精力有限,没有办法进行较为详细的评测,读者要是有兴趣可以自行实验。

IV. Conclusion

总的来说,对于一个实用的语音编解码应该满足两个部分:

  • 合理的时间复杂度

  • 处理多种多样的语音输入

对于第一点可以通过轻量化模型的方法比如稀疏模型或者使用GRU的生成模型代替WaveNet这种计算量巨大的模型;对于第二点,可以使用频谱特征,并且在训练的过程设计损失函数对待噪声的样本进行一定程度的惩罚。

那么语音编解码的终极模式是什么样子的呢?


本文相关代码在公众号语音算法组菜单栏点击Code获取


参考文献:

[1]. https://ai.googleblog.com/2021/02/lyra-new-very-low-bitrate-codec-for.html

[2]. https://github.com/google/lyra

[3]. https://wenku.baidu.com/view/9be752ee5bf5f61fb7360b4c2e3f5727a5e92466.html

[4]. https://en.wikipedia.org/wiki/Category:Speech_codecs

[5]. On the information rate of speech communication

[6]. GENERATIVE SPEECH CODING WITH PREDICTIVE VARIANCE REGULARIZATION

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/347248.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

c++ 指针、引用和常量

指针、引用和常量的关系_夜悊的博客-CSDN博客 1. ① 指针是对象,引用不是对象(在此可以理解为变量,一个变量是一个对象) 指针不必须初始化引用只是为一个已经存在的对象所起的另一个名字(别名)&#xff…

亚马逊云科技汽车行业解决方案

当今,随着万物智联、云计算等领域的高速发展,创新智能网联汽车和车路协同技术正在成为车企加速发展的关键途径,推动着汽车产品从出行代步工具向着“超级智能移动终端”快速转变。 挑战无处不在,如何抢先预判? 随着近…

安装 GPU 版本的 tensorflow 完整版本

前言: 之前安装的 CPU 版本的 tensorflow 一直出问题,索性就直接安装 GPU 版本的 tensorflow 了(有了GPU 就不能浪费)。 安装过程: 1)看自己有无 GPU,找到对应 GPU 的版本:任务管理…

C生万物 | 常量指针和指针常量的感性理解

文章目录📚引言✒常量指针🔍介绍与分析📰小结与记忆口诀✒指针常量🔍介绍与分析📰小结与记忆口诀👉一份凉皮所引发的故事👈总结与提炼📚引言 本文我们来说说大家很困惑的两个东西&am…

【蒸滴C】C语言指针入门很难?看这一篇就够了

目录 一、前言 二、指针是什么 小结: 三、指针变量是什么 小结: 四、指针在32位机器和64位机器中的差别 32位机器: 64位机器: 小结: 五、指针和指针类型 (1)指针的意义 (2&#xff…

springboot自动配置原理以及spring.factories文件的作用详解

一、springboot 自动配置原理先说说我们自己的应用程序中Bean加入容器的办法:bean加入容器我们在应用程序的入口设置了 SpringBootApplication标签,默认情况下他会扫描所有次级目录。如果增加了 scanBasePackages属性,就会扫描所有被指定的路…

SAP ABAP根据事务码查找增强最直接的方法

下面是为任意事务代码查找用户出口的步骤: 方法一: 第 1 步:使用 事务代码:SE93。输入您要搜索用户出口的 事务代码。 在我们的场景中,我们将使用 CO11N。 第 2 步:点击显示: 第 3 步&#xf…

2023年浙江安全员精选真题题库及答案

百分百题库提供建筑安全员考试试题、安全员证考试真题、安全员证考试题库等,提供在线做题刷题,在线模拟考试,助你考试轻松过关。 268.注册执业人员未执行法律法规和工程质量强制性标准,造成重大安全事故的,(). A.停止执业 B.5年不予注册 C.10年不予注…

29-Golang中的切片

Golang中的切片基本介绍切片在内存中的形式切片使用的三种方式方式一:方式二:方式三:切片使用的区别切片的遍历切片注意事项和细节说明append函数切片的拷贝操作string和slice基本介绍 1.切片是数组的一个引用,因此切片是引用类型…

采用Spring配置文件管理Bean

文章目录采用Spring配置文件管理Bean(一)创建Maven项目(二)添加Spring依赖(三)创建杀龙任务类(四)创建勇敢骑士类(五)采用传统方式让勇敢骑士完成杀龙任务&am…

2.14日报

今日修改token传参异常bug 国际化bug修复:code中的success只有第一次调用识别lang 没继承BaseController 异常处理的三种方式 1|0一. Controller层面上异常处理 ExceptionHandler 说明:针对可能出问题的Controller,新增注解方法ExceptionHandler. Con…

论文投稿指南——中文核心期刊推荐(农学)

【前言】 🚀 想发论文怎么办?手把手教你论文如何投稿!那么,首先要搞懂投稿目标——论文期刊 🎄 在期刊论文的分布中,存在一种普遍现象:即对于某一特定的学科或专业来说,少数期刊所含…

进程调度(4.1)

进程调度 进程调度是操作系统的基本功能,在多道程序系统中,内存中有多个进程,每个进程交替的去使用处理机,而合理的调度是至关重要的。处理机的调度有三种类型,分别是高级调度、中级调度、低级调度,其中低…

dvwa靶场上的 RCE漏洞+暴力破解的简单学习

记录一下自己重新开始学习web安全之路⑦。 操作系统的一些简单基础: windows: 查询IP地址:ipconfig 查看完整的网卡信息:ipconfig/all 列出当前目录下的文件信息:dir 切换目录:cd 读取文件内容&…

PID控制算法进阶

关于PID控制算法基础概念在本文不再重复了,详情可参考:PID控制算法基础介绍 本文主要从PID算法代码实现,代码解析,理论进阶,PID调参等方向进行阐述。 目录位置式PID和增量式PID1.1 位置式PID1.2 增量式PID1.3 位置式和…

Spring3之基于Aspect实现AOP

简介 使用 Aspect 搭配 Spring 可轻松实现 AOP;本章将通过一个完整示例演示如何实现这一功能 实现步骤 修改 beans.xml 配置文件的 schema 部分;可以在 spring-framework-reference.html 文件通过搜索关键字 “/aop” 找到配置 schema,然后…

Linux安装ElasticSearch

下载地址:https://www.elastic.co/cn/downloads/past-releases#elasticsearch 1 版本选择 ElasticSearch 7 及以上版本都是自带的 jdk,假如需要配置指定的 jdk 版本的话,可以在 es 的 bin 目录下找到elasticsearch-env.bat 这个文件&#x…

(学习日记)2023.2.12

写在前面: 由于时间的不足与学习的碎片化,写博客变得有些奢侈。 但是对于记录学习(忘了以后能快速复习)的渴望一天天变得强烈。 既然如此 不如以天为单位,以时间为顺序,仅仅将博客当做一个知识学习的目录&a…

谷粒商城:订单中心概念解析

1、订单中心 电商系统涉及到 3 流,分别时信息流,资金流,物流,而订单系统作为中枢将三者有机的集 合起来。 订单模块是电商系统的枢纽,在订单这个环节上需求获取多个模块的数据和信息,同时对这 些信息进行加…

千峰jquery进阶内容

封装选项卡&#xff1a; HTML部分&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta http-equiv"X-UA-Compatible" content"IEedge" /><meta name"viewport&…