forked from Vocab-Apps/anki-hyper-tts
-
Notifications
You must be signed in to change notification settings - Fork 0
/
service.py
97 lines (76 loc) · 3.15 KB
/
service.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
import sys
import abc
from posixpath import dirname
import typing
if hasattr(sys, '_pytest_mode'):
import services.voicelist
else:
# import running from within Anki
from .services import voicelist
constants = __import__('constants', globals(), locals(), [], sys._addon_import_level_base)
voice = __import__('voice', globals(), locals(), [], sys._addon_import_level_base)
services = __import__('services', globals(), locals(), [], sys._addon_import_level_base)
languages = __import__('languages', globals(), locals(), [], sys._addon_import_level_base)
errors = __import__('errors', globals(), locals(), [], sys._addon_import_level_base)
class ServiceBase(abc.ABC):
def __init__(self):
self._config = {}
"""service name"""
def _get_name(self):
return type(self).__name__
name = property(fget=_get_name)
# enable/disable the service
def _get_enabled(self):
if not hasattr(self, '_enabled'):
return self.enabled_by_default()
if self._enabled == None:
return False
return self._enabled
def _set_enabled(self, enabled):
self._enabled = enabled
enabled = property(fget=_get_enabled, fset=_set_enabled)
# whether the service is supported by cloud-language-tools
def cloudlanguagetools_enabled(self):
return False # default
# whether the service is enabled by default
def enabled_by_default(self):
return False
@property
@abc.abstractmethod
def service_type(self) -> constants.ServiceType:
pass
@property
@abc.abstractmethod
def service_fee(self) -> constants.ServiceFee:
pass
def test_service(self):
return False
@abc.abstractmethod
def voice_list(self) -> typing.List[voice.VoiceBase]:
pass
@abc.abstractmethod
def get_tts_audio(self, source_text, voice: voice.VoiceBase, options):
pass
# some helper functions
def basic_voice_list(self) -> typing.List[voice.VoiceBase]:
"""basic processing for voice list which should work for most services which are represented in voicelist.py"""
service_voices_json = [voice for voice in services.voicelist.VOICE_LIST if voice['service'] == self.name]
service_voices = [voice.Voice(v['name'],
constants.Gender[v['gender']],
languages.AudioLanguage[v['language']],
self,
v['key'],
v['options']) for v in service_voices_json]
return service_voices
# the following functions can be overriden if a service requires configuration
def configuration_options(self):
return {}
def configure(self, config):
self._config = config
def get_configuration_value_mandatory(self, key):
value = self._config.get(key, None)
if value == None or (self.configuration_options()[key] == str and len(value) == 0):
raise errors.MissingServiceConfiguration(self.name, key)
return value
def get_configuration_value_optional(self, key, default_value):
return self._config.get(key, default_value)