精华内容
下载资源
问答
  • hmm模型matlab代码HMM-GMM 这是我个人实现的隐马尔可夫模型和高斯混合模型,这是统计机器学习中的两个经典生成模型。 HMM是在无监督的情况下进行训练的,代码实现了前向后退算法,以在给出部分/全部观测值的任何时间...
  • 用于隔离数字识别的简单GMM-HMM模型 简单的GMM和HMM模型的Python实现,用于隔离数字识别。 此实现包含3个模型: 单一高斯:使用具有对角协方差的单一高斯对每个数字进行建模。 高斯混合模型(GMM):每个数字都是...
  • HMM-GMM模型的理解

    2021-04-15 11:22:00
    一、HMM的理解 HMM——Hidden Markov Model,隐马尔科夫链模型,认为某时序信息X(t)X(t)X(t)可以由一个隐状态链S(n)S(n)S(n)描述。此状态链包括nnn个状态,以及各个状态间的转移概率ppp,类似下图。 ref 同时,认为...

    一、HMM的理解

    HMM——Hidden Markov Model,隐马尔科夫链模型,认为某时序信息 X ( t ) X(t) X(t)可以由一个隐状态链 S ( n ) S(n) S(n)描述。此状态链包括 n n n个状态,以及各个状态间的转移概率 p p p,类似下图。
    在这里插入图片描述
    ref: [R. Sharma, J. Cai, S. Chakravarthy, I. Poddar and Y. Sethi, “Exploiting speech/gesture co-occurrence for improving continuous gesture recognition in weather narration,” Proceedings Fourth IEEE International Conference on Automatic Face and Gesture Recognition (Cat. No. PR00580), Grenoble, France, 2000, pp. 422-427, doi: 10.1109/AFGR.2000.840669].
    同时,认为每个状态会以一定的发射概率 p e p_e pe产生某一种观察值,即对应时序信息 X ( t ) X(t) X(t)

    通常对于独立的状态识别问题,我们只需要知道每个状态的发射概率即可,通过比对观察值属于那个状态的概率更高,我们就掌握了该次观察应该从属于哪个状态。但这种方法不能引入时序的影响,使用这种方法时需要简单地认为序列在每个时刻的信息是互不相关的,这显然会降低对时序信息建模的精确度。HMM通过引入状态转移概率来描述时序的影响,在根据发射概率模型简单确定每时刻信息对应的状态后,借助Viterbi算法基于建立好的HMM模型再对状态进行进一步重新确定,于是时序信息就通过HMM的隐状态链表达出来了。

    常见的HMM模型包括全HMM、左右HMM等,主要区别在于每个状态受到几个其他状态的影响(也就是几个转移链连接到了该状态,阶数)。

    这里显然存在一个问题——若按照离散的概率模型建模发射概率,会隐含地假设观察值同样按照离散模型分布。这对于简单问题,如某天的天气等,是可行的,因为观察值确实离散且个数少,但对于语音识别等多数问题而言,模型的观察值通常以某一连续变化的特征量所表征,如MFCC等。此时,简单离散模型建模显然不可能满足要求,需要一种能够表征连续分布的新模型,将不同但类似的多种观察值归为一类(通常将这一类直接归为一种状态的输出,最终直接以测试数据在各类下的输出概率作比较,从而退化成简单离散概率模型)。

    Exemple:
    StateNum=3; length(data)=30; size(log(p(xn|zn)))=[30 3]

    即当状态数为3、输入数据时间长度为30时,进行HMM训练的过程会先计算每个时刻数据从属于这3个状态的概率。

    二、HMM-GMM模型

    GMM——Gaussian Mixture Model,混合高斯模型,可以简单地理解为多个高斯模型之和。高斯模型具备建模不同维度连续数据的能力,而混合高斯模型在其阶数足够的前提下,又可以很好地模拟各种复杂的分布,于是可以认为GMM在面对高维度、复杂分布的数据时仍然具备较好的拟合能力。将该模型作为HMM的发射概率,就可以得到HMM-GMM模型。

    通常基于HMM-GMM模型的建模任务不会将每个时刻都划为一个状态,而是将多个连续时刻的数据归为一个状态的GMM模型。例如对于某20帧的MFCC输入语音输入一般可能只会建模三个状态来表征。

    当然发射概率模型不是只有GMM这一种方法,利用GMM初步建模后的状态标签数据可以作为DNN的训练数据,后续可以用训练好的DNN代替GMM,即引入简单的神经网络结构以利用其更加复杂地表达数据的能力。

    HMM-based模型仍然是存在缺点的,从HMM的结构出发,可以非常直观地看到,由于通常情况下HMM的状态数会小于输入数据长度,那么在每个状态所对应的多帧输入数据间的时序信息显然被忽略了。

    在这里插入图片描述

    值得注意的是HMM-based模型与现如今已经存在可以直接表征时序信息的神经网络结构,如RNN等,对于时序信息的建模思路较为类似,具体关系可以参考知乎:HMM和RNN是什么关系?功效上两者有冲突重叠?

    展开全文
  • https://github.com/jayaram1125/Single-Word-Speech-Recognition-using-GMM-HMM- 数据集得自己造: # -----------------------------------------------------------------------------------------...

    可供参考的项目有:

    https://github.com/jayaram1125/Single-Word-Speech-Recognition-using-GMM-HMM-

     

     

    数据集得自己造:

     

    # -----------------------------------------------------------------------------------------------------
    '''
    &usage:		HMM-GMM的孤立词识别模型
    @author:	hongwen sun
    '''
    # -----------------------------------------------------------------------------------------------------
    # 导入依赖库,特别需要注意hmmlearn
    from python_speech_features import mfcc
    from scipy.io import wavfile
    from hmmlearn import hmm
    from sklearn.externals import joblib
    import numpy as np
    import os
    
    
    # -----------------------------------------------------------------------------------------------------
    '''
    &usage:		准备所需数据
    '''
    # -----------------------------------------------------------------------------------------------------
    # 生成wavdict,key=wavid,value=wavfile
    def gen_wavlist(wavpath):
    	wavdict = {}
    	labeldict = {}
    	for (dirpath, dirnames, filenames) in os.walk(wavpath):
    		for filename in filenames:
    			if filename.endswith('.wav'):
    				filepath = os.sep.join([dirpath, filename])
    				fileid = filename.strip('.wav')
    				wavdict[fileid] = filepath
    				label = fileid.split('_')[1]
    				labeldict[fileid] = label
    	return wavdict, labeldict
    
    
    
    
    # 特征提取,feat = compute_mfcc(wadict[wavid])
    def compute_mfcc(file):
    	fs, audio = wavfile.read(file)
    	# 这里我故意fs/2,有些类似减小step,不建议这样做,投机取巧做法
    	mfcc_feat = mfcc(audio, samplerate=(fs/2), numcep=26)
    	return mfcc_feat
    
    
    # -----------------------------------------------------------------------------------------------------
    '''
    &usage:		搭建HMM-GMM的孤立词识别模型
    参数意义:
    	CATEGORY:	所有标签的列表
    	n_comp:		每个孤立词中的状态数
    	n_mix:		每个状态包含的混合高斯数量
    	cov_type:	协方差矩阵的类型
    	n_iter:		训练迭代次数
    '''
    # -----------------------------------------------------------------------------------------------------
    
    class Model():
    	"""docstring for Model"""
    	def __init__(self, CATEGORY=None, n_comp=3, n_mix = 3, cov_type='diag', n_iter=1000):
    		super(Model, self).__init__()
    		self.CATEGORY = CATEGORY
    		self.category = len(CATEGORY)
    		self.n_comp = n_comp
    		self.n_mix = n_mix
    		self.cov_type = cov_type
    		self.n_iter = n_iter
    		# 关键步骤,初始化models,返回特定参数的模型的列表
    		self.models = []
    		for k in range(self.category):
    			model = hmm.GMMHMM(n_components=self.n_comp, n_mix = self.n_mix, 
    								covariance_type=self.cov_type, n_iter=self.n_iter)
    			self.models.append(model)
    
    	# 模型训练
    	def train(self, wavdict=None, labeldict=None):
    		for k in range(10):
    			subdata = []
    			model = self.models[k]
    			for x in wavdict:
    				if labeldict[x] == self.CATEGORY[k]:
    					mfcc_feat = compute_mfcc(wavdict[x])
    					model.fit(mfcc_feat)
    
    	# 使用特定的测试集合进行测试
    	def test(self, wavdict=None, labeldict=None):
    		result = []
    		for k in range(self.category):
    			subre = []
    			label = []
    			model = self.models[k]
    			for x in wavdict:
    				mfcc_feat = compute_mfcc(wavdict[x])
    				# 生成每个数据在当前模型下的得分情况
    				re = model.score(mfcc_feat)
    				subre.append(re)
    				label.append(labeldict[x])
    			# 汇总得分情况
    			result.append(subre)
    		# 选取得分最高的种类
    		result = np.vstack(result).argmax(axis=0)
    		# 返回种类的类别标签
    		result = [self.CATEGORY[label] for label in result]
    		print('识别得到结果:\n',result)
    		print('原始标签类别:\n',label)
    		# 检查识别率,为:正确识别的个数/总数
    		totalnum = len(label)
    		correctnum = 0
    		for i in range(totalnum):
    		 	if result[i] == label[i]:
    		 	 	correctnum += 1 
    		print('识别率:', correctnum/totalnum)
    
    
    	def save(self, path="models.pkl"):
    		# 利用external joblib保存生成的hmm模型
    		joblib.dump(self.models, path)
    
    
    	def load(self, path="models.pkl"):
    		# 导入hmm模型
    		self.models = joblib.load(path)
    
    
    # -----------------------------------------------------------------------------------------------------
    '''
    &usage:		使用模型进行训练和识别
    '''
    # -----------------------------------------------------------------------------------------------------
    # 准备训练所需数据
    CATEGORY = ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10']
    wavdict, labeldict = gen_wavlist('training_data')
    testdict, testlabel = gen_wavlist('test_data')	
    # 进行训练
    models = Model(CATEGORY=CATEGORY)
    models.train(wavdict=wavdict, labeldict=labeldict)
    models.save()
    models.load()
    models.test(wavdict=wavdict, labeldict=labeldict)
    models.test(wavdict=testdict, labeldict=testlabel)
    

     

     

     

    展开全文
  • 孤立词语音识别 我用的是HMM-GMM的模型进行识别。 识别出的存成一个list:‘results’,用逗号分割。 results = [‘1’, ‘7’, ‘3’, ‘5’, ‘7’, ‘2’, … , ‘9’] 写入到Excel文件*.xlsx 输入是一个list,...

    实现功能

    系统可分为两部分:

    1. 发送端实现读取excel中的内容,合成连续语音;
    2. 接收端读取该音频,识别后重新生成excel文件;
      结构图。SPK和MIC用音频线连接

    发送端

    1. 从定好格式的excel文件中读取需要的信息;
    2. 根据第1步得到的数据,生成语音;
    3. play the radio or not。
    百度语音合成
    1. 语音合成部分用到了百度AIP,该功能需要连网。
      一个教程
    2. 进入’百度AI’主页
    3. 在右上角的“控制台”上,点击“语音技术”按钮,打开控制台的登录界面。这里需要你登录自己的百度账号,且需要实名。
    4. 点击页面的“创建应用”按钮。选择需要调用的借口(也就是AI程序),其中语音识别和语音合成是必选的;语音包名不需要(我们要用python调用,所以不需要)。
    5. 保存之后,就进入应用管理,查看自己的应用的APPID、APPKEY,还有SECRET KEY。
    from pydub import AudioSegment
    from pydub.playback import play
    from aip import AipSpeech
    #安装库的时候搜索:baidu-aip
    
    def voice_gen_online(text):
        APP_ID = 'xx'
        API_KEY ='xx'
        SECRET_KEY = 'xx'
        client = AipSpeech(APP_ID, API_KEY, SECRET_KEY)
        # 语音合成
        result = client.synthesis(text, 'zh', 1, {
            'vol': 5, 'spd': 1, 'pit': 5, 'per': 1
        })
        if not isinstance(result, dict):
            filename = 'test'
            with open(filename + '.mp3', 'wb') as f:
                f.write(result)
            sound = AudioSegment.from_mp3(filename + '.mp3')
            # 播放
            # play(sound)
            # covert to *.wav
            sound.export('online_' + filename + '.wav', format="wav")
    
    • 因为我们只针对10个数字,数据量不算大。所以,我们首先在联网时,依次产生10个数字的独立音频,建立自己的语音元素库。独立音频根据需要拼接起来就是连续的音频。这样可以实现离线生成连续语音。
    本地语音合成
    #自己做了个词典
    dict = {'0': '0.wav',
               ...
                'i': 'i.wav'}
                
    def voice_gen(string:data, filename):
        sounds = []
        for s in data:
            a = dict[s]
            filepath = './dict/' + dict[s]
            sounds.append(AudioSegment.from_wav(filepath))
        playlist = AudioSegment.empty()
        for sound in sounds:
            playlist += sound
        playlist.export(filename + '.wav', format="wav")
    

    接收端

    1. 监听麦克风,有音频输入就录下来;
    2. 对得到的录音进行识别;
    3. 识别结果填表。

    一些注意事项:

    • 对每个音频,识别一次就够了。不要一直陷在循环里;
    • 有时候会录到一些杂七杂八的音频,比如说提示音之类的。不需要强行填表;
    • th是麦克风输入信号的判定阈值,超过th,认为是信号。我用的是2k;
    • 循环的次数:5 & 30要根据采样频率做些调整;
    • filename用当前时间组合的,为了避免重复(查看之前博文)。
    监听麦克风并录音

    参考这里

    连续语音分割

    我用的google出的webrtcvad里面的方法。

    孤立词语音识别

    我用的是HMM-GMM的模型进行识别。
    识别出的存成一个list:‘results’,用逗号分割。
    results = [‘1’, ‘7’, ‘3’, ‘5’, ‘7’, ‘2’, … , ‘9’]

    写入到Excel文件*.xlsx
    • 输入是一个list,包含:一些乱码 + 起始标识符 ‘s’ + 表头 + 数据 + 结束标识符’t’ + 一些乱码。其中header长度固定,data长度不定,但最长为100*4(4个数字一组填到一个cell里);
    • 首先将乱码去除,只截取入list中‘s’和‘t’之间的部分;
    • 然后将表头’header’和数据’data’分别截取出来;
    • 生成的excel有固定的格式,其中data部分最长为100。不足100的部分在excel中由‘0000’补足;
    import openpyxl
    
    def write_excel_xlsx(path, sheet_name, value):
    #输入数据很长,但我设置了flag,认为有用的只有‘s’和‘t’之间的部分
        start_index = 0
        end_index = 0
        for i in range(len(value)):
            cur = value[i]
            if(cur is 's'):
                start_index = i + 1
            if(cur is 't'):
                end_index = i
        value = value[start_index: end_index]
      
        workbook = openpyxl.Workbook()
        sheet = workbook.active
        sheet.title = sheet_name
        #写入固有值,和value无关的,类目名称之类的
        content = ['1xx','2xx', ...] 
        for i in range(10):
            sheet.cell(1, i + 1, content[i])
        #先把data不足400的部分补0
        #L是输入的真实数据长度
        data = ['0'] * 400
        data[0: L] = data_0
        #再把长为400的data分为100组
        group_data = []
        index = 0
        group = ''
        a = len(data)
        for i in range(401):
        #这个写的奇奇怪怪,凑合用,有空再改改b
            if (index is 4):
                group_data.append(group)
                group = ''
                index = 0
            if(i < 400):
                cur = data[i]
                group = group + cur
                index = index + 1
        index= 0
        #最后把分好组的data填入excel
        for i in range(10):
            for j in range(0, 10):
                sheet.cell(row=i+6, column=j+1, value=str(group_data[index]))
                index = index + 1
        workbook.save(path)
        print("create a *.xlsx file")
    
    展开全文
  • HMM-GMM——前向算法

    千次阅读 2018-07-06 09:34:03
    HMM概序(533)1、五个基本要素 HMM是个五元组λ=( S, O, π ,A,B) S:状态值集合,O:观察值集合,π:初始化概率,A:状态转移概率矩阵,B:给定状态下,观察值概率矩阵2、HMM的三个假设1、有限历史性假设,...

    HMM概序

    (533

    1、五个基本要素
        HMM
    是个五元组λ=( S, O, π ,A,B)

        S:状态值集合,O:观察值集合,π:初始化概率,A:状态转移概率矩阵,B:给定状态下,观察值概率矩阵
    2
    、HMM的三个假设
    1
    、有限历史性假设,p(si|si-1,si-2,...,s1)= p(si|si-1)
    2
    、齐次性假设,(状态与具体时间无关),P(si+1|si)=p(sj+1,sj)
    3
    、输出独立性假设,输出仅与当前状态有关,P(o1,...ot|s1,...st) = P(ot|st)

    3
    、HMM解决的三个问题
    1
    :识别问题,已知模型参数 λ= (A, B, π),计算某个观测序列发生的概率,即求P(O|λ)用前向算法或者后向算法求解此类问题。

    2:译码问题,给出观测序列O和模型μ,怎样选择一个状态序列S(s1,s2,...st+1),能最好的解释观测序列,此问题采用了维特比算法

    3:训练问题,如何调整模型参数 λ=(π, A, B), 使得P(O|λ)较大?此问题面向不同的语料库有不同的方式:

        a.对于观测序列和状态序列都有的立项预料库,直接用较大似然估计即可获得参数λ
        b.
    对于只知道观测序列的,应用EM算法Baum-Welch鲍姆-韦尔奇算法)的实现前向后向算法求解。

     

    前向算法

    先看一个通过观察海藻湿度推测天气的实例。

    假设连续观察3天的海藻湿度为(Dry,Damp,Soggy),求出该观察序列的概率。天气只有三类(Sunny,Cloudy,Rainy),而且海藻湿度和天气有一定的关系。

    已知:

    1.隐藏的状态:Sunny,Cloudy, Rainy;海藻湿度有四类{Dry,Dryish,Damp, Soggy }

    2.观察状态序列:{Dry, Damp, Soggy };

    3.初始状态序列:Sunny(0.63),Cloudy(0.17),Rainy(0.20);

    4.状态转移矩阵:

     

    Sunny

    Cloudy

    Rainy

    Sunny

    0.5

    0.375

    0.125

    Cloudy

    0.25

    0.125

    0.625

    Rainy

    0.25

    0.375

    0.375

    Cloudy(昨天)->Sunny(今天)的概率是0.25;

    Sunny(昨天)->Rainy(今天)的概率是0.125.

     

    5.混淆矩阵(海藻湿度与天气的相关性):

     

    Dry

    Dryish

    Damp

    Soggy

    Sunny

    0.6

    0.2

    0.15

    0.05

    Cloudy

    0.25

    0.25

    0.25

    0.25

    Rainy

    0.05

    0.10

    0.35

    0.50

    观察到海藻湿度Dry,则当天Sunny的概率是0.6;Cloudy的概率是0.25;而当天Rainy的概率是0.05.

    Howto calculate the probability of this observation list?

    直接计算法

    问题:已知HMM的参数 λ,和观测序列O = {o1, o2,...,oT},求P(O|λ)

    思路:

    1,列举所有可能的长度为T的状态序列I = {i1, i2,..., iT};

    2,求各个状态序列I与观测序列 的联合概率P(O,I|λ);

    3,所有可能的状态序列求和∑_I P(O,I|λ)得到P(O|λ)。

         即统计P(observation|Sunny,Sunny, Sunny)+P(observation| Sunny, Sunny, Cloudy)+ P(observation| Sunny,Sunny,Rainy)+ P(observation| Sunny, Cloudy, Sunny) + P(observation| Sunny,Cloudy,Cloudy) + P(observation| Sunny, Cloudy, Rainy) + …总共的可能性有3^3种。

    步骤:

         1,最终目标是求O和I同时出现的联合概率,即:

                        P(O,I|λ)= P(O|I,λ)P(I|λ)

       那就需要求出P(O|I, λ) 和 P(I|λ)。

    2,求P(I|λ) ,即状态序列I = {i1,i2,..., iT} 的概率:

             P(I|λ) = P(i1,i2, ..., iT |λ)

                     =P(i1 |λ)P(i2,i3, ..., iT |λ)

                     =P(i1 |λ)P(i2 |i1, λ)P(i3, i4, ..., iT |λ)

                     =......

                     =P(i1 |λ)P(i2 |i1, λ)P(i3 | i2, λ)...P(iT |iT-1, λ)

     而上面的P(i1|λ) 是初始为状态i1的概率,P(i2| i1,λ) 是从状态i1转移到i2的概率,其他同理,于是分别使用初始概率分布π 和状态转移矩阵A,就得到结果:

                                        

    PS:上面的ai1i2代表A的第i1行第i2列。

     

    3,P(O|I, λ),即对固定的状态序列I,观测序列O的概率是:

                                   

    4,代入第一步求出P(O,I|λ)

                                  

    5,对所有可能的状态序列I求和得到观测序列O的概率P(O|λ):

                                 

    时间复杂度:

    每个时刻有n个状态,一共有t个时刻,而根据上面的第5步可以知道每个时刻需要乘2T-1次,所以时间复杂度是:O((2T-1)nT)

     

    前向算法

    实际由于马尔科夫模型,我们得知其实第二天的状况只取决于第一天,第三天的天气已经与第一天的天气没有关系了。

    我们可以先求P(Day1-Sunny),P(Day1-Cloudy),P(Day1-Rainy),Day1的海藻湿度是Dry.

    P(Day1-Sunny)= 0.63*0.6;

    P(Day1-Cloudy)=0.17*0.25;

    P(Day1-Rain)=0.20*0.05;

    继续求P(Day2-Sunny),P(Day2-Cloudy),P(Day2-Rainy), Day2的海藻湿度是Damp.

    P(Day2-Suny)=(P(Day1-Sunny)*0.5 + P(Day1-Cloudy)*0.25 +P(Day1-Rainy)*0.25)* 0.15

    P(Day2-Cloudy) = (P(Day1-Sunny)*0.375+P(Day1-Cloudy)*0.125 + P(Day1-Rainy)*0.625) * 0.25

    P(Day2-Rainy)=(P(Day1-Sunny)*0.125+ P(Day1-Cloudy)*0.625 + P(Day1-Rainy)*0.375)* 0.35

    同理继续求第三日的各天气概率,Day3的海藻湿度是Soggy.

    P(Day3-Suny)=(P(Day2-Sunny)*0.5 + P(Day1-Cloudy)*0.25 +P(Day1-Rainy)*0.25)* 0.05

    P(Day3-Cloudy) = (P(Day2-Sunny)*0.375+P(Day1-Cloudy)*0.125 + P(Day1-Rainy)*0.625) * 0.25

    P(Day3-Rainy)=(P(Day2-Sunny)*0.125+ P(Day1-Cloudy)*0.625 + P(Day1-Rainy)*0.375)* 0.50

    推出:

    P(observationlist) =P(Day3-Sunny)+P(Day3-Cloudy)+P(Day3-Rainy) =0.030319

     

    公式总结:

        step1 初始化:

                                   α1(i) = πi*bi(O1),1≤i≤N

        step2 归纳计算:

                                   

        step3 终结:

                                      P(O|μ)=

     

     

    时间复杂度

        计算某时刻的某个状态的前向变量需要看前一时刻的N个状态,此时时间复杂度为O(N),每个时刻有N个状态,此时时间复杂度为N*O(N)=O(N2),又有T个时刻,所以时间复杂度为T*O(N2)=O(N2T)。

    程序例证1

       

       前向算法计算P(O|M)

       step1

                 α1(1) =π1*b1(red)=0.2*0.5=0.1       

               α1(2)=π2*b2(red)==0.4*0.4=0.16       

               α1(3)=π3*b3(red)==0.4*0.7=0.21

        step2

                 α2(1)=α1(1)*a11*b1(white)+ α1(2)*a21*b1(white) + α1(3)*a31*b1(white)

           ...

       step3:

                 P(O|M) = α3(1)+α3(2)+α3(3)

     

    例证2

    假设有3个盒子,编号为1,2,3,每个盒子都装有红白两种颜色的小球,数目如下:

     

    盒子号

    1

    2

    3

    红球数

    5

    4

    7

    白球数

    5

    6

    3

    然后按照下面的方法抽取小球,来得到球颜色的观测序列:

    1,按照 π=(0.2, 0.4, 0.4) 的概率选择1个盒子,从盒子随机抽出

    1个球,记录颜色后放回盒子;

    2,按照下图A选择新的盒子,按照下图B抽取球,重复上述过程;

    PS

    A的第i行是选择到第i号盒子,第j列是转移到j号盒子,如:第一行第二列的0.2代表:上一次选择1号盒子后这次选择2号盒子的概率是0.2。

    B的第i行是选择到第i号盒子,第j列是抽取到j号球,如:第二行第一列的0.4代表:选择了2号盒子后抽取红球的概率是0.4。

    求:得到观测序列“红白红”的概率是多少?

    解:

    1,明确已知:HMM模型的参数已经如上图所示了,那我们就需要再明确两件事:HMM中那“看不见的状态”和“可见的观测”分别是什么。

    可见的观测”根据题目可知是:y =“红白红”, “看不见的状态”就是这三次分别选择了什么盒子,且一共有3个状态:选中1号盒子、选中2号盒子、选中3号盒子。

    2,根据前向算法,第一步计算 αi(1),这很简单:

    αi=1 (t=1) 即时刻1时位于状态“选中1号盒子”的前向概率,所以:α1(1) =“选中1号盒子”*“选中红球” = π0* B10 =0.2*0.5 = 0.1

    同理:α2(1) =0.4*0.4 = 0.16,α3(1)= 0.4*0.7 = 0.28。

    3,计算 αi(2)

    根据公式:

    α1(2)= (∑_j α1(2)αj1) b1y2

    =(0.1*0.5 + 0.16*0.3 + 0.28*0.2) * 0.5

    =0.077

    α2(2)= 0.1104

    α3(2)= 0.0606

    4,同αi(2),计算αi(3):

    α1(3)=0.04187

    α2(3)=0.03551

    α3(3)=0.05284

    5,最终

    P(O|λ)= ∑_i αi(3)

    =0.04187 + 0.03551 + 0.05284

    =0.13022

     

    参考:

        https://blog.csdn.net/jeiwt/article/details/8076019

        https://www.2cto.com/kf/201609/544539.html

     

    展开全文
  • 在这个项目中,我们要处理使用EM算法训练GMM-HMM的孤立单词数据。 测试阶段也考虑使用维特比算法。 结果表明,通过Matlab 编程获得的性能与HTK 的性能相似。 在运行这些程序之前,请先准备好训练和测试数据。 ...
  • ASR HMM-GMM公式推导

    2018-09-30 11:59:26
    #1 语音识别技术原理 (未整理-&amp;gt;可参考链接:语音识别的技术原理是什么?) #2 语音识别特征提取方法:...未整理-可参考链接:几种不同程序语言的HMM版本 #4 推荐论文 未整理-可参考链接:深度学习入门...
  • 而且掌握HMM-GMM结构,对于深入理解语音识别过程是由有一定好处的。 但对于外行(比如像我这种从机械行业转行到语音识别领域的人)或者刚接触语音识别的人来说,要弄懂HMM-GMM结构还是要花不少时间的,因为语音识别...
  • 返回特定参数的模型的列表 self.models = [] for k in range(self.category): model = hmm.GMMHMM(n_components=self.n_comp, n_mix = self.n_mix, covariance_type=self.cov_type, n_iter=self.n_...
  • HMM-GMM语音识别

    2020-06-03 14:52:30
    参考知乎大佬的一篇文章 https://zhuanlan.zhihu.com/p/63753017
  • 用WFST来表征ASR中的模型(HCLG),可以更方便的对这些模型进行融合和优化,于是可以作为一个简单而灵活的ASR的解码器(simple and flexible ASR decoder design)。 利用WFTS,我们可以吧ctc label,lexicon(字典)...
  • 在理论上,LP技术得到进一步发展,动态时间归正技术(DTW)基本成熟,特别是提出了矢量量化(VQ)和隐马尔可夫模型(HMM)理论。在实践上,实现了基于线性预测倒谱和DTW技术的特定人孤立语音识别系统。80年代,语音...
  • Kaldi GMM-HMM中GMM成分更新过程
  • 原文: ... ##train_mono.sh 单音素训练脚本: //初始化,[topo feats] -&gt; [0.mdl tree] gmm-init-mono //生成训练图,[0.mdl text l.fst] -&gt; [train.fst] compile-...
  • 都知道语音识别有GMM-HMM模型,也分别了解了什么是: GMM(混合高斯模型)https://blog.csdn.net/qq_37385726/article/details/89198387 MMC(马尔可夫链)...
  • HMM -GMM 理清不错

    2020-04-26 15:46:02
    https://blog.csdn.net/abcjennifer/article/details/27346787
  • GMM-HMM kaldi 详解

    千次阅读 2019-04-09 09:00:34
    而且掌握HMM-GMM结构,对于深入理解语音识别过程是由有一定好处的。 但对于外行(比如像我这种从机械行业转行到语音识别领域的人)或者刚接触语音识别的人来说,要弄懂HMM-GMM结构还是要花不少时间的,因为语音识别...
  • 当然在gmm-hmm中一般都是mfcc特征。mfcc特征的具体流程,这里贴一张图,大家可以参考。htk或者kaldi里都有提特征的脚本,也有源码,相信这个应该都不算难事了。 这个过程也比较清楚,这里就不多说了。 2...
  • 浅谈MFCC/HMM/GMM/EM/LM

    2021-02-06 19:30:15
    GMMHMM虽然都是MM,但这两个MM其实没啥关系。GMM(Gaussian Mixture Model)混合高斯模型,就是一堆不同分布的高斯模型按一定比例组合在一起,用来对特征进行分类;HMM(Hidden Markov Model)是隐马尔可夫模型,用来...
  • GMM-HMM 详解

    千次阅读 2019-03-20 20:50:53
    本文简明讲述GMM-HMM在语音识别上的原理,建模和测试过程。这篇blog只回答三个问题: 1.什么是Hidden Markov Model? HMM要解决的三个问题: 1) Likelihood 2) Decoding 3) Training 2. GMM是神马?怎样用GMM求...
  • 目录 train_mono.sh train_deltas.sh train_lda_mllt.sh train_sat.sh train_mono.sh 单音素训练脚本: //初始化,[topo feats] -> [0.mdl tree] gmm-init-...
  • HMM 隐马尔可夫模型 python 代码, 源码实现部分,包括训练测试以及相关调用 。 调用主要为自然语言处理方面实体标注样例。
  • 语音识别:HMM+GMM

    千次阅读 2018-09-04 22:08:47
    隐马尔可夫模型(Hidden Markov Model,HMM)是统计模型,它用来描述一个含有隐含未知参数的马尔可夫过程。其难点是从可观察的参数中确定该过程的隐含参数。然后利用这些参数来作进一步的分析,例如模式识别。 是在...
  • gmm-hmm就是把我们的特征用混合高斯模型区模拟,然后把均值和方差输入到hmm的模型里。 此外,dnn-hmm的模型图: 最后是dbn-hmm:   希望我寒假过来可以很好的解释这三个图,如果有人可以解释这三...
  • kaldi:训练GMM-HMM 训练三音子模型 第一步: steps/train_deltas.sh Usage: steps/train_deltas.sh <num-leaves> <tot-gauss> <data-dir> <lang-dir> <alignment-dir> <exp-dir> e.g.: steps/train_deltas.sh 2000 ...
  • 基于GMM-HMM语音识别系统的算法推导(全)

    千次阅读 热门讨论 2019-04-21 14:55:21
    最近研究完CTC,转而研究GMM-HMM; 参考文献:《语音识别实践》;《数学之美》;清华大学开源资料;爱丁堡大学语音识别课件;以及一些高校本硕博学位论文; 本文将会刷新你对GMM-HMM的认识,以及对EM算法加深...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,388
精华内容 1,355
关键字:

hmm-gmm