语音相似度打分技术说明【音频质量专题】
作者:灵声讯
时间:2018年8月30日
本内容全原创,因作者才疏学浅,偶有纰漏,望不吝指出。本内容由灵声讯音频-语音算法实验室整理创作,转载和使用请与“灵声讯”联系,联系方式:音频/识别/合成算法QQ群(696554058)
目录
1.语音相似度打分算法的背景和内容................................................................................ 3
1.1 背景................................................................................................................... 3
1.2内容.................................................................................................................... 3
2.算法原理与流程图........................................................................................................ 4
2.1 算法原理............................................................................................................ 4
2.2算法流程............................................................................................................. 5
3.接口文档...................................................................................................................... 7
3.1 接口说明............................................................................................................ 7
3.2 接口调用例程..................................................................................................... 7
3.2 宏定义说明........................................................................................................ 7
4.总结............................................................................................................................. 8
语音相似度打分模块主要应用于语音监控设备和报警装置,目前更多适用于工厂设备的实时监控,作为视频监控的辅助,具有低成本,准确率高,容易实现等特点。同时语音相似度打分模块也可以应用在教育领域,辅助学生提升口语能力,模仿标准口音说话,例如在普通话发音不标准的地区,做到实时监测实时校正。
目前主要的相似度打分方法有如下几种:
- 直接根据语音信号本身做相似度匹配,获取相似比做打分计算;
- 基于语音识别技术的相似度打分算法;
- 以上二者相结合的混合型打分算法;
本内容实现的打分算法主要是第一种,方便在嵌入式设备和性能要求低的设备上使用。
本技术通过对语音信号本身做相似度对比,因此必须要有参考信号,比对的方法就是依据参考信号,从时域和频域对待测信号做失真和扰动计算,最终由相似系数映射出百分制得分;
该算法思路最早是有英国人提出,后来经过多国研发人员的不断更新形成了现在完整的结构。它有着强大的功能,不仅能测试象解码器这样的网络单元的效果,也能测量端到端的声音质量;同时,能着重针对不同的信号退化原因,如编解码失真、错误、丢包、延时、抖动和过滤,给出测试结果,根据测得的系数映射成相似度得分。其中关键处理如下所述:
A.频域整形:主要包括电平调整和滤波
B.电平调整:不同的语音系统增益差别很大,当原始语音信号通过语音系统之后,信号电平发生了差异。为了便于比较,需要将二者调整到统一、恒定的电平上来。
C.IRS滤波:用修正的IRS滤波来模拟发送频率特性,该滤波特性充分考虑了原始语音信号的特性,得到的语音信号可以作为终端输出再反馈到网络中去。
D.时间对齐:1.预处理2.整体语音的时延估计3.语句的标识4.语句的延时估计5.语句分割等部分。
E.听觉转换:具体转换流程如下图1所示。

图1. 听觉转换过程图
F.相似度失真模型:描述参考语音信号与失真语音信号在听觉变换过程中产生的干扰差,通过模拟不对称和对称语音信号不同部分的不同加权求解相关性。

图2. 相似度失真模型求解图
2.2算法流程

