音频客观测评方法PESQ

一、简介

语音质量感知评估(Perceptual Evaluation of Speech Quality)是一系列的标准,包括一种用于自动评估电话系统用户所体验到的语音质量的测试方法。该标准于2001年被确定为ITU-T P.862建议书[1]。PESQ被电话制造商、网络设备供应商和电信运营商用于客观的语音质量测试。PESQ的继任者POLQA(ITU-T P.863建议书[2])的第一版于2011年生效。(引用wiki)

协议中提供源码:https://www.itu.int/rec/T-REC-P.862-200511-W!Amd2/en

Python开源链接:https://github.com/ludlows/PESQ

二、原理

PESQ中,原始信号和被测信号通过感知模型映射到internal representation。认知模型利用这种representation差异来预测被测信号的语音质量。

PESQ认知模型用于预测感知语音质量的internal representation,是基于使用频率(以Bark为单位的音高)和强度(以Sone为单位的响度)的心理物理等效物的信号表示来计算的。 

三、实现

总的想法是: 

1)对原始信号和通过被测系统的信号首先电平调整到标准听觉电平,再利用IRS(Intermediate Reference System)滤波器模拟标准电话听筒进行滤波;
2)对通过电平调整和滤波之后的两个信号在时间上对准,并进行听觉变换,这个变换包括对系统中线性滤波和增益变化的补偿和均衡;
3)将两个听觉变换后的信号之间的谱失真测度作为扰动(即差值),分析扰动曲面提取出的两个退化参数,在频率和时间上累积起来,映射到MOS的预测值。 

1、电平调整

首先要调整原始音频和被测音频的整体音量。这步是将整体原始音频信号X(t)和被测试音频信号Y(t)都缩放到相同的恒定功率水平。

PESQ假设主观听音水平是一个常数,约为耳参考点处的79分贝SPL(P.830,[23]第8.1.2节)。音量对齐是基于原始信号和被测信号的带通滤波版本(300-3000 Hz)的功率来进行的。

除了时域中的电平对齐外,在时频分析之后,还需要在频域中对齐power。这是通过生成一个频率为1000 Hz、幅度为40分贝SPL的正弦波来实现的。这个正弦波使用32毫秒帧长的加窗快速傅里叶变换(FFT)转换到频域。将频率轴转换为modified Bark尺度后,通过乘以功率缩放因子Sp,将得到的基音功率密度的峰值幅度归一化为 的功率值。

代码实现如下:

pesq_measure->fix_power_level

void fix_power_level (SIGNAL_INFO *info, char *name, long maxNsamples) 
{long   n = info-> Nsamples;long   i;float *align_filtered = (float *) safe_malloc ((n + DATAPADDING_MSECS  * (Fs / 1000)) * sizeof (float));    float  global_scale;float  power_above_300Hz;for (i = 0; i < n + DATAPADDING_MSECS  * (Fs / 1000); i++) {align_filtered [i] = info-> data [i];}apply_filter (align_filtered, info-> Nsamples, 26, align_filter_dB);power_above_300Hz = (float) pow_of (align_filtered, SEARCHBUFFER * Downsample, n - SEARCHBUFFER * Downsample + DATAPADDING_MSECS  * (Fs / 1000),maxNsamples - 2 * SEARCHBUFFER * Downsample + DATAPADDING_MSECS  * (Fs / 1000));global_scale = (float) sqrt (TARGET_AVG_POWER / power_above_300Hz); for (i = 0; i < n; i++) {info-> data [i] *= global_scale;    }safe_free (align_filtered);
}

2、IRS滤波

这是基于假设听力测试是通过一个手机设备进行的。为了模拟受试者实际听到的信号,需要计算原始语音信号和被测试语音信号的IRS滤波。通过在整个文件上执行快速傅里叶变换(FFT),在频域中使用与IRS接收特性相似的分段线性响应进行滤波,然后在整个语音文件长度上执行逆FFT来实现。

