mirror of
https://github.com/cmusphinx/sphinxtrain.git
synced 2026-06-16 13:14:30 +00:00
131 lines
4.5 KiB
Python
131 lines
4.5 KiB
Python
#!/usr/bin/env python
|
|
|
|
from cmusphinx import hmm, s3model, s2mfc
|
|
import unittest
|
|
from cmusphinx.feat import _1s_c_d_dd
|
|
import os
|
|
from math import log
|
|
|
|
|
|
class TestHMM(unittest.TestCase):
|
|
def setUp(self):
|
|
thisdir = os.path.dirname(__file__)
|
|
self.testdir = os.path.join(thisdir, 'test', 'tidigits')
|
|
self.acmod = s3model.S3Model(self.testdir)
|
|
|
|
def test_create(self):
|
|
h1 = hmm.HMM(self.acmod.mdef.pid2sseq(352),
|
|
self.acmod.tmat[self.acmod.mdef.pid2tmat(352)])
|
|
|
|
def test_forward_backward(self):
|
|
pid = self.acmod.mdef.phone_id('SIL')
|
|
h1 = hmm.HMM(self.acmod.mdef.pid2sseq(pid),
|
|
self.acmod.tmat[self.acmod.mdef.pid2tmat(pid)])
|
|
mfcc = s2mfc.open(os.path.join(self.testdir, 'man.ah.111a.mfc')).getall()
|
|
mfcc -= mfcc.mean(0)
|
|
feat = _1s_c_d_dd.compute(mfcc)
|
|
alpha = None
|
|
self.alpha = []
|
|
for f in feat[0:50]:
|
|
senscr = self.acmod.senone_compute(h1.iter_senones(), f)
|
|
alpha = hmm.forward_evaluate(h1, senscr, alpha)
|
|
self.alpha.append(alpha)
|
|
beta = None
|
|
self.beta = []
|
|
for f in feat[50:0:-1]: # Note that this is time-shifted by
|
|
# one from the forward pass above
|
|
senscr = self.acmod.senone_compute(h1.iter_senones(), f)
|
|
beta = hmm.backward_evaluate(h1, senscr, beta)
|
|
self.beta.append(beta)
|
|
self.beta.reverse()
|
|
ll = 0
|
|
for a, b in zip(self.alpha, self.beta):
|
|
newll = sum(a*b)
|
|
if ll != 0:
|
|
self.assertTrue(abs(log(ll) - log(newll)) < 0.1)
|
|
ll = newll
|
|
|
|
|
|
class TestPhoneHMM(unittest.TestCase):
|
|
def setUp(self):
|
|
thisdir = os.path.dirname(__file__)
|
|
self.testdir = os.path.join(thisdir, 'test', 'tidigits')
|
|
self.acmod = s3model.S3Model(self.testdir)
|
|
self.factory = hmm.PhoneHMMFactory(self.acmod)
|
|
|
|
def test_create(self):
|
|
pid = self.acmod.mdef.phone_id('OW_four', 'F_four', 'R_four')
|
|
h1 = hmm.HMM(self.acmod.mdef.pid2sseq(pid),
|
|
self.acmod.tmat[self.acmod.mdef.pid2tmat(pid)])
|
|
h2 = self.factory.create('OW_four', 'F_four', 'R_four')
|
|
self.assertEqual(h1[0], h2[0])
|
|
|
|
|
|
class TestHMMGraph(unittest.TestCase):
|
|
def setUp(self):
|
|
thisdir = os.path.dirname(__file__)
|
|
self.testdir = os.path.join(thisdir, 'test', 'tidigits')
|
|
self.acmod = s3model.S3Model(self.testdir)
|
|
self.factory = hmm.PhoneHMMFactory(self.acmod)
|
|
|
|
def test_create(self):
|
|
h1 = self.factory.create('F_four', 'SIL', 'OW_four')
|
|
h2 = self.factory.create('OW_four', 'F_four', 'R_four')
|
|
h3 = self.factory.create('R_four', 'OW_four', 'SIL')
|
|
hg = hmm.HMMGraph(h1, h2, h3)
|
|
self.assertEqual(hg[0], h1[0])
|
|
self.assertEqual(hg[4], h2[0])
|
|
self.assertEqual(hg[8], h3[0])
|
|
|
|
def test_forward_backward(self):
|
|
mfcc = s2mfc.open(os.path.join(self.testdir, 'man.ah.111a.mfc')).getall()
|
|
mfcc -= mfcc.mean(0)
|
|
feat = _1s_c_d_dd.compute(mfcc)
|
|
hg = hmm.HMMGraph(self.factory.create('SIL'),
|
|
self.factory.create('SIL'))
|
|
alpha = None
|
|
self.alpha = []
|
|
for f in feat[0:15]:
|
|
senscr = self.acmod.senone_compute(hg.iter_senones(), f)
|
|
alpha = hmm.forward_evaluate(hg, senscr, alpha)
|
|
self.alpha.append(alpha)
|
|
beta = None
|
|
self.beta = []
|
|
for f in feat[15:0:-1]: # Note that this is time-shifted by
|
|
# one from the forward pass above
|
|
senscr = self.acmod.senone_compute(hg.iter_senones(), f)
|
|
beta = hmm.backward_evaluate(hg, senscr, beta)
|
|
self.beta.append(beta)
|
|
self.beta.reverse()
|
|
ll = 0
|
|
for a,b in zip(self.alpha, self.beta):
|
|
newll = sum(a*b)
|
|
if ll != 0:
|
|
self.assertTrue(abs(log(ll) - log(newll)) < 0.1)
|
|
ll = newll
|
|
|
|
|
|
def read_dict(dictfile):
|
|
fh = open(dictfile)
|
|
out = {}
|
|
for spam in fh:
|
|
eggs = spam.rstrip().split()
|
|
word = eggs[0]
|
|
phones = eggs[1:]
|
|
out[word] = phones
|
|
return out
|
|
|
|
|
|
class TestSentenceHMM(unittest.TestCase):
|
|
def setUp(self):
|
|
thisdir = os.path.dirname(__file__)
|
|
self.testdir = os.path.join(thisdir, 'test', 'tidigits')
|
|
acmod = s3model.new(self.testdir)
|
|
dictionary = read_dict(os.path.join(self.testdir, 'dictionary'))
|
|
self.factory = hmm.SentenceHMMFactory(acmod, dictionary)
|
|
|
|
|
|
if __name__ == '__main__':
|
|
unittest.main()
|
|
|