diff --git a/epitran/data/map/rus-Cyrl.csv b/epitran/data/map/rus-Cyrl.csv index bac6996..4ecaba3 100644 --- a/epitran/data/map/rus-Cyrl.csv +++ b/epitran/data/map/rus-Cyrl.csv @@ -14,10 +14,12 @@ Orth,Phon л,l м,m н,n +нн,n о,o п,p р,r с,s +сс,s т,t у,u ф,f diff --git a/epitran/data/pre/rus-Cyrl.txt b/epitran/data/pre/rus-Cyrl.txt index 6457da7..b466acf 100644 --- a/epitran/data/pre/rus-Cyrl.txt +++ b/epitran/data/pre/rus-Cyrl.txt @@ -1,3 +1,39 @@ +::voiceless:: = п|т|к|ф|с|ш +% NB doesn't trigger voicing +::voiced:: = б|д|г|з|ж +::hushers:: = [шжц] + +%% Lexical and regular sound changes +% g -> v in <-ogo> <-ego> +г -> в / [ое] _ о# +% lexical exception +сегодня -> сиводня / _ + +% g -> x before +г -> х / _ [кч] +% lexical exception +бог -> бох / _ + +% final de-voicing +б -> п / _ ь?(#|::voiceless::) +д -> т / _ ь?(#|::voiceless::) +г -> к / _ ь?(#|::voiceless::) +в -> ф / _ ь?(#|::voiceless::) +з -> с / _ ь?(#|::voiceless::) +ж -> ш / _ ь?(#|::voiceless::) + +% Voicing in clusters +п -> б / _ ь?(::voiced::) +т -> д / _ ь?(::voiced::) +к -> г / _ ь?(::voiced::) +ф -> в / _ ь?(::voiced::) +с -> з / _ ь?(::voiced::) +ш -> ж / _ ь?(::voiced::) + +% i -> y after sibilants +и -> ы / (::hushers::) _ + +%% j-normalization ьйэ -> ъе / _ ьйа -> ъя / _ @@ -20,4 +56,4 @@ 0 -> й / # _ (е|ё|ю|я) % Palatalization -0 -> ь / (б|в|д|з|к|л|м|п|р|с|т|ф|х) _ (j|е|ё|и|ю|я) +0 -> ь / (б|в|д|з|л|м|н|п|р|с|т|ф) _ (j|е|ё|и|ю|я) diff --git a/epitran/test/test_russian.py b/epitran/test/test_russian.py index 90a21b7..8795982 100644 --- a/epitran/test/test_russian.py +++ b/epitran/test/test_russian.py @@ -20,4 +20,50 @@ def test_gasurdarstva(self): def test_vzglat(self): tr = self.epi.transliterate('взгляд') - self.assertEqual(tr, 'vzɡlʲad') + self.assertEqual(tr, 'vzɡlʲat') + + def test_exceptions(self): + """Lexical exceptions to general phonetic rules.""" + tr = self.epi.transliterate('сегодня') + self.assertEqual(tr, 'sʲivodnʲa') + tr = self.epi.transliterate('бог') + self.assertEqual(tr, 'box') + + def test_g_softening(self): + """The letter г is pronounced as /v/ or /x/ in certain regular contexts.""" + pairs = [ + ('легко', 'lʲexko'), + ("мягкий", 'mʲaxkij'), + ('легчать', 'lʲext͡ɕʲatʲ'), + ("чего", 't͡ɕʲevo'), + ("кого", 'kovo') + ] + for orth, phon in pairs: + tr = self.epi.transliterate(orth) + self.assertEqual(tr, phon) + + def test_voicing_assimilation(self): + pairs = [ + ('все', 'fsʲe'), + ('встретить', 'fstrʲetʲitʲ'), + ("рассказ", 'raskas'), + ("сделать", 'zdʲelatʲ'), + ("просьба", 'prozʲba'), + ("водка", 'votka'), + ] + for orth, phon in pairs: + tr = self.epi.transliterate(orth) + self.assertEqual(tr, phon) + + def test_hushers(self): + pairs = [ + ('жить', 'ʒɨtʲ'), + ('шить', 'ʂɨtʲ'), + ("цифра", 't͡sɨfra'), + ] + for orth, phon in pairs: + tr = self.epi.transliterate(orth) + self.assertEqual(tr, phon) + +if __name__ == '__main__': + unittest.main() \ No newline at end of file