MFCC特性中的Python:HMM实现

MFCC特性中的Python:HMM实现,python,audio,mfcc,hmmlearn,Python,Audio,Mfcc,Hmmlearn,使用MFCC功能作为输入数据(Numpy数组(20X56829)),通过应用HMM尝试从HMM的解码状态创建音频词汇表。MFCC功能中有10个扬声器。每个发言者需要50个州。所以我使用了N=500个状态,它抛出内存错误,但它在N=100个状态下运行良好 代码如下: import numpy as np from hmmlearn import hmm import librosa def getMFCC(episode): filename = getPathToGroundtrut

使用MFCC功能作为输入数据(Numpy数组(20X56829)),通过应用HMM尝试从HMM的解码状态创建音频词汇表。MFCC功能中有10个扬声器。每个发言者需要50个州。所以我使用了N=500个状态,它抛出内存错误,但它在N=100个状态下运行良好

代码如下:

import numpy as np
from hmmlearn import hmm
import librosa

def getMFCC(episode):

    filename = getPathToGroundtruth(episode)

    y, sr = librosa.load(filename)  # Y gives 

    data = librosa.feature.mfcc(y=y, sr=sr)

    return data

def hmm_init(n,data):  #n = states d = no of feautures

    states =[]

    model = hmm.GaussianHMM(n_components=N, covariance_type="full")

    model.transmat_ = np.ones((N, N)) / N

    model.startprob_ = np.ones(N) / N

    fit = model.fit(data.T)

    z=fit.decode(data.T,algorithm='viterbi')[1]

    states.append(z)

    return states

data_m = getMFCC(1)  # Provides MFCC features of numpy array [20 X 56829]

N = 500

D= len(data)

states = hmm_init(N,data)

In [23]: run Final_hmm.py
---------------------------------------------------------------------------
MemoryError                               Traceback (most recent call last)
/home/elancheliyan/Final_hmm.py in <module>()
     73 D= len(data)
     74 
---> 75 states = hmm_init(N,data)
     76 states.dump("states")
     77 

/home/elancheliyan/Final_hmm.py in hmm_init(n, data)
     57     model.startprob_ = np.ones(N) / N
     58 
---> 59     fit = model.fit(data.T)
     60 
     61     z=fit.decode(data.T,algorithm='viterbi')[1]

/cal/homes/elancheliyan/.local/lib/python3.5/site-packages/hmmlearn-0.2.1-py3.5-linux-x86_64.egg/hmmlearn/base.py in fit(self, X, lengths)
    434                 self._accumulate_sufficient_statistics(
    435                     stats, X[i:j], framelogprob, posteriors, fwdlattice,
--> 436                     bwdlattice)
    437 
    438             # XXX must be before convergence check, because otherwise

/cal/homes/elancheliyan/.local/lib/python3.5/site-packages/hmmlearn-0.2.1-py3.5-linux-x86_64.egg/hmmlearn/hmm.py in _accumulate_sufficient_statistics(self, stats, obs, framelogprob, posteriors, fwdlattice, bwdlattice)
    221                                           posteriors, fwdlattice, bwdlattice):
    222         super(GaussianHMM, self)._accumulate_sufficient_statistics(
--> 223             stats, obs, framelogprob, posteriors, fwdlattice, bwdlattice)
    224 
    225         if 'm' in self.params or 'c' in self.params:

/cal/homes/elancheliyan/.local/lib/python3.5/site-packages/hmmlearn-0.2.1-py3.5-linux-x86_64.egg/hmmlearn/base.py in _accumulate_sufficient_statistics(self, stats, X, framelogprob, posteriors, fwdlattice, bwdlattice)
    620                 return
    621 
--> 622             lneta = np.zeros((n_samples - 1, n_components, n_components))
    623             _hmmc._compute_lneta(n_samples, n_components, fwdlattice,
    624                                  log_mask_zero(self.transmat_),

MemoryError:
将numpy导入为np
从hmmlearn导入hmm
进口藏红花
def getMFCC(第集):
filename=getPathToGroundtruth(插曲)
y、 sr=librosa.load(文件名)#y
data=librosa.feature.mfcc(y=y,sr=sr)
返回数据
def hmm_init(n,数据):#n=状态d=故障数
国家=[]
模型=hmm.GaussianHMM(n_分量=n,协方差类型=“完整”)
model.transmat=np.ones((N,N))/N
model.startprob=np.ones(N)/N
拟合=model.fit(data.T)
z=fit.decode(data.T,algorithm='viterbi')[1]
附加(z)
返回状态
data_m=getMFCC(1)#提供numpy数组的MFCC特性[20 X 56829]
N=500
D=长度(数据)
states=hmm_init(N,数据)
在[23]:运行Final_hmm.py
---------------------------------------------------------------------------
MemoryError回溯(上次最近调用)
/主页/elancheliyan/Final_hmm.py in()
73 D=长度(数据)
74
--->75个状态=hmm_init(N,数据)
76.倾销(“国家”)
77
/home/elancheliyan/Final_hmm.py in hmm_init(n,数据)
57 model.startprob=np.ones(N)/N
58
--->59拟合=模型拟合(data.T)
60
61 z=fit.decode(data.T,algorithm='viterbi')[1]
/cal/homes/elancheliyan/.local/lib/python3.5/site-packages/hmmlearn-0.2.1-py3.5-linux-x86_64.egg/hmmlearn/base.py适合(self,X,长度)
434自我积累足够的统计数据(
435统计数据,X[i:j],framelogprob,后验,fwdlattice,
-->436 bwdlattice)
437
438#XXX必须在收敛检查之前,否则
/cal/homes/elancheliyan/.local/lib/python3.5/site-packages/hmmlearn-0.2.1-py3.5-linux-x86_64.egg/hmmlearn/hmm.py in积累足够的统计信息(self、stats、obs、framelogprob、posteriors、fwdlattice、bwdlattice)
221后验,前舱位,前舱位):
222超(高斯,自)。积累足够的统计数据(
-->223统计数据、obs、framelogprob、后验数据、前向数据、后向数据)
224
225如果self.params中的“m”或self.params中的“c”:
/cal/homes/elancheliyan/.local/lib/python3.5/site-packages/hmmlearn-0.2.1-py3.5-linux-x86_64.egg/hmmlearn/base.py in积累足够的统计信息(self、stats、X、framelogprob、posteriors、fwdlattice、bwdlattice)
620返回
621
-->622 lneta=np.零((n_样本-1,n_分量,n_分量))
623 _hmmc._compute_lneta(n_样本、n_分量、fwdlattice、,
624日志屏蔽零(自传输),
记忆错误:

我的初始化有什么问题吗?

正如我们所做的,您的代码没有问题。问题在于经典Baum-Welch算法的内存要求。去年,人们使用sklearn.hmm来实现这一点。但我不能。我使用Pomengranate,它显示奇异值矩阵。有没有有效的实现我可以遵循的更高阶状态?你能把我链接到去年的代码吗?你可以安装一个旧版本的scikit learn(随hmm模块一起提供)并针对它运行代码。否则,您可以将观察结果拆分为多个序列以减少内存消耗。感谢我尝试减少状态以及尝试拆分数据。使用去年的代码。去年他们的输入数据非常小。因此,它对他们起到了作用。但我担心拆分数据不会得到相同的结果结果。因为对于每一段拼接数据,它可能使用新的初始化,而不是获得过去观察到的初始化。正如我们所做的,您的代码没有问题。问题在于经典Baum-Welch算法的内存需求去年,人们使用sklearn.hmm来实现这一点。但我无法做到。我曾经使用Pomengranate,它显示奇异值矩阵。对于高阶状态,有什么有效的实现方法可以遵循吗?你能把我链接到去年的代码吗?你可以安装一个旧版本的scikit learn(随hmm模块一起提供)并针对它运行代码。否则,您可以将观察结果拆分为多个序列以减少内存消耗。感谢我尝试减少状态以及尝试拆分数据。使用去年的代码。去年他们的输入数据非常小。因此,它对他们起到了作用。但我担心拆分数据不会得到相同的结果结果。因为对于每一段拼接数据,它可能使用新的初始化,而不是获取过去观察到的初始化。