語音相似度打分技術說明【音頻質量專題】

         

                 語音相似度打分技術說明【音頻質量專題】

                                                                                                                                 

                                                                                                                                                           作者:靈聲訊

                                                                                                                                                           時間: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

 

    語音相似度打分模塊主要應用於語音監控設備和報警裝置,目前更多適用於工廠設備的實時監控,作爲視頻監控的輔助,具有低成本,準確率高,容易實現等特點。同時語音相似度打分模塊也可以應用在教育領域,輔助學生提升口語能力,模仿標準口音說話,例如在普通話發音不標準的地區,做到實時監測實時校正。

目前主要的相似度打分方法有如下幾種:

  1. 直接根據語音信號本身做相似度匹配,獲取相似比做打分計算;
  2. 基於語音識別技術的相似度打分算法;
  3. 以上二者相結合的混合型打分算法;

本內容實現的打分算法主要是第一種,方便在嵌入式設備和性能要求低的設備上使用。

     本技術通過對語音信號本身做相似度對比,因此必須要有參考信號,比對的方法就是依據參考信號,從時域和頻域對待測信號做失真和擾動計算,最終由相似係數映射出百分制得分;

  • 2.算法原理與流程圖

  • 2.1 算法原理

該算法思路最早是有英國人提出,後來經過多國研發人員的不斷更新形成了現在完整的結構。它有着強大的功能,不僅能測試象解碼器這樣的網絡單元的效果,也能測量端到端的聲音質量;同時,能着重針對不同的信號退化原因,如編解碼失真、錯誤、丟包、延時、抖動和過濾,給出測試結果,根據測得的係數映射成相似度得分。其中關鍵處理如下所述:

A.頻域整形:主要包括電平調整和濾波

B.電平調整:不同的語音系統增益差別很大,當原始語音信號通過語音系統之後,信號電平發生了差異。爲了便於比較,需要將二者調整到統一、恆定的電平上來。

C.IRS濾波:用修正的IRS濾波來模擬發送頻率特性,該濾波特性充分考慮了原始語音信號的特性,得到的語音信號可以作爲終端輸出再反饋到網絡中去。

D.時間對齊:1.預處理2.整體語音的時延估計3.語句的標識4.語句的延時估計5.語句分割等部分。

E.聽覺轉換:具體轉換流程如下圖1所示。

                                                      

                                                                                         圖1. 聽覺轉換過程圖

F.相似度失真模型:描述參考語音信號與失真語音信號在聽覺變換過程中產生的干擾差,通過模擬不對稱和對稱語音信號不同部分的不同加權求解相關性。

                                             

                                                                                圖2. 相似度失真模型求解圖

2.2算法流程

                                                                

                                                                              圖3 語音相似度算法打分流程圖

1.待測語音/信號:輸入對比的語音信號,會隨着時間變化夾雜非        語音信號;

2.參考語音/信號:保留本地作爲比對的參考語音信號;

  • 3.接口文檔

  • 3.1 接口說明

  1. AudioSimilarity_Start() 此接口爲初始化相似度計算模塊和參考語音的加載啓動,爲了C#調用方便,初始化和釋放接口都放在了核心主接口裏面;
  2. 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

 

 

  • 3.2 接口調用例程

 

#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;

}

具體測試結果:

  •  3.3 宏定義介紹

       #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

注:得分全部採用百分制,參考語音和待測語音採樣率必須一致

########################################################################

加羣和關注公衆號請戳下面:

 

                                                                        https://pic1.zhimg.com/80/v2-4556d9ea0de36ef873485922dd396bbc_hd.jpg

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章