17

我有一组用户上传的音频文件,不知道它们包含什么。

我想获取一个任意音频文件,并将某人说话的每个实例提取到单独的音频文件中。我不想检测实际的话,只是“开始说话”、“停止说话”点并在这些点生成新文件。

(我的目标是 Linux 环境,并在 Mac 上开发)

我发现了Sox,它看起来很有希望,并且它具有“vad”模式(语音活动检测)。然而,这似乎找到了第一个语音实例并在该点之前剥离音频,所以它很接近,但并不完全正确。

我还查看了 Python 的“wave”库,但是我需要编写自己的 Sox 的“vad”实现。

是否有任何命令行工具可以执行我想要的现成操作?如果没有,任何好的 Python 或 Ruby 方法?

4

4 回答 4

22

能量探测器

对于语音活动检测,我一直在使用基于 ALIZE 库的MISTRAL(原为 LIA_RAL)说话人识别工具包的 EnergyDetector 程序。

它适用于特征文件,而不适用于音频文件,因此您需要提取信号的能量。我通常使用 log-energy 参数提取倒谱特征 (MFCC),并将此参数用于 VAD。您可以通过以下方式使用SPro信号处理工具包的实用程序部分 sfbcep` :

sfbcep -F PCM16 -p 19 -e -D -A input.wav output.prm

它将提取 19 个 MFCC + 对数能量系数 + 一阶和二阶 delta 系数。能量系数是第 19 位,您将在 EnergyDetector 配置文件中指定。

然后,您将以这种方式运行 EnergyDetector:

EnergyDetector --config cfg/EnergyDetector.cfg --inputFeatureFilename output 

如果您使用答案末尾找到的配置文件,则需要output.prm输入prm/,您会在lbl/.

作为参考,我附上了我的 EnergyDetector 配置文件:

*** EnergyDetector Config File
***

loadFeatureFileExtension        .prm
minLLK                          -200
maxLLK                          1000
bigEndian                       false
loadFeatureFileFormat           SPRO4
saveFeatureFileFormat           SPRO4
saveFeatureFileSPro3DataKind    FBCEPSTRA
featureServerBufferSize         ALL_FEATURES
featureServerMemAlloc           50000000
featureFilesPath                prm/
mixtureFilesPath                gmm/
lstPath                         lst/
labelOutputFrames               speech
labelSelectedFrames             all
addDefaultLabel                 true
defaultLabel                    all
saveLabelFileExtension          .lbl
labelFilesPath                  lbl/    
frameLength                     0.01
segmentalMode                   file
nbTrainIt                       8       
varianceFlooring                0.0001
varianceCeiling                 1.5     
alpha                           0.25
mixtureDistribCount             3
featureServerMask               19      
vectSize                        1
baggedFrameProbabilityInit      0.1
thresholdMode                   weight

CMU狮身人面像

CMU Sphinx语音识别软件包含一个内置的 VAD 。它是用 C 语言编写的,您可以破解它来为您生成标签文件。

最近添加的是 GStreamer 支持。这意味着您可以在 GStreamer 媒体管道中使用其 VAD。请参阅将 PocketSphinx 与 GStreamer 和 Python 一起使用 -> 'vader' 元素

其他 VAD

我也一直在使用 AMR1 编解码器的修改版本,它输出具有语音/非语音分类的文件,但我无法在网上找到它的来源,抱歉。

于 2011-03-31T10:34:04.823 回答
3

webrtcvad是一个围绕 Google 优秀的WebRTC语音活动检测代码的 Python 包装器。

它带有一个文件example.py,它完全符合您的要求:给定一个 .wav 文件,它会找到某人说话的每个实例并将其写入一个新的单独的 .wav 文件。

webrtcvad API 非常简单,以防 example.py 不能满足您的要求:

import webrtcvad

vad = webrtcvad.Vad()
# sample must be 16-bit PCM audio data, either 8KHz, 16KHz or 32Khz,
# and 10, 20, or 30 milliseconds long.
print vad.is_voiced(sample)
于 2016-04-24T17:02:40.010 回答
2

pyAudioAnalysis具有消除静音功能。

在这个库中,消除静音可以很简单:

from pyAudioAnalysis import audioBasicIO as aIO
from pyAudioAnalysis import audioSegmentation as aS

[Fs, x] = aIO.readAudioFile("data/recording1.wav")
segments = aS.silenceRemoval(x, 
                             Fs, 
                             0.020, 
                             0.020, 
                             smoothWindow=1.0, 
                             Weight=0.3, 
                             plot=True)

silenceRemoval()实现参考:https ://github.com/tyiannak/pyAudioAnalysis/blob/944f1d777bc96717d2793f257c3b36b1acf1713a/pyAudioAnalysis/audioSegmentation.py#L670

内部静音removal()遵循半监督方法:首先,训练 SVM 模型以区分高能和低能短期帧。为此,使用了 10% 的最高能量帧和 10% 的最低能量帧。然后,在整个记录上应用 SVM(带有概率输出),并使用动态阈值来检测活动片段。

参考论文:https ://journals.plos.org/plosone/article?id=10.1371/journal.pone.0144610

于 2015-04-17T23:31:21.603 回答
0

SPro 和 HTK 是您需要的工具包。您还可以使用 Alize Toolkit 的文档查看实现。

http://alize.univ-avignon.fr/doc.html

于 2014-07-21T18:13:06.270 回答