图3 语音相似度算法打分流程图
1.待测语音/信号:输入对比的语音信号,会随着时间变化夹杂非 语音信号;
2.参考语音/信号:保留本地作为比对的参考语音信号;
- AudioSimilarity_Start() 此接口为初始化相似度计算模块和参考语音的加载启动,为了C#调用方便,初始化和释放接口都放在了核心主接口里面;
- AudioSimilarity_Process(const char *pRefFile, const char *pDeFile, int pSampleRate, float pSensitivity, char *pOutSimilarityScore); 此接口为核心处理接口,包括初始化,计算,接口释放等。
pRefFile: 参考信号路径;
pDeFile: 待测信号路径;
pSampleRate:待测信号采样率,注保证与参考信号采样率相同;
pSensitivity:相似度得分灵敏度调节系数,默认为0.8;
pOutSimilarityScore:应C#要求返回取整以后的字符型得分结果;
3. AudioSimilarity_Destory() 此接口为模块销毁和释放。
具体接口文件如下: /* audio_similarity.h
*
* Copyright (c) 2018 The project authors. All Rights Reserved.
* Function: counting audio and voice similarity with audio_dsym,
* audio_dasym and predict features (average compensation feature,
* spectral gain_modulate feature,neteq feature and so on.)
* Date :2018-6-12
* Version: v1.0.0.1
*
*/
#ifndef AUDIO_SIMILARITY_H_
#define AUDIO_SIMILARITY_H_
#if 1
#ifndef DLL_EXPORT
#define _LIBAPI __declspec(dllexport)
#else
#define _LIBAPI __declspec(dllimport)
#endif
#ifdef __cplusplus
extern "C" {
#endif
/*
* This function start and init AudioSimilarity
*
*
* Return value : 0 - Ok
* -1 - Error
*/
_LIBAPI int AudioSimilarity_Start();
/*
* This function frees the dynamic memory of AudioSimilarity
*
*
* Return value : 0 - Ok
* -1 - Error
*/
_LIBAPI int AudioSimilarity_Destory();
/*
* This functions do score of similiarity audio for the audio file. The
* input and output signals should always be 16KHz/8KHz and 16bits.
*
* Input
* - pRefFile : reference audio file.
* - pDeFile : waiting process audio file
* - pSampleRate : sample rate 8K/16K
* - pSensitivity : sensitivity(0~1)
*
* Output:
* - pOutSimilarityScore : output similarity score
*
* Return value : 0 - OK
* -1 - Error
*/
_LIBAPI int AudioSimilarity_Process(const char *pRefFile, const char *pDeFile, int pSampleRate, float pSensitivity, char *pOutSimilarityScore);
//_LIBAPI int AudioSimilarity_Process(const char *pRefFile, const char *pDeFile, int pSampleRate);
#ifdef __cplusplus
}
#endif
#include <math.h>
#include <stdlib.h>
#include <time.h>
#include <windows.h>
#include "../include/audio_similarity.h"
#include "../include/log.h"
#if 1
void usage(void) {
printf("Usage:\n");
printf(" AS HELP Displays this text\n");
printf(" AS [options] ref deg\n");
printf(" Run model on reference ref and degraded deg\n");
printf("\n");
}
int days = 0;
int months = 0;
void getNowTime()
{
time_t timer;
struct tm *tblock;
timer = time(NULL);
tblock = localtime(&timer);
days = tblock->tm_mday;
months = tblock->tm_mon;
printf("Local time is: %s\n", asctime(tblock));
}
int main(int argc, const char *argv[])
{
int i;
for (i = 1; i <= 1; i++)
{
//printf("第 %d 次开始相似度计算!\n", i);
#ifdef AUDIO_SIMILARITY_LOG
LogWrite(INFO, "第 %d 次开始相似度计算!", i);
#endif
SYSTEMTIME sys;
//argv[1] = "E:\\project\\audiosimilarity-1.0.1\\audiosimilarity\\audiosimilarity\\Debug\\20180627164926.wav";
//argv[2] = "E:\\project\\audiosimilarity-1.0.1\\audiosimilarity\\audiosimilarity\\Debug\\20180627174153.wav";
//const char *fp_ref = "E:\\project\\audiosimilarity-1.0.1\\audiosimilarity\\audiosimilarity\\Debug\\Audio.wav";
//const char *fp_input = "E:\\project\\audiosimilarity-1.0.1\\audiosimilarity\\audiosimilarity\\Debug\\record3.wav";
const char *fp_ref = argv[1];
const char *fp_input = argv[2];
int result = 0;
//int sample_rate = 16000;
float sensitivity = 0.8f;
//float sensitivity = atoi(argv[4]) * (1.0f/10);
int sample_rate = atoi(argv[3]); //sample rate
//double as_score = 0;
char score[32] = {0};
getNowTime();
printf("days is %d , month is %d \n", days, months);
result = AudioSimilarity_Start();
if (result < 0)
{
printf("AudioSimilarity_Start is failed!\n");
}
//if (days < 16 && months < 6)
GetLocalTime(&sys);
printf("%s %d %s: %4d/%02d/%02d %02d:%02d:%02d.%03d week:%1d\n", __FILE__, __LINE__, __FUNCTION__, sys.wYear, sys.wMonth, sys.wDay, sys.wHour, sys.wMinute, sys.wSecond, sys.wMilliseconds, sys.wDayOfWeek);
if (1)
{
//result = AudioSimilarity_Process(fp_ref, fp_input, sample_rate, &as_score);
printf("Input sensitivity is %f.\n", sensitivity);
//write_log(pFile,"Input sensitivity is %f.\n", sensitivity);
result = AudioSimilarity_Process(fp_ref, fp_input, sample_rate, sensitivity, &score);
//result = AudioSimilarity_Process(fp_ref, fp_input, sample_rate);
}
else
{
printf("Please contact to author, thank you! QQ number:245051943 or wechat:kinglongbest\n");
}
GetLocalTime(&sys);
printf("%s %d %s: %4d/%02d/%02d %02d:%02d:%02d.%03d week:%1d\n", __FILE__, __LINE__, __FUNCTION__, sys.wYear, sys.wMonth, sys.wDay, sys.wHour, sys.wMinute, sys.wSecond, sys.wMilliseconds, sys.wDayOfWeek);
if (result < 0)
{
printf("AudioSimilarity_process is failed!\n");
}
else
{
//printf("AudioSimilarity_process audio similarity score is %.3f \n",as_score);
printf("AudioSimilarity_process audio similarity score is %s \n", score);
#ifdef AUDIO_SIMILARITY_LOG
LogWrite(INFO, "%s", "AudioSimilarity_process audio similarity score is :");
LogWrite(INFO, "%s", score);
#endif
}
result = AudioSimilarity_Destory();
if (result < 0)
{
printf("AudioSimilarity_Destory is failed!\n");
}
//printf("请输入任意字符:\n");
//printf("第 %d 次结束相似度计算!\n", i);
#ifdef AUDIO_SIMILARITY_LOG
LogWrite(INFO, "第 %d 次结束相似度计算!", i);
#endif
//getchar();
}
system("pause");
#ifdef AUDIO_SIMILARITY_LOG
LogWrite(INFO,"%s", "Audio similarity is end !");
#endif
return 0;
} 具体测试结果:  |
#define AUDIO_SIMILARITY_LOG //是否输出log日志宏在log.h文件中宏定义介绍
#define AUDIO_SIMILARITY_TIME //是否打印目前时间记录优化时间在audio_similarity.c
语音相似度打分算法目前已编译成lib,dll等库在C#和其他平台调用,打分可以根据灵敏度来自动调节,最终是否报警需根据实际场景测试数据设定阈值,只要得分高于阈值就可以说明设备异常。后期基于语音识别技术的相似度打分算法还在开发过程中,有效果以后可以及时更新。
附件为最后一次打包的库:
#######################################################################
本内容由灵声讯音频-语音算法实验室开发完成,需要源码和技术文档等合作事宜
请与“灵声讯”联系,联系方式:音频/识别/合成算法QQ群(696554058)
#######################################################################
模块功能:语音相似度打分算法
作者/版权:归灵声讯所有
日期 : 2018-08-30
#######################################################################
运行步骤:直接双击bat批处理就可以
参数说明:
输入:参数1为参考语音,参数2为待测语音,参数3为采样率
输出:相似度得分score
注:得分全部采用百分制,参考语音和待测语音采样率必须一致
########################################################################
加群和关注公众号请戳下面:
