forked from bootphon/phonemizer
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathtest_mbrola.py
109 lines (95 loc) · 3.22 KB
/
test_mbrola.py
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
100
101
102
103
104
105
106
107
108
109
# Copyright 2015-2021 Mathieu Bernard
#
# This file is part of phonemizer: you can redistribute it and/or
# modify it under the terms of the GNU General Public License as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version.
#
# Phonemizer is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with phonemizer. If not, see <http://www.gnu.org/licenses/>.
"""Test of the espeak-mbrola backend"""
# pylint: disable=missing-docstring
# pylint: disable=redefined-outer-name
import pytest
from phonemizer.backend import EspeakMbrolaBackend
from phonemizer.separator import Separator
@pytest.fixture(scope='session')
def backend():
return EspeakMbrolaBackend('mb-fr1')
@pytest.mark.skipif(
not EspeakMbrolaBackend.is_available() or
not EspeakMbrolaBackend.is_supported_language('mb-fr1'),
reason='mbrola or mb-fr1 voice not installed')
@pytest.mark.parametrize(
'text, expected',
[
# plosives
('pont', 'po~'),
('bon', 'bo~'),
('temps', 'ta~'),
('dans', 'da~'),
('quand', 'ka~'),
('gant', 'ga~'),
# fricatives
('femme', 'fam'),
('vent', 'va~'),
('sans', 'sa~'),
('champ', 'Sa~'),
('gens', 'Za~'),
('ion', 'jo~'),
# nasals
('mont', 'mo~'),
('nom', 'no~'),
('oignon', 'onjo~'),
('ping', 'piN'),
# liquid glides
('long', 'lo~'),
('rond', 'Ro~'),
('coin', 'kwe~'),
('juin', 'Zye~'),
('pierre', 'pjER'),
# vowels
('si', 'si'),
('ses', 'se'),
('seize', 'sEz'),
('patte', 'pat'),
('pâte', 'pat'),
('comme', 'kOm'),
('gros', 'gRo'),
('doux', 'du'),
('du', 'dy'),
('deux', 'd2'),
('neuf', 'n9f'),
('justement', 'Zystma~'),
('vin', 've~'),
('vent', 'va~'),
('bon', 'bo~'),
('brun', 'bR9~')])
def test_sampa_fr(backend, text, expected):
assert expected == backend.phonemize(
[text], strip=True, separator=Separator(phone=''))[0]
@pytest.mark.skipif(
not EspeakMbrolaBackend.is_available() or
not EspeakMbrolaBackend.is_supported_language('mb-fr1'),
reason='mbrola or mb-fr1 voice not installed')
def test_french_sampa(backend):
text = ['bonjour le monde']
sep = Separator(word=None, phone=' ')
expected = ['b o~ Z u R l @ m o~ d ']
out = backend.phonemize(text, separator=sep, strip=False)
assert out == expected
expected = ['b o~ Z u R l @ m o~ d']
out = backend.phonemize(text, separator=sep, strip=True)
assert out == expected
assert backend.phonemize([''], separator=sep, strip=True) == ['']
assert backend.phonemize(['"'], separator=sep, strip=True) == ['']
@pytest.mark.skipif(
not EspeakMbrolaBackend.is_available(),
reason='mbrola not installed')
def test_mbrola_bad_language():
assert not EspeakMbrolaBackend.is_supported_language('foo-bar')