Underground-Digital/Workflow-Engine
0
1import logging2 3from flask import request4from werkzeug.exceptions import InternalServerError5 6import services7from controllers.web import api8from controllers.web.error import (9 AppUnavailableError,10 AudioTooLargeError,11 CompletionRequestError,12 NoAudioUploadedError,13 ProviderModelCurrentlyNotSupportError,14 ProviderNotInitializeError,15 ProviderNotSupportSpeechToTextError,16 ProviderQuotaExceededError,17 UnsupportedAudioTypeError,18)19from controllers.web.wraps import WebApiResource20from core.errors.error import ModelCurrentlyNotSupportError, ProviderTokenNotInitError, QuotaExceededError21from core.model_runtime.errors.invoke import InvokeError22from models.model import App, AppMode23from services.audio_service import AudioService24from services.errors.audio import (25 AudioTooLargeServiceError,26 NoAudioUploadedServiceError,27 ProviderNotSupportSpeechToTextServiceError,28 UnsupportedAudioTypeServiceError,29)30 31 32class AudioApi(WebApiResource):33 def post(self, app_model: App, end_user):34 file = request.files["file"]35 36 try:37 response = AudioService.transcript_asr(app_model=app_model, file=file, end_user=end_user)38 39 return response40 except services.errors.app_model_config.AppModelConfigBrokenError:41 logging.exception("App model config broken.")42 raise AppUnavailableError()43 except NoAudioUploadedServiceError:44 raise NoAudioUploadedError()45 except AudioTooLargeServiceError as e:46 raise AudioTooLargeError(str(e))47 except UnsupportedAudioTypeServiceError:48 raise UnsupportedAudioTypeError()49 except ProviderNotSupportSpeechToTextServiceError:50 raise ProviderNotSupportSpeechToTextError()51 except ProviderTokenNotInitError as ex:52 raise ProviderNotInitializeError(ex.description)53 except QuotaExceededError:54 raise ProviderQuotaExceededError()55 except ModelCurrentlyNotSupportError:56 raise ProviderModelCurrentlyNotSupportError()57 except InvokeError as e:58 raise CompletionRequestError(e.description)59 except ValueError as e:60 raise e61 except Exception as e:62 logging.exception(f"internal server error: {str(e)}")63 raise InternalServerError()64 65 66class TextApi(WebApiResource):67 def post(self, app_model: App, end_user):68 from flask_restful import reqparse69 70 try:71 parser = reqparse.RequestParser()72 parser.add_argument("message_id", type=str, required=False, location="json")73 parser.add_argument("voice", type=str, location="json")74 parser.add_argument("text", type=str, location="json")75 parser.add_argument("streaming", type=bool, location="json")76 args = parser.parse_args()77 78 message_id = args.get("message_id", None)79 text = args.get("text", None)80 if (81 app_model.mode in {AppMode.ADVANCED_CHAT.value, AppMode.WORKFLOW.value}82 and app_model.workflow83 and app_model.workflow.features_dict84 ):85 text_to_speech = app_model.workflow.features_dict.get("text_to_speech")86 voice = args.get("voice") or text_to_speech.get("voice")87 else:88 try:89 voice = args.get("voice") or app_model.app_model_config.text_to_speech_dict.get("voice")90 except Exception:91 voice = None92 93 response = AudioService.transcript_tts(94 app_model=app_model, message_id=message_id, end_user=end_user.external_user_id, voice=voice, text=text95 )96 97 return response98 except services.errors.app_model_config.AppModelConfigBrokenError:99 logging.exception("App model config broken.")100 raise AppUnavailableError()101 except NoAudioUploadedServiceError:102 raise NoAudioUploadedError()103 except AudioTooLargeServiceError as e:104 raise AudioTooLargeError(str(e))105 except UnsupportedAudioTypeServiceError:106 raise UnsupportedAudioTypeError()107 except ProviderNotSupportSpeechToTextServiceError:108 raise ProviderNotSupportSpeechToTextError()109 except ProviderTokenNotInitError as ex:110 raise ProviderNotInitializeError(ex.description)111 except QuotaExceededError:112 raise ProviderQuotaExceededError()113 except ModelCurrentlyNotSupportError:114 raise ProviderModelCurrentlyNotSupportError()115 except InvokeError as e:116 raise CompletionRequestError(e.description)117 except ValueError as e:118 raise e119 except Exception as e:120 logging.exception(f"internal server error: {str(e)}")121 raise InternalServerError()122 123 124api.add_resource(AudioApi, "/audio-to-text")125api.add_resource(TextApi, "/text-to-audio")126 