检测语音音频文件中非语音响亮声音的位置

Detect where non-speech loud sound exists in a speech audio file

有没有办法检测音频文件中除语音以外的其他响亮声音的位置(开始和结束)?比如敲东西的声音、爆裂音效、鼠标点击音效、电脑生成的短音乐等

综上所述,条件是:

  1. 声音不是人声。
  2. 声音比该音频文件中人类语音的平均音量大。

有许多现成的开源语音 Activity 检测器。如果满足以下条件:

  1. 给定的音频帧未分类为语音并且
  2. 音频帧能量高于根据语音帧计算的自适应阈值

将帧分类为“大声非语音”。

RNNoise,一个噪声抑制库,有很好的VAD,算法很容易实时工作。

下面是一个关于如何使用库获取 VAD 的粗略示例:

#include <stdio.h>
#include "rnnoise.h"

#define FRAME_SIZE 480

int main(int argc, char **argv) {
  int i;
  int framepos = 0;
  float vad;
  float x[FRAME_SIZE];
  FILE *f1;
  DenoiseState *st;
  st = rnnoise_create(NULL);
  if (argc!=2) {
    fprintf(stderr, "usage: %s <noisy speech>\n", argv[0]);
    return 1;
  }
  f1 = fopen(argv[1], "rb");
  while (1) {
    short tmp[FRAME_SIZE];
    fread(tmp, sizeof(short), FRAME_SIZE, f1);
    if (feof(f1)) break;
    for (i=0;i<FRAME_SIZE;i++) x[i] = tmp[i];
    vad = rnnoise_process_frame(st, x, x);
    if (vad < 0.1) printf("Non-speech frame position %d VAD %f", framepos, vad);
    framepos += FRAME_SIZE;
  }
  rnnoise_destroy(st);
  fclose(f1);
  return 0;
}

我没有编译它/运行,所以你可能需要修复一两行才能让它工作。