Opus编解码器中音乐检测的奥秘

Opus是一个有损音频压缩的数字音频编码格式,由Xiph.Org基金会开发,之后由互联网工程任务组(IETF)进行标准化,目标是希望用单一格式包含声音和语音,取代Speex和Vorbis,且适用于网络上低延迟的即时声音传输,标准格式定义于RFC 6716文件。Opus格式是一个开放格式,使用上没有任何专利或限制。Opus编码不同声音编码格式的比特率、采样率与延迟性如下图所示:

图片

Opus支持语音(SILK层)和音乐(CELT层)的单独或混合模式,它们对应的比特率范围如下所示:

图片

Opus1.1 音乐检测算法

在比较早的版本需要开发者手动选择是音乐还是语音,但是在1.1这个版本,提出了根据输入音频内容自动选择对应的模式,其原理如下所示:

图片

在这个版本首先提取对应音频的BFCC系数(就是RNNoise里的特征),并对系数进行一阶二阶差分,除此之外还使用了在可变比特率(VBR)计算中得出的音调估计,以及一些在编码过程中先前计算过的其他指标。然后将这些特征融合在一起送入多层感知机(multi-layer perceptron,MLP)。值得一提的是Xiph.Org基金会的开发者一开始有使用过基于高斯混合模型进行音乐检测,但其检测效果不佳,最终被神经网络替代。

神经网络输出仅仅是当前帧为音乐的概率。为了进一步引入时序的信息进行音乐判决Xiph.Org基金会的开发者引入了隐马尔科夫模型(可以参考从零实现机器学习算法(十七) 隐马尔可夫模型)。一般而言,输入信号短时间内在语音和音乐之间互转是个极小概率事件。因此我们将音频行为建模为一个隐马尔可夫模型,假设在给定的10毫秒内从语音过渡到音乐(反之亦然)的概率为0.00005,这相当于平均每200秒发生一次状态转移。

图片

基于隐马尔可夫模型的时间统计模型,通过对神经网络的瞬时概率输出进行加权和积分。最终,编码器将计算的概率与一个取决于比特率、带宽、帧大小和应用的切换阈值进行比较,以确定编码模式。由于整体的检测没有lookahead(opus后续版本支持可设定lookahead),这会导致音乐检测结果没有那么准确,然而这点会使得整体音频听起来更柔和一点。

图片

Opus1.3 音乐检测算法

Xiph.Org基金会的开发者在Opus1.3的版本中提出了新一代的音乐检测器。使用门控循环单元(Gated Recurrent Unit,GRU)构建模型进行音乐检测,由于本质是个分类任务,因此模型构建的较为轻量,整体网络结构如下所示,只有4986个参数。由于是端到端的神经网络能介绍的不多,需要提一点的是,1.3版本在最终的决策上也有所优化。特别是当lookahead启用时,Opus能够在语音和音乐之间转换之前的静默期切换编码器的模式。

图片

最后我们把两个版本结果对比一下,如图所示,其中蓝色的是1.1版本的检测结果,红色是1.3版本的检测结果。可以明细看出,使用GRU作为网络结构的检测结果要优于MLP+HMM的检测结果,在语音/音乐切换的边缘,决策也更为准确。

图片

参考文献:

[1]. https://web.archive.org/web/20170430223047/https://people.xiph.org/~xiphmont/demo/opus/demo3.shtml

[2]. https://jmvalin.ca/opus/opus-1.3/

[3]. https://zh.wikipedia.org/wiki/Opus_(%E9%9F%B3%E9%A2%91%E6%A0%BC%E5%BC%8F)

[4]. https://jmvalin.ca/papers/aes135_opus_celt.pdf

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Polynomial(Linear) Regression 多项式线性回归

介绍: 多项式线性回归是一种线性回归的扩展,它允许我们在模型中使用多项式函数来拟合数据。 线性回归模型假设因变量与自变量之间存在线性关系,即通过一个直线来拟合数据。但是,在某些情况下,数据可能不适合使用直线…

