# This file is part of Gajim. # # Gajim is free software: 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. # # Gajim 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 Gajim. If not, see . import logging import typing from gajim.common.app import Any from gajim.plugins.plugins_i18n import _ from .models import openai_whisper from .stt_voice_messages import STTVoiceMessagesPlugin log = logging.getLogger('gajim.p.stt_voice_messages_config') SUPPORTED_MODELS: dict[str, dict[str, typing.Union[list[str], Any, str]]] = { 'model_openaiwhisper': { 'moduls': ['whisper'], 'class': openai_whisper.WhisperModel, 'name': 'OpenAI Whisper' }, 'model_ctranslate2': { 'moduls': ['ctranslate2'], 'class': None, 'name': _('CTranslate2') }, 'model_faster-whisper': { 'moduls': ['faster-whisper'], 'class': None, 'name:': _('Faster-Whisper') }, 'model_distill': { 'moduls': ['transformers', 'accelerate', 'datasets[audio]'], 'class': None, 'name': _('Distill') } } class Configuration: def __init__(self, plugin: STTVoiceMessagesPlugin): self.plugin = plugin self._available_models: dict[ str, dict[str, typing.Union[list[str], Any, str]]] = {} self.check_available_moduls() @property def available_models(self) -> dict[str, dict[str, typing.Union[list[str], Any, str]]]: return self._available_models def on_setting(self, value: Any, data: Any) -> None: if isinstance(value, str): value.strip() log.debug('plugin config before:\n %s', self.plugin.config.data) self.plugin.config[data] = value log.debug('plugin config after:\n %s', self.plugin.config.data) def on_set_model(self, value: Any, data: Any) -> None: if isinstance(value, str): value.strip() log.debug('plugin config before:\n %s', self.plugin.config.data) self.plugin.config['model_class'] = self._available_models[value][ 'class'] self.on_setting(value, data) log.debug('plugin config after:\n %s', self.plugin.config.data) @staticmethod def is_module_available(module: str) -> bool: try: __import__(module) return True except ModuleNotFoundError: log.debug('Could not find module %s', module) return False except ImportError as ex: log.debug(str(ex)) return False def check_available_moduls(self): for model in SUPPORTED_MODELS: available = True for modul in SUPPORTED_MODELS[model]['moduls']: if not self.is_module_available(modul): available = False continue if available: self._available_models[model] = SUPPORTED_MODELS[model] if (self.plugin.config.data['model_class'] is None and len(self._available_models) > 0): model = list(self._available_models)[0] self.on_set_model(model, 'model') log.debug('Choose first available model!') else: log.debug('Available model already chosen!') log.debug('models = %s', self._available_models)