这样得到了缩放后的输入信号Xs(t)和输出信号Ys(t)的滤波版本Xirss(t)和Yirss(t)。PESQ中,无论实际主观实验使用的是IRS还是modified IRS滤波,都使用单一的IRS类接收滤波器。因为大多数情况下,确切的滤波是未知的,而且即使知道确切的滤波,手持设备与耳朵之间的耦合也是未知的。因此,ITU-T要求客观方法对手持设备的滤波相对不敏感。此外,ITU-T基准中不允许对滤波进行调整。

代码实现如下:

pesq_measure

3、时间对齐与均衡

若原始语音文件和被测试语音文件以较大的静音间隔开始或结束,可能会影响对这些文件中某些平均失真值的计算。因此,需要估算这些文件开头和结尾的静音部分。

从原始语音文件的开头和结尾开始,必须连续五个绝对样本值的总和超过500,该位置才被视为活跃间隔的开始或结束。这个开始和结束之间的间隔被定义为活跃语音时间间隔。为了节省计算周期和存储空间,某些计算可以限制在活跃间隔内进行。

代码实现如下:

pesq_measure->pesq_psychoacoustic_model

#define CRITERIUM_FOR_SILENCE_OF_5_SAMPLES        500.

4、听觉变换

实际生活中,人耳会执行时频变换。在PESQ中通过在一个32毫秒帧长的Hann window进行短时快速傅里叶变换来模拟。连续帧之间的重叠率为50%。原始信号和被测试信号的功率谱(复数快速傅里叶变换(FFT)分量的实部和虚部的平方和)被分别存储在独立的实值数组中。在PESQ中,单个帧内的相位信息被丢弃,所有计算仅基于功率表示

另外Bark scale反映了人类听觉系统在低频时具有比高频更精细的频率分辨率这一特性。这一特性通过快速傅里叶变换(FFT)频带的分组实现,即将相应FFT频带的功率进行归一化求和。将赫兹频率尺度映射到Bark approximates的扭曲函数。所得信号被称为基音功率密度:PPXwirss(f)n和PPYwirss(f)n。 

5、扰动处理

被测信号中帧的起始点会根据variable delay estimator观测到的延迟进行偏移。原始语音信号的时间轴则保持不变。如果延迟增加,处理过程中会省略被测试信号的部分内容;而如果延迟减少,则会重复被测试信号的部分内容。这种时间轴的修改在与主观感知的整体语音质量的相关性方面取得了最佳结果。

这块的详细介绍需要参考《Perceptual Evaluation of Speech Quality (PESQ), the new ITU standard for end-to-end speech quality assessment. Part II – Psychoacoustic model》

6、识别坏间隔

连续多帧中,若帧扰动超过某一阈值,那么这些帧被称为不良区间。

在少数情况下,由于预处理观测到的时间延迟不正确,客观测量会预测在最少的不良帧数内会出现较大的失真。对这些不良区间,我们通过定位预处理观测到的延迟进行预补偿后的绝对原始信号与绝对被测试信号之间的互相关最大值,来估计新的延迟值。

当互相关最大值低于某一阈值时,我们认为该区间是噪声与噪声的匹配,此时该区间不再被视为不良区间,并停止对该区间的处理。否则,将重新计算不良区间内各帧的帧扰动,如果新的帧扰动值较小,则用它替换原始的帧扰动值。最终得到的帧扰动值Dn和DAn用于计算主观感知的整体语音质量。

四、参考

语音质量评估 - 冬色 - 博客园语音质量评估,就是通过人类或自动化的方法评价语音质量。在实践中,有很多主观和客观的方法评价语音质量。主观方法就是通过人类对语音进行打分,比如MOS、CMOS和ABX Test。客观方法即是通过算法评测语音质量,在实时语音通话领域,这一问题研究较多,出现了诸如如PESQ和P.563这样的有参考和无参考icon-default.png?t=O83Ahttps://www.cnblogs.com/mengnan/p/12046332.html

https://www.itu.int/rec/T-REC-P.862-200511-W!Amd2/enicon-default.png?t=O83Ahttps://www.itu.int/rec/T-REC-P.862-200511-W!Amd2/en

http://www.mp3-tech.org/programmer/docs/2001-P03a.pdficon-default.png?t=O83Ahttp://www.mp3-tech.org/programmer/docs/2001-P03a.pdf

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

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

相关文章

