diff --git a/apps/locales/en_US/LC_MESSAGES/django.po b/apps/locales/en_US/LC_MESSAGES/django.po index b406a2b6013..3e7319209a1 100644 --- a/apps/locales/en_US/LC_MESSAGES/django.po +++ b/apps/locales/en_US/LC_MESSAGES/django.po @@ -8805,4 +8805,13 @@ msgid "File upload is not enabled" msgstr "" msgid "Blocked unsafe redirect to internal host" +msgstr "" + +msgid "Audio file recognition - Tongyi Qwen" +msgstr "" + +msgid "Audio file recognition - Fun-ASR/Paraformer/SenseVoice" +msgstr "" + +msgid "Qwen-Omni" msgstr "" \ No newline at end of file diff --git a/apps/locales/zh_CN/LC_MESSAGES/django.po b/apps/locales/zh_CN/LC_MESSAGES/django.po index 1eae0386c9f..39b9acf2b7c 100644 --- a/apps/locales/zh_CN/LC_MESSAGES/django.po +++ b/apps/locales/zh_CN/LC_MESSAGES/django.po @@ -8931,4 +8931,14 @@ msgid "File upload is not enabled" msgstr "文件上传未启用" msgid "Blocked unsafe redirect to internal host" -msgstr "阻止不安全的重定向到内部主机" \ No newline at end of file +msgstr "阻止不安全的重定向到内部主机" +msgstr "请输入Web根地址" + +msgid "Audio file recognition - Tongyi Qwen" +msgstr "录音文件识别-通义千问" + +msgid "Audio file recognition - Fun-ASR/Paraformer/SenseVoice" +msgstr "录音文件识别-Fun-ASR/Paraformer/SenseVoice" + +msgid "Qwen-Omni" +msgstr "多模态" \ No newline at end of file diff --git a/apps/locales/zh_Hant/LC_MESSAGES/django.po b/apps/locales/zh_Hant/LC_MESSAGES/django.po index 01bd43d914f..8e9d5273480 100644 --- a/apps/locales/zh_Hant/LC_MESSAGES/django.po +++ b/apps/locales/zh_Hant/LC_MESSAGES/django.po @@ -8932,3 +8932,14 @@ msgstr "文件上傳未啟用" msgid "Blocked unsafe redirect to internal host" msgstr "阻止不安全的重定向到內部主機" + +msgstr "請輸入Web根地址" + +msgid "Audio file recognition - Tongyi Qwen" +msgstr "錄音文件識別-通義千問" + +msgid "Audio file recognition - Fun-ASR/Paraformer/SenseVoice" +msgstr "錄音文件識別-Fun-ASR/Paraformer/SenseVoice" + +msgid "Qwen-Omni" +msgstr "多模態" \ No newline at end of file diff --git a/apps/models_provider/impl/aliyun_bai_lian_model_provider/aliyun_bai_lian_model_provider.py b/apps/models_provider/impl/aliyun_bai_lian_model_provider/aliyun_bai_lian_model_provider.py index af4677d3dac..44947255787 100644 --- a/apps/models_provider/impl/aliyun_bai_lian_model_provider/aliyun_bai_lian_model_provider.py +++ b/apps/models_provider/impl/aliyun_bai_lian_model_provider/aliyun_bai_lian_model_provider.py @@ -11,26 +11,28 @@ from common.utils.common import get_file_content from models_provider.base_model_provider import ModelProvideInfo, ModelTypeConst, ModelInfo, IModelProvider, \ ModelInfoManage -from models_provider.impl.aliyun_bai_lian_model_provider.credential.asr_stt import AliyunBaiLianAsrSTTModelCredential +from models_provider.impl.aliyun_bai_lian_model_provider.credential.stt.asr_stt import AliyunBaiLianAsrSTTModelCredential from models_provider.impl.aliyun_bai_lian_model_provider.credential.embedding import \ AliyunBaiLianEmbeddingCredential from models_provider.impl.aliyun_bai_lian_model_provider.credential.image import QwenVLModelCredential from models_provider.impl.aliyun_bai_lian_model_provider.credential.itv import ImageToVideoModelCredential from models_provider.impl.aliyun_bai_lian_model_provider.credential.llm import BaiLianLLMModelCredential -from models_provider.impl.aliyun_bai_lian_model_provider.credential.omni_stt import AliyunBaiLianOmiSTTModelCredential +from models_provider.impl.aliyun_bai_lian_model_provider.credential.stt.omni_stt import AliyunBaiLianOmiSTTModelCredential from models_provider.impl.aliyun_bai_lian_model_provider.credential.reranker import \ AliyunBaiLianRerankerCredential -from models_provider.impl.aliyun_bai_lian_model_provider.credential.stt import AliyunBaiLianSTTModelCredential +from models_provider.impl.aliyun_bai_lian_model_provider.credential.stt import AliyunBaiLianSTTModelCredential, \ + AliyunBaiLianDefaultSTTModelCredential from models_provider.impl.aliyun_bai_lian_model_provider.credential.tti import QwenTextToImageModelCredential from models_provider.impl.aliyun_bai_lian_model_provider.credential.tts import AliyunBaiLianTTSModelCredential from models_provider.impl.aliyun_bai_lian_model_provider.credential.ttv import TextToVideoModelCredential -from models_provider.impl.aliyun_bai_lian_model_provider.model.asr_stt import AliyunBaiLianAsrSpeechToText +from models_provider.impl.aliyun_bai_lian_model_provider.model.stt.asr_stt import AliyunBaiLianAsrSpeechToText from models_provider.impl.aliyun_bai_lian_model_provider.model.embedding import AliyunBaiLianEmbedding from models_provider.impl.aliyun_bai_lian_model_provider.model.image import QwenVLChatModel from models_provider.impl.aliyun_bai_lian_model_provider.model.llm import BaiLianChatModel -from models_provider.impl.aliyun_bai_lian_model_provider.model.omni_stt import AliyunBaiLianOmiSpeechToText +from models_provider.impl.aliyun_bai_lian_model_provider.model.stt.omni_stt import AliyunBaiLianOmiSpeechToText from models_provider.impl.aliyun_bai_lian_model_provider.model.reranker import AliyunBaiLianReranker -from models_provider.impl.aliyun_bai_lian_model_provider.model.stt import AliyunBaiLianSpeechToText +from models_provider.impl.aliyun_bai_lian_model_provider.model.stt import AliyunBaiLianSpeechToText, \ + AliyunBaiLianDefaultSpeechToText from models_provider.impl.aliyun_bai_lian_model_provider.model.tti import QwenTextToImageModel from models_provider.impl.aliyun_bai_lian_model_provider.model.tts import AliyunBaiLianTextToSpeech from maxkb.conf import PROJECT_DIR @@ -43,6 +45,7 @@ aliyun_bai_lian_stt_model_credential = AliyunBaiLianSTTModelCredential() aliyun_bai_lian_omi_stt_model_credential = AliyunBaiLianOmiSTTModelCredential() aliyun_bai_lian_asr_stt_model_credential = AliyunBaiLianAsrSTTModelCredential() +aliyun_bai_lian_default_stt_model_credential = AliyunBaiLianDefaultSTTModelCredential() aliyun_bai_lian_embedding_model_credential = AliyunBaiLianEmbeddingCredential() aliyun_bai_lian_llm_model_credential = BaiLianLLMModelCredential() qwenvl_model_credential = QwenVLModelCredential() @@ -137,7 +140,10 @@ .append_model_info_list(module_info_tti_list) .append_default_model_info(module_info_tti_list[0]) .append_default_model_info(model_info_list[1]) - .append_default_model_info(model_info_list[2]) + .append_default_model_info(ModelInfo('default', + _('default'), + ModelTypeConst.STT, aliyun_bai_lian_default_stt_model_credential, + AliyunBaiLianDefaultSpeechToText)) .append_default_model_info(model_info_list[3]) .append_default_model_info(model_info_list[4]) .append_default_model_info(model_info_list[0]) diff --git a/apps/models_provider/impl/aliyun_bai_lian_model_provider/credential/stt/__init__.py b/apps/models_provider/impl/aliyun_bai_lian_model_provider/credential/stt/__init__.py new file mode 100644 index 00000000000..f6aabffea89 --- /dev/null +++ b/apps/models_provider/impl/aliyun_bai_lian_model_provider/credential/stt/__init__.py @@ -0,0 +1,12 @@ +# coding=utf-8 +""" + @project: MaxKB + @Author:niu + @file: __init__.py.py + @date:2025/12/5 15:11 + @desc: +""" +from .stt import AliyunBaiLianSTTModelCredential +from .omni_stt import AliyunBaiLianOmiSTTModelCredential +from .default_stt import AliyunBaiLianDefaultSTTModelCredential +from .asr_stt import AliyunBaiLianAsrSTTModelCredential \ No newline at end of file diff --git a/apps/models_provider/impl/aliyun_bai_lian_model_provider/credential/asr_stt.py b/apps/models_provider/impl/aliyun_bai_lian_model_provider/credential/stt/asr_stt.py similarity index 98% rename from apps/models_provider/impl/aliyun_bai_lian_model_provider/credential/asr_stt.py rename to apps/models_provider/impl/aliyun_bai_lian_model_provider/credential/stt/asr_stt.py index 64f0aea5bc9..b22f9ff7f1e 100644 --- a/apps/models_provider/impl/aliyun_bai_lian_model_provider/credential/asr_stt.py +++ b/apps/models_provider/impl/aliyun_bai_lian_model_provider/credential/stt/asr_stt.py @@ -8,6 +8,7 @@ from django.utils.translation import gettext as _ from common.utils.logger import maxkb_logger + class AliyunBaiLianAsrSTTModelCredential(BaseForm, BaseModelCredential): api_url = forms.TextInputField(_('API URL'), required=True) api_key = forms.PasswordInputField(_('API Key'), required=True) @@ -39,6 +40,7 @@ def is_valid(self, try: model = provider.get_model(model_type, model_name, model_credential) + model.check_auth() except Exception as e: maxkb_logger.error(f'Exception: {e}', exc_info=True) if isinstance(e, AppApiException): diff --git a/apps/models_provider/impl/aliyun_bai_lian_model_provider/credential/stt/default_stt.py b/apps/models_provider/impl/aliyun_bai_lian_model_provider/credential/stt/default_stt.py new file mode 100644 index 00000000000..1a7b93967ff --- /dev/null +++ b/apps/models_provider/impl/aliyun_bai_lian_model_provider/credential/stt/default_stt.py @@ -0,0 +1,84 @@ +# coding=utf-8 +""" + @project: MaxKB + @Author:niu + @file: default_stt.py + @date:2025/12/5 15:12 + @desc: +""" +from typing import Dict, Any + +from common import forms +from common.exception.app_exception import AppApiException +from common.forms import BaseForm +from maxkb.settings import maxkb_logger +from models_provider.base_model_provider import BaseModelCredential, ValidCode +from django.utils.translation import gettext as _ + + + +class AliyunBaiLianDefaultSTTModelCredential(BaseForm, BaseModelCredential): + type = forms.Radio(_("Type"), required=True, text_field='label', default_value='qwen', provider='', method='', + value_field='value', option_list=[ + {'label': _('Audio file recognition - Tongyi Qwen'), + 'value': 'qwen'}, + {'label': _('Qwen-Omni'), + 'value': 'omni'}, + {'label': _('Audio file recognition - Fun-ASR/Paraformer/SenseVoice'), + 'value': 'other'} + ]) + api_url = forms.TextInputField(_('API URL'), required=True, relation_show_field_dict={'type': ['qwen', 'omni']}) + api_key = forms.PasswordInputField(_('API Key'), required=True) + + def is_valid(self, + model_type: str, + model_name: str, + model_credential: Dict[str, Any], + model_params: Dict[str, Any], + provider, + raise_exception: bool = False + ) -> bool: + model_type_list = provider.get_model_type_list() + model_type_list = provider.get_model_type_list() + if not any(mt.get('value') == model_type for mt in model_type_list): + raise AppApiException( + ValidCode.valid_error.value, + _('{model_type} Model type is not supported').format(model_type=model_type) + ) + + required_keys = ['api_key'] + for key in required_keys: + if key not in model_credential: + if raise_exception: + raise AppApiException( + ValidCode.valid_error.value, + _('{key} is required').format(key=key) + ) + return False + + try: + model = provider.get_model(model_type, model_name, model_credential) + model.check_auth() + except Exception as e: + maxkb_logger.error(f'Exception: {e}', exc_info=True) + if isinstance(e, AppApiException): + raise e + if raise_exception: + raise AppApiException( + ValidCode.valid_error.value, + _('Verification failed, please check whether the parameters are correct: {error}').format( + error=str(e)) + ) + return False + return True + + def encryption_dict(self, model: Dict[str, object]) -> Dict[str, object]: + + return { + **model, + 'api_key': super().encryption(model.get('api_key', '')) + } + + def get_model_params_setting_form(self, model_name): + + pass \ No newline at end of file diff --git a/apps/models_provider/impl/aliyun_bai_lian_model_provider/credential/omni_stt.py b/apps/models_provider/impl/aliyun_bai_lian_model_provider/credential/stt/omni_stt.py similarity index 98% rename from apps/models_provider/impl/aliyun_bai_lian_model_provider/credential/omni_stt.py rename to apps/models_provider/impl/aliyun_bai_lian_model_provider/credential/stt/omni_stt.py index 6b1e2f89482..b4e4878c515 100644 --- a/apps/models_provider/impl/aliyun_bai_lian_model_provider/credential/omni_stt.py +++ b/apps/models_provider/impl/aliyun_bai_lian_model_provider/credential/stt/omni_stt.py @@ -48,6 +48,7 @@ def is_valid(self, try: model = provider.get_model(model_type, model_name, model_credential) + model.check_auth() except Exception as e: maxkb_logger.error(f'Exception: {e}', exc_info=True) if isinstance(e, AppApiException): diff --git a/apps/models_provider/impl/aliyun_bai_lian_model_provider/credential/stt.py b/apps/models_provider/impl/aliyun_bai_lian_model_provider/credential/stt/stt.py similarity index 100% rename from apps/models_provider/impl/aliyun_bai_lian_model_provider/credential/stt.py rename to apps/models_provider/impl/aliyun_bai_lian_model_provider/credential/stt/stt.py diff --git a/apps/models_provider/impl/aliyun_bai_lian_model_provider/model/stt/__init__.py b/apps/models_provider/impl/aliyun_bai_lian_model_provider/model/stt/__init__.py new file mode 100644 index 00000000000..59db8ff9b74 --- /dev/null +++ b/apps/models_provider/impl/aliyun_bai_lian_model_provider/model/stt/__init__.py @@ -0,0 +1,13 @@ +#coding=utf-8 +""" + @project: MaxKB + @Author:niu + @file: __init__.py.py + @date:2025/12/5 15:39 + @desc: +""" + +from .asr_stt import AliyunBaiLianAsrSpeechToText +from .default_stt import AliyunBaiLianDefaultSpeechToText +from .stt import AliyunBaiLianSpeechToText +from .omni_stt import AliyunBaiLianOmiSpeechToText \ No newline at end of file diff --git a/apps/models_provider/impl/aliyun_bai_lian_model_provider/model/asr_stt.py b/apps/models_provider/impl/aliyun_bai_lian_model_provider/model/stt/asr_stt.py similarity index 99% rename from apps/models_provider/impl/aliyun_bai_lian_model_provider/model/asr_stt.py rename to apps/models_provider/impl/aliyun_bai_lian_model_provider/model/stt/asr_stt.py index ecf8a83c569..40c3d53fc2e 100644 --- a/apps/models_provider/impl/aliyun_bai_lian_model_provider/model/asr_stt.py +++ b/apps/models_provider/impl/aliyun_bai_lian_model_provider/model/stt/asr_stt.py @@ -43,6 +43,7 @@ def check_auth(self): self.speech_to_text(audio_file) def speech_to_text(self, audio_file): + try: base64_audio = base64.b64encode(audio_file.read()).decode("utf-8") diff --git a/apps/models_provider/impl/aliyun_bai_lian_model_provider/model/stt/default_stt.py b/apps/models_provider/impl/aliyun_bai_lian_model_provider/model/stt/default_stt.py new file mode 100644 index 00000000000..6607345bb24 --- /dev/null +++ b/apps/models_provider/impl/aliyun_bai_lian_model_provider/model/stt/default_stt.py @@ -0,0 +1,68 @@ +# coding=utf-8 +""" + @project: MaxKB + @Author:niu + @file: default_stt.py + @date:2025/12/5 15:40 + @desc: +""" +import os +from typing import Dict + +from models_provider.base_model_provider import MaxKBBaseModel + +from models_provider.impl.base_stt import BaseSpeechToText + + +class AliyunBaiLianDefaultSpeechToText(MaxKBBaseModel, BaseSpeechToText): + def check_auth(self): + pass + + def speech_to_text(self, audio_file): + pass + + @staticmethod + def is_cache_model(): + return False + + @staticmethod + def new_instance(model_type, model_name, model_credential: Dict[str, object], **model_kwargs): + from models_provider.impl.aliyun_bai_lian_model_provider.model.stt import AliyunBaiLianOmiSpeechToText, \ + AliyunBaiLianSpeechToText, AliyunBaiLianAsrSpeechToText + stt_type=model_credential.get('type') + if stt_type == 'qwen': + return AliyunBaiLianAsrSpeechToText( + model=model_name, + api_key=model_credential.get('api_key'), + api_url=model_credential.get('api_url'), + params=model_kwargs, + **model_kwargs + ) + elif stt_type == 'omni': + return AliyunBaiLianOmiSpeechToText( + model=model_name, + api_key=model_credential.get('api_key'), + api_url=model_credential.get('api_url'), + params=model_kwargs, + **model_kwargs + ) + else: + return AliyunBaiLianSpeechToText( + model=model_name, + api_key=model_credential.get('api_key'), + params=model_kwargs, + **model_kwargs, + ) + + + + + + + + + + + + + diff --git a/apps/models_provider/impl/aliyun_bai_lian_model_provider/model/iat_mp3_16k.mp3 b/apps/models_provider/impl/aliyun_bai_lian_model_provider/model/stt/iat_mp3_16k.mp3 similarity index 100% rename from apps/models_provider/impl/aliyun_bai_lian_model_provider/model/iat_mp3_16k.mp3 rename to apps/models_provider/impl/aliyun_bai_lian_model_provider/model/stt/iat_mp3_16k.mp3 diff --git a/apps/models_provider/impl/aliyun_bai_lian_model_provider/model/omni_stt.py b/apps/models_provider/impl/aliyun_bai_lian_model_provider/model/stt/omni_stt.py similarity index 100% rename from apps/models_provider/impl/aliyun_bai_lian_model_provider/model/omni_stt.py rename to apps/models_provider/impl/aliyun_bai_lian_model_provider/model/stt/omni_stt.py diff --git a/apps/models_provider/impl/aliyun_bai_lian_model_provider/model/stt.py b/apps/models_provider/impl/aliyun_bai_lian_model_provider/model/stt/stt.py similarity index 100% rename from apps/models_provider/impl/aliyun_bai_lian_model_provider/model/stt.py rename to apps/models_provider/impl/aliyun_bai_lian_model_provider/model/stt/stt.py