audio - "16bit integer PCM data"是否意味着它已签名或未签名?

标签 audio signal-processing pcm fmod

我正在使用 FMOD 开发一个应用程序,当用户单击“下一个/上一个”按钮时,该应用程序会立即从 MP3 文件的开头开始播放下一个/上一个句子的录音,该文件包含语音,但不包含音乐。我通过调用Sound::lock获取了mp3文件的PCM数据,但是Sound::getFormat只告诉我这是“16位整数PCM数据”,而没有说是否它是签名未签名的。我怎么知道呢?

互联网上的一些文章称,几乎所有 16 位整数 PCM 数据都是有符号的。如果我的 PCM 数据是有符号的,那么什么范围的值代表静音,接近 0 的值(例如 -10 ~ 10),还是接近 -32768 的值(例如 -32768 ~ -32750)?如果它们是接近0的值,是否意味着相反的数字(例如-32767和32767)在含义上没有区别?

我需要检测足够长的沉默,例如超过 500ms,以确定语音中每个句子的开始位置。

有人可以给我关于如何检测句子之间的沉默的任何建议吗?

最佳答案

按照惯例,16 位音频通常是经过签名的。

想一想什么是 PCM 音频:每个测量值都是扬声器在该时刻沿其轴线物理静止的距离。因此,完美的静音绝对是任何重复值——代表说话者没有移动。

0 是范围的中心,通常是麦克风在没有输入的情况下应位于的位置。 -32768 是扬声器尽可能靠近其轴的一端,32767 是在另一端。

检测静音的最安全方法是在相关范围内运行频谱分析,并查找在任何可听频率范围内没有事件的时段。

如果您正在寻找语音之间的停顿,那么最简单的方法可能是去像 this 这样的地方,插入可接受的语音频率范围(在电话中被认为是大约 300Hz 到大约 3500Hz)、采样率以及您认为可以承受的乘法次数。复制提供的系数。例如。我假设您将使用 44100Hz 输入在语音范围内进行 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 频率范围内声音的信号部分应保留在输出值中。在现实生活中,没有这样的过滤器是完美的。增加系数的数量以提高滤波器的质量。

删除信号中不相关的部分后,我可以寻找 sampledValue = [接近] 0.0 的长时间段。

关于audio - "16bit integer PCM data"是否意味着它已签名或未签名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28632721/

相关文章:

audio - 带有 fmod 的 PCM 数据格式 - 多个平台上的差异

audio - 我是否需要我的编解码器为 ALSA?

c# - WPF MediaElement : SpeedRatio not working for . m4a 文件?

flash - 如何使Flash as2中的声音静音

c - 如何编写提供频率信息的 iTunes 插件

signal-processing - 带或不带窗口的 KISS FFT 输出

audio - 我似乎无法让音频在我的应用中正常工作?我正在使用AVAudio框架

android - 在Android中顺序播放多种声音

signal-processing - RaptorQ 开源实现

java - Java Audio SourceDataLine不支持PCM_FLOAT