主客观语音质量评估

在语音降噪和盲源分离、语音合成等任务中,最后都会用语音质量评估指标来说明自己的算法效果,今天来详细梳理一下都有哪些方法。

音频质量评价当前主要分三种评价标准:

  • 主观评价:主要是依靠人为的听,然后按照5分或者7分制打分。比如MOS、CMOS和ABX Test。
  • 客观评价—基于指标:主要依靠仪器测试响度、频率响应、灵敏度等指标;
  • 客观评价—基于模型:依靠模型和算法,模拟人工打分。

举一个例子,前面走过来一个美女,三个人就开始评价了。
A:她是我们班的,是班花,经过了四十多人投票选出来的,肯定是美女。
这就是主观评价,但是评价的主体还是太少。

B:我有她的个人资料,包括身高体重三维,从数据上看,是个美女。
这就是基于指标的评价,但是数据太生硬。

C:我有一套人工智能美女评价系统,模型是来自人类最顶尖、最苛刻的美女评价标准,已经评价了数百万的美女标准,并且给出了打分,这套模型与人类主观评价有99.7%的相似度。
这就是基于客观模型,同时兼具了主观和客性。

主观评价

  主观评价主要参照国家标准《YDT2309-2011音频质量主观测试方法》,国家标准主要也是参考国际标准 中的主观评价:ITU-R BS.1116-1997。国际标准中比较常用的有:ITU-T P800(电话传输系统语音质量主观评价)、ITU-T P830(电话宽带和宽带数字语音编解码器主观评价方法)、ITU-T P805 (对话质量主观评价)。

标准中的测试规则主要定义几点:

  1. 参考的标准音频和被测试音频间隔测试,连续重复4次;
  2. 音频源采用15~20s;
  3. 一次完整的测试时间不应超过15~20min;
  4. 测试成员:专家成员最少10人,非专家20人。
  5. 如果预先定义评分值,则不需要对单个评分值做归一化,否则需要归一化处理。
  6. 评分可以采用5分或者7分制。

MOS(Mean Opinion Score)平均意见得分

等级 分数 听感
4.0~5.0 很好,听得清楚;延迟小,交流流畅
3.5~4.0 稍差,听得清楚;延迟小,交流欠流畅,有点杂音
3.0~3.5 还可以,听不太清;有一定延迟,可以交流
1.5~3.0 勉强,听不太清;延迟较大,交流需要重复多遍
0~1.5 极差,听不懂;延迟大,交流不通畅

  如果平均主观评价值MOS是4或者更高,被认为是比较好的语音质量,而若平均MOS低于3.6,则表示大部分接听者不能满意这个语音质量。

MOS测试一般要求:

  • 足够多样化的样本(即试听者和句子数量)以确保结果在统计上的显著;
  • 控制每个试听者的实验环境和设备保持一致;
  • 每个试听者遵循同样的评估标准。

  除了绝对等级评分,其它常用的语音质量主观评价有失真等级评分(Degradation Category Rating, DCR)和相对等级评分(Comparative Category Rating, CCR),这两种方式不仅需要提供失真语音信号还需要原始语音信号,通过比较失真信号和原始信号获得评价结果(类似于ABX Test),比较适合于评估背景噪音对语音质量的影响,或者不同算法之间的直接较量。附语音合成论文中计算MOS的小脚本,其不仅强调MOS值,并且要求95%的置信区间内的分数:

# -*- coding: utf-8 -*-
# @Time    : 2019/4/30 13:56
# @Author  : MengnanChen
# @FileName: caculate_MOS.py
# @Software: PyCharm

import math
import numpy as np
import pandas as pd
from scipy.linalg import solve
from scipy.stats import t


def calc_mos(data_path: str):
    '''
    计算MOS,数据格式:MxN,M个句子,N个试听人,data_path为MOS得分文件,内容都是数字,为每个试听的得分
    :param data_path:
    :return:
    '''
    data = pd.read_csv(data_path)
    mu = np.mean(data.values)
    var_uw = (data.std(axis=1) ** 2).mean()
    var_su = (data.std(axis=0) ** 2).mean()
    mos_data = np.asarray([x for x in data.values.flatten() if not math.isnan(x)])
    var_swu = mos_data.std() ** 2

    x = np.asarray([[0, 1, 1], [1, 0, 1], [1, 1, 1]])
    y = np.asarray([var_uw, var_su, var_swu])
    [var_s, var_w, var_u] = solve(x, y)
    M = min(data.count(axis=0))
    N = min(data.count(axis=1))
    var_mu = var_s / M + var_w / N + var_u / (M * N)
    df = min(M, N) - 1  # 可以不减1
    t_interval = t.ppf(0.975, df, loc=0, scale=1)  # t分布的97.5%置信区间临界值
    interval = t_interval * np.sqrt(var_mu)
    print('{} 的MOS95%的置信区间为:{} +—{} '.format(data_path, round(float(mu), 3), round(interval, 3)))


if __name__ == '__main__':
    data_path = ''
    calc_mos(data_path)

客观评价

  常见的音频测试的项目可以粗略的分类为:动态范围,频率响应、灵敏度,谐波失真,互调失真,信噪比,最大输入输出电平等。在目前应用广泛的音频标准中都是分别从不同的角度考察了音频常见产品的性能,现将分类如下:
在这里插入图片描述
在这里插入图片描述

PESQ(Perceptual evaluation of speech quality)客观语音质量评估

  PSEQ工具是用来计算语音样本的MOS-LQO (Mean Opinion Score – Listening Quality Objective)值,PESQ把在信号传输通过设备时提取的输出信号与参照信号进行比较计算出差异值。一般情况下,输出信号和参照信号的差异性越大,计算出的MOS参数值就越低。

PESQ在国际电信联盟的标注化代号为ITU-T P.862。总的想法是:

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

详细的直接参考这里

其他评价方法:
CSIG: Mean opinion score (MOS) predictor of signal distortion
CBAK: MOS predictor of background-noise intrusiveness
COVL: MOS predictor of overall signal quality
PESQ: Perceptual evaluation of speech quality
SSNR: Segmental SNR

实际在论文中使用时:
在这里插入图片描述
说明:为对比本文提出算法的效果,使用了几种其他降噪算法做对比,所使用的都是对应方法的(官方)开源代码实现的。黑体的数字表示同一种评价指标下,不同方法的得分最高的一个。得分越高,语音质量越高。

在使用时,可直接在github上下载pesq的开源程序,在pycharm上安装直接使用。
github上的链接为:
https://github.com/ludlows/python-pesq

参考来源链接

PESQ百度百科
http://www.emakerzone.com/test_comment_info/460/1
PESQ语音质量测试
很完善的参考,推荐看这个

猜你喜欢

转载自blog.csdn.net/u011913417/article/details/109766940