从任意音频文件中提取语音部分的好方法是什么?

时间:2011-03-31 10:04:01

标签: linux audio signal-processing voice voice-detection

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

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

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

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

我也看过Python的'wave'库,但后来我需要编写自己的Sox'vad'实现。

是否有任何命令行工具能够满足我的需求?如果没有,任何好的Python或Ruby方法?

4 个答案:

答案 0 :(得分:22)

EnergyDetector

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

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

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/中找到细分。< / p>

作为参考,我附上了我的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 Sphinx

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

最近新增的是GStreamer支持。这意味着您可以在GStreamer媒体管道中使用其VAD。见Using PocketSphinx with GStreamer and Python -> The 'vader' element

其他VAD

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

答案 1 :(得分: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)

答案 2 :(得分: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)

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

答案 3 :(得分:0)

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

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