Synteza mowy III: Finał

20.07.2010 - Krzysztof Kercz
TrudnośćTrudność

Gloska.py

Pokaż/ukryj kod źródłowy

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
#!/usr/bin/python
# -*- coding: utf-8 -*-
 
import wav
 
dzSet,szDic = set(),{}
 
for line in open('data/Gloska.txt'):
    if line.startswith('#stopien_zblizenia'):
        part = 0
        continue
    elif line.startswith('#dzwieczne'):
        part = 1
        continue
    
    if part == 0:
        val, keys = line.strip().decode('utf-8').split(':')
        for k in keys.split(','):
            szDic[k] = val
    elif part == 1:
        for gl in line.strip().decode('utf-8').split(','):
            dzSet.add(gl)
            
dz_bdz = map(lambda line: line.strip().decode('utf-8').split(),
            open('data/dz_bdz.txt'))    
dz_bdz = dict(dz_bdz + map(lambda (x, y): (y,x), dz_bdz))
 
 
class Gloska:
    
    def __init__(self, name):
        self.name = name
        self.dzwieczna = name in dzSet
        self.stopien_zblizenia = szDic[name] 
        self.typ = (u'samogłoska' 
            if self.stopien_zblizenia == u'otwarta' 
            else u'spółgłoska')
        self.nosowa = (name[-1] == u'n' 
            or self.stopien_zblizenia == u'nosowa')
        self.akcent = False
        self.bytes = None
        
    def get_bytes(self):
        self.bytes = (wav.getA(self.name) if self.akcent 
            else wav.get(self.name))
        return self.bytes
    
    def isVowel(self):
        return self.typ == u'samogłoska'
    
    def udzwiecznij(self):
        if self.dzwieczna:
            raise Exception('Gloska już jest dźwięczna!')
        if self.name in dz_bdz.keys():
            self.name = dz_bdz[self.name]    
        self.dzwieczna = True
    def ubezdzwiecznij(self):
        if not self.dzwieczna:
            raise Exception('Głoska już jest bezdźwięczna!')
        if self.name in dz_bdz.keys():
            self.name = dz_bdz[self.name]    
        self.dzwieczna = False
    def zmien_dzwiecznosc(self):
        if self.dzwieczna:
            self.ubezdzwiecznij()
        else:
            self.udzwiecznij()
        
    def nazalizuj(self):
        if not self.typ == u'samogłoska':
            raise Exception('Unosowić można jedynie samogłoskę!')
        if self.nosowa is True:
            raise Exception('Głoska jest już nosowa!')
        self.name += u'n'
        self.nosowa = True
        
    def zaakcentuj(self):
        self.akcent = True
    
    def __repr__(self):
        return u'<"%s"(%s)>' % (self.name, u'dz' 
        if self.dzwieczna else u'bdz')
    
    def __str__(self):
        return u'< %s>' % self.name    

O tej klasie pisaliśmy już w pierwszej części artykułu, więc większość jej elementów będzie znajoma. Służy ona do reprezentacji pojedynczej głoski. Jej metody służą do zmiany parametrów głoski i są wykorzystywane przy fonemizacji.

Całkiem nowa jest metoda Gloska.get_bytes() (linie 41-44). Korzystamy w niej z modułu wav, o którym opowiemy później i który służy do operowania na plikach dźwiękowych i naszych nagraniach głosek. Metoda pobiera nagranie (w postaci listy bajtów) głoski reprezentowanej przez obiekt klasy. W zależności od tego, czy głoska jest zaakcentowana, czy nie (mówi o tym parametr Gloska.akcent), pobierzemy nagranie głoski normalnej (wav.get()) lub - zaakcentowanej(wav.getA()).

Dużo więcej o tym module powiedzieć nie można. Mimo że dość prosty - wprowadza wiele porządku do naszego programu. Moglibyśmy wszak wyobrazić sobie, że nie bawimy się w żadne obiekty, tylko reprezentujemy głoski po prostu jako stringi i dalej coś na nich robimy. Lepiej nie myśleć, jakim chaosem by się to skończyło...

5
Twoja ocena: Brak Ocena: 5 (1 ocena)

Copyright © 2008-2010 Wrocławski Portal Informatyczny

design: rafalpolito.com