FreeSWITCH及VOIP,Openser,电话机器人等产品中文技术资讯、交流、沟通、培训、咨询、服务一体化网络。QQ群:293697898
序:
因为有人问我,在实时通话中进行说话人识别可行不可行?先说结论,可行的因素是机器好、并发少、要求不高、算法尽可能简单。反之,则是不可行的。
在电话通信广泛普及的今天,实时通话中的说话人识别成为了一个极具研究价值的课题。电话作为一种重要的通信手段,承载着大量的信息交互,从个人隐私的保护到商业机密的安全,从公共安全的维护到客户服务的精准化,在实时通话中准确识别说话人有着至关重要的意义。
电话通信中的语音通过模拟信号或数字信号在通信网络中传输。传统的固定电话主要基于电路交换网络,语音信号经过编码后在专用的通信线路上传输。而现代的移动电话则利用蜂窝网络,语音数据以数字包的形式在无线信道和核心网中传递。这种传输方式在保证语音可达性的同时,也对说话人识别带来了一定影响,比如信号可能会受到网络拥塞、无线干扰等因素的影响。
使用电话进行通话的环境多种多样。用户可能在安静的室内、嘈杂的街道、喧闹的公共场所或者移动的交通工具中。这些不同的环境背景会引入不同类型和强度的噪声,如人群嘈杂声、车辆行驶声、风声等,严重干扰语音信号的纯净度,给说话人识别增加了难度。
基频特征
基频是语音信号中反映声带振动频率的重要参数。不同说话人由于生理结构差异,基频范围和分布各不相同。在电话通信中,尽管语音经过传输可能会有一定变化,但基频特征仍保留一定的说话人特异性,可以作为识别的依据之一。
共振峰特征
共振峰与声道的形状和大小密切相关。每个人独特的声道形态决定了其共振峰的频率和带宽。通过分析共振峰特征,可以有效区分不同说话人。不过,电话通信的带宽限制可能会对共振峰的精确提取产生一定影响。
频谱特征
语音的频谱包含丰富的信息。频谱特征可以展现语音在不同频率段的能量分布。在电话通信中,频谱特征在一定程度上会受到编码、解码以及传输过程的影响,但依然能够为说话人识别提供有价值的线索。
基于模板匹配的模型
这种模型将预先提取的说话人语音模板与实时通话中的语音片段进行匹配。例如,动态时间规整(DTW)算法可以在一定程度上解决语音时长不一致的问题,通过调整时间轴来找到最佳匹配路径。但在电话通信中,由于环境和传输的影响,模板匹配可能会出现偏差。
基于统计模型的方法
高斯混合模型(GMM)通过对说话人语音的声学特征概率分布进行建模。在电话通信环境下,需要考虑模型对不同通信条件下语音变化的适应性。隐马尔可夫模型(HMM)则考虑了语音的时序特性,更适合处理连续语音,但在面对电话通信中的复杂情况时,需要大量的训练数据来保证模型的准确性。
深度学习模型
卷积神经网络(CNN)和长短时记忆网络(LSTM)等深度学习模型在说话人识别领域表现出色。它们能够自动学习复杂的声学特征表示,对电话通信中的语音变化有一定的鲁棒性。然而,这些模型通常需要大量的计算资源和训练数据,并且在面对电话通信中的噪声和信号失真等问题时,也需要特殊的处理方法。
噪声干扰
如前文所述,通话环境中的噪声会与语音信号混合,降低语音的质量和可懂度。在说话人识别中,噪声可能会掩盖或改变说话人的声学特征,导致识别错误。而且不同类型和强度的噪声对不同的识别算法影响程度不同,增加了识别的复杂性。
信号失真
电话通信网络中的编码、解码过程以及可能存在的网络问题会导致语音信号失真。例如,低比特率编码可能会丢失一些语音细节,网络丢包可能会使语音片段不完整。这些失真现象会影响说话人识别系统对声学特征的准确提取和分析。
在实时通话中,说话人识别需要在短时间内完成。这就要求识别算法具有高效的计算能力,能够快速处理传入的语音数据。然而,一些复杂的识别模型虽然准确率高,但计算复杂度也高,可能无法满足实时性的要求,导致识别结果延迟,影响通话体验和识别的实用性。
自适应滤波
自适应滤波算法可以根据噪声的实时特性调整滤波器参数,有效抑制背景噪声。在电话通信中,可以在接收端应用自适应滤波技术,减少噪声对语音信号的影响,提高语音质量,从而有利于说话人识别。
语音增强算法
如基于频谱减法、维纳滤波等语音增强算法可以增强语音信号中的有用成分,提高语音的可懂度和声学特征的清晰度。这些算法可以在一定程度上补偿由于通信环境和网络传输造成的语音质量下降问题。
特征选择与降维
在说话人识别中,可以通过选择对电话通信环境下说话人区分度高的声学特征,并进行降维处理,减少数据量和计算复杂度。例如,利用主成分分析(PCA)等方法找到最具代表性的特征子集,提高识别效率。
轻量级模型设计
针对实时性要求,可以设计轻量级的识别模型。例如,对深度学习模型进行剪枝、量化等操作,在保证一定识别准确率的前提下,降低模型的计算量和存储需求,使其能够在电话通信设备上快速运行。
除了声学特征,还可以结合电话通信中的其他信息进行说话人识别。例如,利用电话的呼叫号码、用户的注册信息、设备标识等。通过建立多模态融合模型,可以提高说话人识别的准确性和可靠性,尤其是在声学特征受到较大干扰的情况下。
以下我们假设使用模板匹配算法来实现
float* extract_mfcc(const int16_t *data, int length) {
int frame_size = 400;
int frame_step = 160;
int num_frames = (length - frame_size) / frame_step + 1;
float *mfcc = malloc(NUM_MFCC * sizeof(float));
if (!mfcc) return NULL;
fftw_complex *fft_in = fftw_malloc(sizeof(fftw_complex) * frame_size);
fftw_complex *fft_out = fftw_malloc(sizeof(fftw_complex) * frame_size);
fftw_plan fft_plan = fftw_plan_dft_1d(frame_size, fft_in, fft_out, FFTW_FORWARD, FFTW_ESTIMATE);
for (int frame = 0; frame < num_frames; frame++) {
for (int i = 0; i < frame_size; i++) {
fft_in[i][0] = data[frame * frame_step + i] * (0.54 - 0.46 * cos(2 * M_PI * i / (frame_size - 1))); // 使用汉明窗
fft_in[i][1] = 0.0;
}
fftw_execute(fft_plan);
for (int i = 0; i < NUM_MFCC; i++) {
mfcc[i] = ...;
}
}
fftw_destroy_plan(fft_plan);
fftw_free(fft_in);
fftw_free(fft_out);
return mfcc;
}
float calculate_similarity(const float *features1, const float *features2, int length) {
float dot_product = 0.0;
float norm1 = 0.0;
float norm2 = 0.0;
for (int i = 0; i < length; i++) {
dot_product += features1[i] * features2[i];
norm1 += features1[i] * features1[i];
norm2 += features2[i] * features2[i];
}
float similarity = dot_product / (sqrt(norm1) * sqrt(norm2));
return similarity;
}
在以上的代码中,我们使用通过fftw进行快速傅立叶计算模板,假设我们针对的是实时的160个字节的语音流进行计算,那么它大概每次包的cpu运算量预计会达到2000-3000左右,如果更高清一些的语音流,那么计算量是成倍数增长的,大概的160字节与320字节运算量分析见:
运算量分析
extract_mfcc函数:
首先计算帧数,对于 160 字节数据,帧数图片
对于 320 字节数据,帧数图片
n2约为2n1,而该函数中主要的运算集中在分帧、加窗、FFT 及后续 MFCC 系数提取等操作,这些操作的运算量基本与帧数成正比。因此,仅从帧数角度考虑,extract_mfcc函数处理 320 字节数据的运算量约是处理 160 字节数据运算量的 2 倍。
calculate_similarity函数:
假设 160 字节输入数据提取出的特征向量长度为,则 320 字节输入数据提取出的特征向量长度为。
该函数的运算量主要集中在循环内的乘法、加法、开方及除法运算,其运算量与特征向量长度成正比。所以,calculate_similarity函数处理 320 字节数据的运算量约是处理 160 字节数据运算量的 2 倍。
综合以上情况来看,我们当前在实时通话过程中进行说话人识别,不是不可以,最主要是得考虑硬件成本、并发量、延时等相关的综合指数,而不是为了如何就可以如何,在当前技术能力下,特别是动态时深度学习是最不可取。