語音相似度打分技術說明【音頻質量專題】
作者:靈聲訊
時間: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. 相似度失真模型求解圖
圖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
注:得分全部採用百分制,參考語音和待測語音採樣率必須一致
########################################################################
加羣和關注公衆號請戳下面: