File: alignment_test.py

package info (click to toggle)
pocketsphinx 5.0.4-3
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 51,236 kB
  • sloc: ansic: 54,519; python: 2,438; sh: 566; cpp: 410; perl: 342; yacc: 93; lex: 50; makefile: 30
file content (99 lines) | stat: -rw-r--r-- 3,365 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
#!/usr/bin/python

import os
from pocketsphinx import Decoder
import unittest
import wave

DATADIR = os.path.join(os.path.dirname(__file__), "../../test/data")


class TestAlignment(unittest.TestCase):
    def _run_decode(self, decoder):
        with open(os.path.join(DATADIR, "goforward.raw"), "rb") as fh:
            buf = fh.read()
            decoder.start_utt()
            decoder.process_raw(buf, no_search=False, full_utt=True)
            decoder.end_utt()

    def test_alignment(self):
        decoder = Decoder(lm=None)
        decoder.set_align_text("go forward ten meters")
        self._run_decode(decoder)
        words = []
        for seg in decoder.seg():
            if seg.word not in ("<s>", "</s>", "<sil>", "(NULL)"):
                words.append((seg.word, seg.start_frame, seg.end_frame))
        print(words)
        decoder.set_alignment()
        self._run_decode(decoder)
        for word in decoder.get_alignment():
            print(word.start, word.duration, word.score, word.name)
            for phone in word:
                print("\t", phone.start, phone.duration, phone.score, phone.name)
                for state in phone:
                    print("\t\t", state.start, state.duration, state.score, state.name)

    def test_default_lm(self):
        decoder = Decoder()
        self.assertEqual(decoder.current_search(), "_default")
        decoder.set_align_text("go forward then meters")
        self.assertEqual(decoder.current_search(), "_align")
        self._run_decode(decoder)
        self.assertEqual(decoder.hyp().hypstr, "go forward then meters")
        decoder.activate_search()
        self.assertEqual(decoder.current_search(), "_default")
        self._run_decode(decoder)
        self.assertEqual(decoder.hyp().hypstr, "go forward ten meters")

    def _run_phone_align(self, decoder, buf):
        decoder.start_utt()
        decoder.process_raw(buf, no_search=False, full_utt=True)
        decoder.end_utt()
        decoder.set_alignment()
        decoder.start_utt()
        decoder.process_raw(buf, no_search=False, full_utt=True)
        decoder.end_utt()

    def test_align_forever(self):
        decoder = Decoder(loglevel="INFO", backtrace=True, lm=None)
        decoder.set_align_text("feels like these days go on forever")
        with wave.open(
            os.path.join(DATADIR, "forever", "input_2_16k.wav"), "r"
        ) as infh:
            data = infh.readframes(infh.getnframes())
            self._run_phone_align(decoder, data)
            alignment = decoder.get_alignment()
            phones = [entry.name for entry in alignment.phones()]
            self.assertEqual(
                phones,
                [
                    "F",
                    "IY",
                    "L",
                    "Z",
                    "L",
                    "AY",
                    "K",
                    "DH",
                    "IY",
                    "Z",
                    "D",
                    "EY",
                    "Z",
                    "G",
                    "OW",
                    "AO",
                    "N",
                    "F",
                    "ER",
                    "EH",
                    "V",
                    "ER",
                    "SIL",
                ],
            )


if __name__ == "__main__":
    unittest.main()