最近需要在CortexM4是做一套非特定人孤立词识别算法,研究了一下语音识别算法,目前较为广泛的是DTW、HMM和ANN,由于MCU算力有限,算法较为简单的DTW显然是不二之选。
DTW(Dynamic TimeWarping)算法是一种模式匹配经典算法,它使用动态规划(DP)的方法成功解决了语音信号特征参数序列时间对准的问题,算法较为简单,有效,对处理器性能要求不高,在孤立词语音识别中获得了广泛应用。
DTW算法对于特定人孤立词识别准确度较高,但是对于非特定人,其特征参数于模型库有时候会存在较大区别,从而导致识别率不高的现象。
为解决该问题,本文尝试采用自学习方式更新模板库,从而提高设备的识别率。
步骤如下:
1、获取当前语音的特征参数后,与预置的标准特征对比。预置两种匹配度:最低匹配及高度匹配。
2、如果标准特征匹配通过,先输出匹配成功,去执行相应动作以提高响应速度。如果不通过,则开始用户特征匹配。
3、如果是高度匹配标准特征,则程序返回,否则开始用户特征匹配。
4、如果用户特征是高度匹配,则程序返回,否则开始临时特征匹配。
5、如果临时特征库不存在,则保存当前特征为临时特征。
6、如果临时特征为高度匹配,则临时特征匹配变量++。否则把当前输入保存为临时特征。
7、如果临时特征匹配变量大于预设值,意味着是同一用户语音输入,把临时特征保存为用户特征。
通过上述操作,可以自动更新经常使用该设备用户的语音特征,提高设备识别率。
模板定义:
特征模板 | 说明 |
模板1 |
同一孤立词训练挑选的3个不通模组 |
模板2 | |
模板3 | |
用户模板1 | 两个用户模组,默认为空 |
用户模板2 | |
临时模板 | 用于保存最后一次特征参数 |
#define FEATURE_LIB_NUM 3
#define USER_LIB_NUM 2
typedef struct Dtw_Feature_Struct
{
Mfcc_Data FeatureLib[FEATURE_LIB_NUM];
Mfcc_Data UserLib[USER_LIB_NUM];
Mfcc_Data TempLib;
uint8_t UserLibNum;
uint8_t UserLibValidCnt;
}DtwFratureLib;
程序流程: