16位音频通常是有符号的。PCM音频的每个测量值表示扬声器在某个时间点应该停留在轴线上的位置。因此,完美的静默是任何重复的值——代表扬声器不动。
0是范围的中心,并且通常是没有输入时麦克风所在的位置。-32768是扬声器尽可能靠近其轴线一端的位置,32767是它在另一端。
检测沉默的最安全方法是在相关范围内运行光谱分析,查找任何可听频率范围内没有活动的时期。
如果您正在寻找语音之间的暂停,则最简单的方法可能是转到诸如此类网站,插入适合语音的可接受频率范围(在电话中被认为是约300 Hz到约3500 Hz),以及采样率和您认为可以承担的乘法数量。复制提供的系数。例如,我假设您将在44100 Hz的输入中跨越语音范围做37次敲击,并将其转换为C数组:
double coefficients[] = {
-0.000560, -0.001290, -0.002332, -0.003606, -0.004911, -0.005921, -0.006201,
-0.005256, -0.002610, 0.002106, 0.009059, 0.018139, 0.028924, 0.040691, 0.052479,
0.063203, 0.071794, 0.077351, 0.079274, 0.077351, 0.071794, 0.063203, 0.052479,
0.040691, 0.028924, 0.018139, 0.009059, 0.002106, -0.002610, -0.005256, -0.006201,
-0.005921, -0.004911, -0.003606, -0.002332, -0.001290, -0.000560};
如果输入是double
,对于每个输入样本c
,我会计算一个采样值:
double *inputWave = ... input, an infinite array for the purposes of the example ...
double sampledValue = 0.0;
for(size_t coeff = 0; coeff < numberOfTaps; coeff++) {
sampledValue += coefficients[coeff] * inputWave[c + coeff];
}
// (where numberOfTaps = sizeof(coefficients) / sizeof(coefficients[0]),
// i.e. the number of coefficients: 37 with the array given above)
我所得到的是一个带通滤波器。只有在频率范围为300-3500Hz的声音部分应该保留在输出值中。在现实生活中,没有这样完美的过滤器;增加系数可以提高过滤器的质量。
削减信号的无关部分后,我可以寻找持续一段时间的“采样值=[接近] 0.0”的区域。