8
8
from abc import ABCMeta , abstractmethod
9
9
from queue import Queue
10
10
from threading import Thread , Event
11
- from typing import List , Tuple , Optional
11
+ from typing import List , Tuple , Optional , Set , Union
12
12
13
13
from ovos_config import Configuration
14
14
from ovos_utils import classproperty
15
- from ovos_utils .log import deprecated
16
- from ovos_utils .process_utils import RuntimeRequirements
17
15
from ovos_utils .lang import standardize_lang_tag
16
+ from ovos_utils .log import deprecated , LOG
17
+ from ovos_utils .process_utils import RuntimeRequirements
18
+
19
+ from ovos_plugin_manager .templates .transformers import AudioLanguageDetector
18
20
from ovos_plugin_manager .utils .config import get_plugin_config
19
21
20
22
@@ -31,6 +33,16 @@ def __init__(self, config=None):
31
33
32
34
self .can_stream = False
33
35
self ._recognizer = None
36
+ self ._detector = None
37
+
38
+ def bind (self , detector : AudioLanguageDetector ):
39
+ self ._detector = detector
40
+ LOG .debug (f"{ self .__class__ .__name__ } - Assigned lang detector: { detector } " )
41
+
42
+ def detect_language (self , audio , valid_langs : Optional [Union [Set [str ], List [str ]]] = None ) -> Tuple [str , float ]:
43
+ if self ._detector is None :
44
+ raise NotImplementedError (f"{ self .__class__ .__name__ } does not support audio language detection" )
45
+ return self ._detector .detect (audio , valid_langs = valid_langs or self .available_languages )
34
46
35
47
@classproperty
36
48
def runtime_requirements (self ):
@@ -79,8 +91,8 @@ def recognizer(self, val):
79
91
@property
80
92
def lang (self ):
81
93
return standardize_lang_tag (self ._lang or \
82
- self .config .get ("lang" ) or \
83
- Configuration ().get ("lang" , "en-US" ))
94
+ self .config .get ("lang" ) or \
95
+ Configuration ().get ("lang" , "en-US" ))
84
96
85
97
@lang .setter
86
98
def lang (self , val ):
@@ -124,10 +136,16 @@ def execute(self, audio, language: Optional[str] = None) -> str:
124
136
def transcribe (self , audio , lang : Optional [str ] = None ) -> List [Tuple [str , float ]]:
125
137
"""transcribe audio data to a list of
126
138
possible transcriptions and respective confidences"""
139
+ if lang is not None and lang == "auto" :
140
+ try :
141
+ lang , prob = self .detect_language (audio , self .available_languages )
142
+ except Exception as e :
143
+ LOG .error (f"Language detection failed: { e } . Falling back to default language." )
144
+ lang = self .lang # Fall back to default language
127
145
return [(self .execute (audio , lang ), 1.0 )]
128
146
129
147
@property
130
- def available_languages (self ) -> set :
148
+ def available_languages (self ) -> Set [ str ] :
131
149
"""Return languages supported by this STT implementation in this state
132
150
This property should be overridden by the derived class to advertise
133
151
what languages that engine supports.
0 commit comments