Synteza mowy I: Fonemizacja

15.11.2009 - Krzysztof Kercz
TrudnośćTrudność

Mając niezbędne przygotowania za sobą, zastanówmy się - jak zamieniać słowa stworzone z liter w ciągi głosek? Jak zostało wspomniane wyżej, pierwszym, najoczywistszym pomysłem jest znalezienie odpowiedniości litera-głoska, litery-głoska bądź litera-głoski (bo przecież nie zawsze jedna litera odpowiada jednej głosce). Rozwijając ten pomysł, napisalibyśmy system regułowy, z instrukcjami typu ciąg liter -> ciąg głosek:

a -> a
ą -> on
b -> b
c -> c
ci -> ci,i
ć -> ci
d -> d
e -> e
ę -> en
(...)

...i tak dalej. Łatwo jednak przekonać się, że takie proste przypisania nie wystarczą, gdyż język zawiera wiele mechanizmów ułatwiających wymowę (a nam utrudniających zadanie), inaczej mówiąc: te same litery możemy w różnych sytuacjach czytać inaczej - zauważyliśmy to już wcześniej. Usystematyzujmy naszą wiedzę o wszystkich takich zjawiskach.

I Asynchroniczna wymowa samogłosek nosowych

Asynchorniczną wymowę samogłosek nosowych schematycznie zapiszemy tak:

ą\ę + spółgłoska zwarta => a\e + spółgłoska nosowa ("n" lub "m") + spółgłoska zwarta

Spójrzmy na przykłady:

bęben -> /b e m b e n/
dętka -> /d e n t k a/
dąb -> /d o m b/
wątły -> /w o n t ll y/

Wbrew pozorom tak właśnie te słowa powiemy (a gdybyś, Czytelniku, miał wątpliwości, spróbuj je sobie parę razy na głos dość szybko powtórzyć) i jest to podyktowane odwiecznym lenistwem przyrody. Przypomnijmy sobie to, czego przed chwilą nauczyliśmy się o głoskach i zobaczmy: /m/ i /b/ (w słowie /b e m b e n/) - obie są dwuwargowe, /n/ i /t/ (/d e n t k a/) - obie są przedniojęzykowo-zębowe! Niesamowity zbieg okoliczności, prawda? Tak, bo to wcale nie przypadek. Łatwiej nam w wymowie przejść między dwiema głoskami artykułowanymi w tym samym miejscu, niż między dwiema całkowicie różnymi - dlatego właśnie zamiast powiedzieć soczyste /en/ i zaraz potem z trudem przejść do /t/, powiemy po prostu /e/, następnie - by nie utracić nosowości - /n/ i spokojnie - /t/. Ale jest jeszcze jeden powód tego, że wymowa samogłosek nosowych staje się tak "niechlujna" (fachowo nazwiemy ją po prostu "asynchroniczną") akurat przed głoskami zwartymi, a przed żadnymi innymi - nie. Zauważmy, że zarówno wymowa /m/ i /n/ stworzy zwarcie; zwarcie to posłuży nam do wypowiedzenia kolejnej głoski - ot, i cała tajemnica.

Teraz pytanie - jak ująć to w naszym programie? Można albo napisać sobie funkcję, która, korzystając z wiedzy o głoskach, zmodyfikuje wymowę każdego słowa, lub po prostu dodać parę reguł (w końcu tak dużo tych spółgłosek zwarty-wybuchowych i zwarto-szczelinowych nie ma) wyglądających tak je te:

ęb -> e,m,b
ęp -> e,m,p
ęt -> e,n,t
ęd -> e,n,d
ęc -> e,n,c
(...)

II Synchroniczna wymowa samogłosek nosowych

Synchroniczna wymowa samogłosek nosowych:

a\e + N + szczelinowa => on\en + szczelinowa

Ponownie zacznijmy od przykładów:

wąs -> /w on s/
kęs -> /k en s/
sens -> /s en s/
konfrontacja -> /k on f r o n t a c j a/
tramwaj -> /t r an w a j/

O ile wymowa słów "wąs" i "kęs" jest zgodna z naszymi intuicjami, to kolejne trzy przypadki mogą budzić wątpliwości - co tam się dzieje? Zauważmy, że mamy kolejno: samogłoskę, spółgłoskę nosową (/n/, /m/), spółgłoskę szczelinową(/s/, /f/, /w/). To znów nie przypadek, kolejny raz decyduje ekonomia: zwarcie powstające przy artykulacji /n/ czy /m/ znacząco utrudnia przejście do artykułowania głoski szczelinowej, zatem - myśli sobie część naszego mózgu odpowiedzialna za wymowę - nie twórzmy zwarcia! Wrzucamy spółgłoskę nosową do samogłoski, która sama staje się przez to unosowiona.

Ponownie mamy dwie możliwości: możemy tę zasadę zaszyć w kodzie, lub wrzucić na sztywno do pliku z regułami.

III denazalizacja

Tutaj sytuacja jest jasna i tyczy się form czasowników zakończonych na "-ęła", "-ęły" lub "-ął", które artykułujemy /e ll a/, /e ll y/ i /o ll/. Również nosowość samogłoski "-ę" na końcu wyrazów znika i wymawiamy ją po prostu /e/.
Jako że mówimy tutaj o sufiksach, warto do naszego pliku wprowadzić notację zapożyczoną z wyrażeń regularnych a pozwalającą na oznaczanie początku (^) i końca ($) wyrazów. Dzięki temu będziemy mogli zapisać:

ęł -> e,ll,a
ął -> o,ll
ę$ -> e

IV propagacja miękkości

Spójrzmy:

romantyzmie -> /r o m a n t y zi m j e/
windzie -> /w i ni dzi e/
rozdziawił -> /r o zi dzi a w i ll/

Żeby zrozumieć dlaczego tak się dzieje, należy wiedzieć, że za miękkość spółgłosek odpowiada środkowa część języka, która zbliża się do podniebienia twardego. Obie spółgłoski wymawiamy zmiękczone z lewnistwa - język ma do przebycia krótszą drogę.

Znów jawią się dwie możliwości rozwiązania tej kwesti. Zdecydowanie łatwiejsze wydaje się znowu dodanie sztywnych reguł zamiany, ale oczywiście można próbować to zaprogramować - musielibyśmy w takim przypadku dodać do naszych głosek informacje o miękkości i funkcje służące do zmiękczania.

V upodobnienia

Upodobnienia dotyczą dźwięczności spółgłosek i znów łatwo wyjaśnić skąd się biorą - łatwiej pozostawić wiązadła głosowe w jednej pozycji niż cały czas zsuswać je lub rozsuwać. Upodobnienia dzielimy na trzy rodzaje:

  1. upobnienie postępowe - dotyczy sytuacji, gdy głoska dźwięczna staje się bezdźwięczna pod wpływem głoski poprzedzającej. Dotyczy jedynie spółgłosek /w/ i /rz/, np: trzask -> /t sz a s k/, twój -> /t f u j/;
  2. upodobnienie wsteczne - w każdej innej sytuacji, gdy występują obok siebie spółgłoski o różnej dźwięczności, ta wcześniejsza dopasowuje się do następnej. Warto zauważyć, że dotyczy to jednak tylko spółgłosek nie sonornych (/n/, /m/, /l/, /ll/, /r/, a zatem kła -> /k ll a/, nie - /g ll a/, mimo że nominalnie "ll" jest dźwięczne), czyli tych posiadających swoje wyraźne dźwięczne lub bezdźwięczne odpowiedniki. Przykłady: prośba -> /proźba/, różdżka -> /r u sz cz k a/;
  3. upodobnienia międzywyrazowe - frazy wypowiadamy na jednym oddechu, więc między dwoma wyrazami mogą zajść takie same zjawiska jak w ich wnętrzu, przykład: grot żelazny -> /g r o d rz e l a z n y/.

Tutaj możliwości jest już zbyt wiele, by objąć je regułami, nie będziemy więc tego robić, zwłaszcza że - mając klasę Gloska z odpowiednimi polami oraz metodami - łatwo napiszemy dwie funkcje:

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
def backward(phones):
        
        ''' przechodzi przez głoski i uskutecznia upodobnienie wsteczne '''
        
        for i in range(len(phones)-1, 0, -1):
                if not (phones[i].isVowel()
                        or phones[i-1].isVowel()
            or phones[i].stopien_zblizenia in
                        [u'półsamogłoskowa',u'drżąca', u'nosowa', u'boczna']) and (
                        phones[i].dzwieczna != phones[i-1].dzwieczna):
                        phones[i-1].zmien_dzwiecznosc()
 
def forward(phones):
        
        ''' przechodzi przez głoski i uskutecznia upodobnienie postępowe '''
        
        for i in range(1, len(phones)):
                if (phones[i].name in [u'w', u'rz', u'r']
                        and phones[i].dzwieczna
                        and not phones[i-1].dzwieczna
                        and phones[i-1].stopien_zblizenia not in
                                    [u'nosowa', u'boczna', u'półsamogłoskowa'] 
                        and not phones[i-1].isVowel()):
                        phones[i].ubezdzwiecznij()
                                
        return phones

Zauważmy, że korzystamy tutaj z funkcji klasy Gloska: zmien_dzwiecznosc() oraz ubezdzwiecznij(). Co prawda jeszcze ich nie napisaliśmy, jest to jednak na tyle proste zadanie, że pozostawimy je jako ćwiczenie dla Czytelnika (w tym właśnie miejscu należy skorzystać z naszego słownika przechowującego pary komplementarnych pod względem dźwięczności głosek - przypomnijmy, że na przykład udźwięcznione /t/ to /d/).

VI inne

Musimy pamiętać jeszcze o paru sprawach:

  1. niesylabotwórcze /i/ powinniśmy zamieniać na /j/ - łatwo to załatwić jedną pętelką (chodzi o to, że powiemy mit -> /m i t/, ale miasto -> /m j a s t o/);
  2. na końcu wyrazów spółgłoska zawsze się ubezdźwięcznia (bard -> /b a r t/, ale bardem -> /b a r d e m/)
  3. pewne grupy spółgłosek ulegają (lub mogą ulegać - w wymowie mniej starannej) uproszczeniom (jabłko -> /j a p k o/, trzcina -> /cz ci i n a/, pięćdziesiąt -> /p i e ni dzi e si o n t, pierwszy -> /p j e r sz y/)
  4. dwa "i" na końcu wymawiamy jak jedno "i" (krwii -> /k r f i/)

5
Twoja ocena: Brak Ocena: 5 (3 ocen)

Copyright © 2008-2010 Wrocławski Portal Informatyczny

design: rafalpolito.com