Gitlab服务管理和仓库项目权限管理

Gitlab服务管理 gitlab-ctl start # 启动所有 gitlab 组件&#xff1b; gitlab-ctl stop # 停止所有 gitlab 组件&#xff1b; gitlab-ctl restart # 重启所有 gitlab 组件&#xff1b; gitlab-ctl status …

浏览器插件开发实战

浏览器插件开发实战 [1] 入门DEMO一、创建项目二、创建manifest.json三、加载插件四、配置 service-worker.js五、以书签管理器插件为例manifest.jsonpopup.htmlpopup.js查看效果 [2] Vue项目改造成插件一、复习Vue项目的结构二、删除、添加个别文件三、重写build [3] 高级开发…

TMS320C6713 数字信号处理器(DSP)原理图及代码

TMS320C6713 是德州仪器公司&#xff08;TI&#xff09;推出的数字信号处理器&#xff08;DSP&#xff09;产品。其主要特点是高性能、低功耗、灵活性强、处理速度快等方面。 TMS320C6713 可以应用于以音视频信号处理、通信信号处理、控制系统、医疗器械等领域。 TMS320C6713 的…

SpringBoot集成JWT和Redis实现鉴权登录功能

目前市面上有许多鉴权框架&#xff0c;鉴权原理大同小异&#xff0c;本文简单介绍下利用JWT和Redis实现鉴权功能&#xff0c;算是抛砖引玉吧。 主要原理就是“令牌主动失效机制”&#xff0c;主要包括以下4个步骤&#xff1a; (1)利用拦截器LoginInterceptor实现所有接口登录拦…

微信原生小程序---生成海报并分享,保存本地

小程序海报有两种常见的实现方式: 1.canvas 绘制海报 使用 canvas 绘制海报主要有以下几个步骤 1、创建 canvasContext 2、获取网络图片的本地路径 3、绘制图片、文字等到 canvas 4、调用 wx.canvasToTempFilePath 导出图片 但实际使用中,这些操作看似简单,但调试起来…

在IDE中使用Git

我们在开发的时候肯定是经常使用IDE进行开发的&#xff0c;所以在IDE中使用Git也是非常常用的&#xff0c;接下来以IDEA为例&#xff0c;其他的VS code &#xff0c;Pycharm等IDE都是一样的。 在IDEA中配置Git 1.打开IDEA 2.点击setting 3.直接搜索git 如果已经安装了会自…

Python鼠标轨迹算法(游戏防检测)

一.简介 鼠标轨迹算法是一种模拟人类鼠标操作的程序&#xff0c;它能够模拟出自然而真实的鼠标移动路径。 鼠标轨迹算法的底层实现采用C/C语言&#xff0c;原因在于C/C提供了高性能的执行能力和直接访问操作系统底层资源的能力。 鼠标轨迹算法具有以下优势&#xff1a; 模拟…

【2025最新版】Stable diffusion汉化版安装教程(附SD安装包),一键激活,永久免费!

如何安装并学习使用Stable Diffusion呢&#xff1f; 其实&#xff0c;安装SD的过程并不复杂&#xff0c;只需按照简单的步骤操作&#xff0c;几分钟内就能完成安装&#xff0c;不论是Windows系统还是Mac系统&#xff0c;都能轻松应对。

Invalid bound statement (not found) 错误解决

出现这个错误提示&#xff1a;Invalid bound statement (not found): com.xxx.small_reservior.dao.WaterRainMapper.getWaterRainByRegion&#xff0c;通常表示 MyBatis 框架无法找到与给定的 getWaterRainByRegion 方法匹配的 SQL 映射语句。这种问题通常发生在以下几种情况中…

jvm内存优化

JVM内存优化是一个复杂的过程&#xff0c;涉及到多个方面&#xff0c;包括堆内存设置、垃圾收集器选择、GC参数调整等。以下是一些基于搜索结果的JVM内存优化建议&#xff1a; 1. 调整堆和年轻代大小&#xff1a; • 增大堆内存&#xff1a;将堆内存从4GB增加到8GB&#xff0…

Python学习(二)—— 基础语法(上)

