Техника MGCA для извлечения речевых функций показывает эту ошибку (IndexError: список индекса вне диапазона) - PullRequest
0 голосов
/ 22 января 2019

При выполнении этой программы для извлечения речевых функций из файла wav у меня возникла проблема с кодом, скажем, ошибка IndexError: список индексов вне диапазона

Файл "C: / Users / KALEEM / PycharmProjects /Speech_Processing / 2-Speech_Signal_Processing_and_Classification-master / feature_extraction_techniques / mgca.py ", строка 77, в файле mel_Generalized () (файл" C: /Users/KALEEM/PycharmProjects/Speech_Processing/2., в mel_Generalized mgca_feature_extraction (wav) Файл "C: /Users/KALEEM/PycharmProjects/Speech_Processing/2-Speech_Signal_Processing_and_Classification-master/feature_extraction_techniques/mgca.py" файл_файла/KALEEM/PycharmProjects/Speech_Processing/2-Speech_Signal_Processing_and_Classification-master/feature_extraction_techniques/mgca.py ", строка 46, в файле writeFeatures wav = makeFormat (wav), файл" C: / Users / KALEEM / PycharmPro "ects / Speech_Processing / 2-Speech_Signal_Processing_and_Classification-master / feature_extraction_techniques / mgca.py ", строка 53, в makeFormat wav = wav.split ('/') [1] .split ('-') [1] IndexError: вывести индекс из спискадиапазона

Процесс завершен с кодом выхода 1

#!usr/bin/python
from pysptk import *
from scipy import hamming
import numpy.matlib
import scipy
import scipy.io.wavfile as wav
import numpy as np
import wave
from python_speech_features.sigproc import *
from math import *
from six.moves import input as raw_input


def readWavFile(wav):
        #given a path from the keyboard to read a .wav file
        #wav = raw_input('Give me the path of the .wav file you want to read: ')
        inputWav = 'C:/Users/KALEEM/PycharmProjects/Speech_Processing/2-Speech_Signal_Processing_and_Classification-master/feature_extraction_techniques'+wav
        return inputWav
#reading the .wav file (signal file) and extract the information we need
def initialize(inputWav):
        rate , signal  = wav.read(readWavFile(inputWav)) # returns a wave_read object , rate: sampling frequency
        sig = wave.open(readWavFile(inputWav))
        # signal is the numpy 2D array with the date of the .wav file
        # len(signal) number of samples
        sampwidth = sig.getsampwidth()
        print ('The sample rate of the audio is: ',rate)
        print ('Sampwidth: ',sampwidth)
        return signal ,  rate
#implementation of the low-pass filter
def lowPassFilter(signal, coeff=0.97):
        return np.append(signal[0], signal[1:] - coeff * signal[:-1]) #y[n] = x[n] - a*x[n-1] , a = 0.97 , a>0 for low-pass filters
def preEmphasis(wav):
        #taking the signal
        signal , rate = initialize(wav)
        #Pre-emphasis Stage
        preEmphasis = 0.97
        emphasizedSignal = lowPassFilter(signal)
        Time=np.linspace(0, len(signal)/rate, num=len(signal))
        EmphasizedTime=np.linspace(0, len(emphasizedSignal)/rate, num=len(emphasizedSignal))
        return emphasizedSignal, signal , rate

def writeFeatures(mgca_features,wav):
        #write in a txt file the output vectors of every sample
        f = open('mel_generalized_features.txt','a')#sample ID
        #f = open('mfcc_featuresLR.txt','a')#only to initiate the input for the ROC curve
        wav = makeFormat(wav)
        np.savetxt(f,mgca_features,newline=",")
        f.write(wav)
        f.write('\n')

def makeFormat(wav):
        #if i want to keep only the gender (male,female)
        wav = wav.split('/')[1].split('-')[1]
        #only to make the format for Logistic Regression
        if (wav=='Female'):
                wav='1'
        else:
                wav='0'
        return wav
def mgca_feature_extraction(wav):
        #I pre-emphasized the signal with a low pass filter
        emphasizedSignal,signal,rate = preEmphasis(wav)
        #and now I have the signal windowed
        emphasizedSignal*=np.hamming(len(emphasizedSignal))
        mgca_features = 'mgcep(emphasizedSignal,order=12)'
        writeFeatures(mgca_features,wav)
def mel_Generalized():
        folder = raw_input('Give the name of the folder that you want to read data: ')
        amount = raw_input('Give the number of samples in the specific folder: ')
        for x in range(1,int(amount)+1):
                wav = '/'+folder+'/'+str(x)+'.wav'
                print (wav)

        mgca_feature_extraction(wav)

#def main():
mel_Generalized()
#main()

1 Ответ

0 голосов
/ 22 января 2019

Скорее всего, проблема связана с неожиданным вводом, который нам было бы трудно проверить.

Более конкретно, в коде ниже:

def makeFormat(wav):
    #if i want to keep only the gender (male,female)
    wav = wav.split('/')[1].split('-')[1]
    #only to make the format for Logistic Regression
    if (wav=='Female'):
            wav='1'
    else:
            wav='0'
    return wav

Я бы предположил, что wav является str -подобным объектом (или в любом случае чем-то, что поддерживает .split()). Результат разделения обычно равен Iterable, например list. Если у такого Iterable есть 0 или 1 элемент, попытка получить доступ ко второму элементу (используя [1]) приведет к получению IndexError: list index out of range, который вы получаете. В вашем случае wav не содержит достаточно / (по крайней мере 1), достаточно - (также по крайней мере 1) или оба.

...