Rilevatore di energia
Per il rilevamento dell'attività vocale, ho utilizzato il programma EnergyDetector del toolkit di riconoscimento degli altoparlanti MISTRAL (era LIA_RAL), basato sulla libreria ALIZE.
Funziona con file di funzionalità, non con file audio, quindi dovrai estrarre l'energia del segnale. Di solito estraggo le caratteristiche cepstrali (MFCC) con il parametro log-energy e utilizzo questo parametro per VAD. Puoi utilizzare sfbcep`, un'utilità parte del toolkit di elaborazione del segnale SPro nel modo seguente:
sfbcep -F PCM16 -p 19 -e -D -A input.wav output.prm
Estrarrà 19 MFCC + coefficiente log-energia + coefficienti delta di primo e secondo ordine. Il coefficiente energetico è il 19, lo specifichi nel file di configurazione di EnergyDetector.
Quindi eseguirai EnergyDetector in questo modo:
EnergyDetector --config cfg/EnergyDetector.cfg --inputFeatureFilename output
Se usi il file di configurazione che trovi alla fine della risposta, devi mettere output.prm
in prm/
e troverai la segmentazione in lbl/
.
Come riferimento, allego il mio file di configurazione 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 Sfinge
Il software di riconoscimento vocale CMU Sphinx contiene un VAD integrato. È scritto in C e potresti essere in grado di hackerarlo per produrre un file etichetta per te.
Un'aggiunta molto recente è il supporto GStreamer. Ciò significa che puoi utilizzare il suo VAD in una pipeline multimediale GStreamer. Vedi Usare PocketSphinx con GStreamer e Python -> L'elemento 'vader'
Altri VAD
Ho anche utilizzato una versione modificata del codec AMR1 che emette un file con classificazione vocale/non vocale, ma non riesco a trovare le sue fonti online, mi dispiace.
webrtcvad è un wrapper Python attorno all'eccellente codice WebRTC Voice Activity Detection di Google.
Viene fornito con un file, example.py, che fa esattamente quello che stai cercando:dato un file .wav, trova ogni istanza di qualcuno che parla e la scrive in un nuovo file .wav separato.
L'API webrtcvad è estremamente semplice, nel caso in cui example.py non faccia proprio quello che vuoi:
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)
Hi pyAudioAnalysis ha una funzionalità di rimozione del silenzio.
In questa libreria, la rimozione del silenzio può essere così semplice:
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)
Silenzia internamente removal()
segue un approccio semi-supervisionato:prima viene addestrato un modello SVM per distinguere tra frame a breve termine ad alta e bassa energia. A tal fine, vengono utilizzati il 10% dei telai a più alta energia insieme al 10% di quelli a più bassa. Quindi, l'SVM viene applicato (con un output probabilistico) sull'intera registrazione e viene utilizzata una soglia dinamica per rilevare i segmenti attivi.