目录 一&#xff0c;表达式和常量和变量 1.1 表达式 1.2 变量 1.3 动态类型特性 1.4 输入 二&#xff0c;运算符 2.1 算术运算符 2.2 关系运算符 2.3 逻辑运算符 2.4 赋值运算符 2.5 练习 三&#xff0c;语句 3.1 条件语句 3.2 while循环 3.3 for循环 四&#…

如何用状态图进行设计06

独立的控制线程 扩展状态图也提供了获取无序的输入事件的方法。这意味着一个状态开始时&#xff0c;它可能位于一个或多个控制线程的交叉点。控制行为的每个独立线程都类似一个状态机&#xff0c;独自运行&#xff0c;互不干扰。因此&#xff0c;这些控制线程可能会同时发生状…

嵌入式学习(18)-stm32F407串口接收空闲中断+DMA

一、概述 在一些一次性接收大批量数据的引用场合&#xff0c;如果使用接收中断会频繁的进入接收中断影响代码的运行效率。为了解决这个问题可以使用串口的空闲中断DMA实现。 二、应用 在网上招了一些例程在STM32F407的平台上都没有跑通会出现各种异常&#xff0c;主要原因还…

我的宝贵经验

在技术的浩瀚海洋中&#xff0c;一份优秀的技术文档宛如精准的航海图。它是知识传承的载体&#xff0c;是团队协作的桥梁&#xff0c;更是产品成功的幕后英雄。然而&#xff0c;打造这样一份出色的技术文档并非易事。你是否在为如何清晰阐释复杂技术而苦恼&#xff1f;是否纠结…

高并发场景秒杀抢购超卖Bug实战重现

引言 在电商平台的秒杀活动中&#xff0c;高并发场景下的抢购超卖Bug是一个常见且棘手的问题。一旦处理不当&#xff0c;不仅会引发用户投诉&#xff0c;还会对商家的信誉和利益造成严重损害。本文将详细介绍秒杀抢购超卖Bug的背景历史、业务场景、底层原理以及Java代码实现&a…

redis 架构详解

Redis架构详解可以从以下几个方面进行阐述&#xff1a; 一、部署架构 Redis有多种部署架构&#xff0c;适用于不同的应用场景和需求&#xff0c;主要包括以下几种&#xff1a; 单机模式&#xff08;Standalone Mode&#xff09; 特点&#xff1a;部署简单&#xff0c;配置方便…

[python]使用 Pandas 分组和汇总表数据

在数据分析中&#xff0c;数据的分组与汇总是非常常见的操作。下面使用 Python 的 Pandas 库来处理表数据&#xff0c;并生成汇总结果。 导入数据 首先&#xff0c;我们需要导入必要的库并读取 Excel 文件中的数据&#xff1a; import pandas as pd# 读取工资表数据 df pd.…

多线程的知识总结(8):用 thread 类 或全局 async (...) 函数,创建新线程时,谁才是在新线程里第一个被执行的函数

&#xff08;40&#xff09;用 thread 类 或全局 async (…) 函数&#xff0c;创建新线程时&#xff0c;谁才是在新线程里第一个被执行的函数&#xff1f; 弄清楚这个问题&#xff0c;有利于推测和理解线程中代码的执行流程。根据 thread 类 和 async &#xff08;…&#xff0…

PostgreSql集群安装 Pgpool-II以及服务器设置和操作

2 .安装 Pgpool-II 2.1. 规划 由于 Pgpool-II 是一个管理 PostgreSQL 的工具&#xff0c;我们需要决定如何 首先部署它们。此外&#xff0c;还可以有多个 Pgpool-II 安装数量达到 增强 Pgpool-II 本身的可用性。我们需要提前计划需要多少次 Pgpool-II 安装。在 本章我们首先讨…

UOB大华银行|校招网申综合能力SHL测评题库英语版本真题分析

大华银行有限公司&#xff08;大华银行&#xff09;是亚洲银行业的翘楚&#xff0c;大华银行总部位于新加坡&#xff0c;并在中国、印度尼西亚、马来西亚、泰国及越南设立了全资法人银行&#xff0c;在全球拥有约500 间分行及办事处&#xff0c;分布在亚太、欧洲与北美的19 个国…