有没有一种快速的方法来找到(不一定能识别)音频文件中的人类语音?

Ily*_*rov 9 python voice-recognition

我想编写一个自动同步未同步字幕的程序.我想到的解决方案之一就是以某种方式通过算法找到人类的语言,并将子弹进行调整.我找到的API(Google Speech API,Yandex SpeechKit)可以与服务器一起使用(对我来说不是很方便),并且(可能)做了很多不必要的工作来确定究竟说了什么,而我只需要知道某些东西已经有了有人说.

换句话说,我想给它音频文件,并得到这样的东西:

[(00:12, 00:26), (01:45, 01:49) ... , (25:21, 26:11)]
Run Code Online (Sandbox Code Playgroud)

是否有解决方案(最好是在python中)只能找到人类语音并在本地机器上运行?

Dji*_*eus 7

您尝试做的技术术语称为语音活动检测(VAD).有一个名为SPEAR的python库可以完成它(除此之外).


Joh*_*man 5

webrtcvad是围绕 Google 出色的WebRTC语音活动检测 (VAD) 实现的 Python 包装器——它在正确分类人类语音方面做得最好,即使是嘈杂的音频也是如此。

要将它用于您的目的,您可以执行以下操作:

  1. 将文件转换为 8 KHz 或 16 Khz、16 位、单声道格式。这是 WebRTC 代码所要求的。
  2. 创建一个 VAD 对象: vad = webrtcvad.Vad()
  3. 将音频分成 30 毫秒的块。
  4. 检查每个块以查看它是否包含语音: vad.is_speech(chunk, sample_rate)

VAD 输出可能是“嘈杂的”,如果它将单个 30 毫秒的音频块分类为语音,您真的不想为此输出时间。您可能想查看过去 0.3 秒(左右)的音频,看看该时间段内 30 毫秒的块中的大部分是否被归类为语音。如果是,则输出该 0.3 秒时段的开始时间作为语音的开始。然后你做一些类似的事情来检测语音何时结束:等待 0.3 秒的音频周期,其中大部分 30 毫秒的块没有被 VAD 归类为语音——当发生这种情况时,输出结束时间作为语音结束.

您可能需要稍微调整时间以获得适合您的目的的良好结果——也许您决定需要 0.2 秒的音频,其中超过 30% 的块在触发之前被 VAD 分类为语音,以及 1.0 秒在您取消触发之前,超过 50% 的块被归类为非语音的音频。

环形缓冲区(collections.deque在 Python 中)是一种有用的数据结构,用于跟踪最后 N 个音频块及其分类。