03 使用Vite开发Vue3项目

概述 要使用vite创建Vue3项目,有很多种方式,如果使用命令,则推荐如下命令: # 使用nvm将nodejs的版本切换到20 nvm use 20# 全局安装yarn npm install -g yarn# 使用yarnvite创建项目 yarn create vite不过,笔者更推荐…

2024年软件测试入坑指南,新人必看系列

本科非计算机专业,在深圳做了四年软件测试工作,从之前的一脸懵的点点点,到现在会点自动化测试,说一点点非计算机专业人员从事软件测试的心得体会,仅供参考交流。 如果你是非计算机专业,毕业不久&#xff0…

排序 | 冒泡 插入 希尔 选择 堆 快排 归并 非递归 计数 基数 排序

排序 | 冒泡 插入 希尔 选择 堆 快排 归并 非递归 计数 基数 排序 文章目录 排序 | 冒泡 插入 希尔 选择 堆 快排 归并 非递归 计数 基数 排序前言:冒泡排序插入排序希尔排序选择排序堆排序快速排序--交换排序三数取中快速排序hoare版本快速排序挖坑法快速排序前后指…

lambda自定义比较规则-sort函数或优先队列

Lambda表达式的一般形式为 [captures](params){body}对于优先队列的自定义排序规则&#xff0c;常见方法是写成结构体形式 struct cmp{bool operator()(pair<int,int> map1,pair<int,int> map2){return map1.second>map2.second;} }; priority_queue<pair&…

【FPGA】电梯楼层显示(简易)

前言 这是作者室友的项目&#xff0c;本来不管作者事儿的&#xff0c;但是后来听到说是室友去网上找人花了80块买了个劣质的&#xff0c;不仅是从CSDN上抄的&#xff0c;而且使用的板子还不符合室友的要求。可叹作者心软啊&#xff0c;顺便给室友做了。 在代码实现部分会给出设…

【FPGA】Verilog 实践:MUX 多路复用器 | Multiplexer | 实现 4 到 1 线路多路复用器

0x00 MUX 多路复用器(Multiplexer) 多路复用器 (Multiplexer,简称 MUX) 是一种电路,用于从多个输入中选择一个特定输入。它为 个输入提供一个输出,并有 个 select single,作用是从多个输入中选择一个。 多路复用器有两个主要部分:选择器和数据线。选择器用于选择输入…

计算机毕业设计 基于SpringBoot的大学生创新创业项目管理系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…

A01、关于JVM的GC回收

引用类型 对象引用类型分为强引用、软引用、弱引用&#xff0c;具体差别详见下文描述&#xff1a; 强引用&#xff1a;就是我们一般声明对象是时虚拟机生成的引用&#xff0c;强引用环境下&#xff0c;垃圾回收时需要严格判断当前对象是否被强引用&#xff0c;如果被强引用&am…

java-sec-code的xss

java-sec-code 用于学习java漏洞代码 环境部署 直接在idea中使用git 运行即可 RequestMapping("/reflect") ResponseBody public static String reflect(String xss) {return xss;}当用户访问到/reflect URL地址时&#xff0c;程序会自动调用reflect方法&#xff0c…

计网02-计算机网络参考模型

一、OSI七层参考模型 1、分层的思想 分层模型用于网络协议的设计方法&#xff0c;本质是将网络节点间复杂的通信问题分成若干简单的问题逐一解决&#xff0c;通过网络的层次去找问题&#xff0c;将复杂问题简单化。 2、OSI参考模型 由于早期计算机厂商使用的是私有的网络模…

【C++】POCO学习总结(十九):哈希、URL、UUID、配置文件、日志配置、动态库加载

【C】郭老二博文之&#xff1a;C目录 1、哈希 1.1 说明 std::map和std::set 的性能是&#xff1a;O(log n) POCO哈希的性能比STL容器更好&#xff0c;大约快两&#xff1b; POCO中对应std::map的是&#xff1a;Poco::HashMap&#xff1b; POCO中对应std::set的是 Poco::Hash…