Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.

audio.py 8.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201
  1. import logging
  2. from flask import request
  3. from flask_restx import Resource, fields, reqparse
  4. from werkzeug.exceptions import InternalServerError
  5. import services
  6. from controllers.console import api, console_ns
  7. from controllers.console.app.error import (
  8. AppUnavailableError,
  9. AudioTooLargeError,
  10. CompletionRequestError,
  11. NoAudioUploadedError,
  12. ProviderModelCurrentlyNotSupportError,
  13. ProviderNotInitializeError,
  14. ProviderNotSupportSpeechToTextError,
  15. ProviderQuotaExceededError,
  16. UnsupportedAudioTypeError,
  17. )
  18. from controllers.console.app.wraps import get_app_model
  19. from controllers.console.wraps import account_initialization_required, setup_required
  20. from core.errors.error import ModelCurrentlyNotSupportError, ProviderTokenNotInitError, QuotaExceededError
  21. from core.model_runtime.errors.invoke import InvokeError
  22. from libs.login import login_required
  23. from models import App, AppMode
  24. from services.audio_service import AudioService
  25. from services.errors.audio import (
  26. AudioTooLargeServiceError,
  27. NoAudioUploadedServiceError,
  28. ProviderNotSupportSpeechToTextServiceError,
  29. UnsupportedAudioTypeServiceError,
  30. )
  31. logger = logging.getLogger(__name__)
  32. @console_ns.route("/apps/<uuid:app_id>/audio-to-text")
  33. class ChatMessageAudioApi(Resource):
  34. @api.doc("chat_message_audio_transcript")
  35. @api.doc(description="Transcript audio to text for chat messages")
  36. @api.doc(params={"app_id": "App ID"})
  37. @api.response(
  38. 200,
  39. "Audio transcription successful",
  40. api.model("AudioTranscriptResponse", {"text": fields.String(description="Transcribed text from audio")}),
  41. )
  42. @api.response(400, "Bad request - No audio uploaded or unsupported type")
  43. @api.response(413, "Audio file too large")
  44. @setup_required
  45. @login_required
  46. @account_initialization_required
  47. @get_app_model(mode=[AppMode.CHAT, AppMode.AGENT_CHAT, AppMode.ADVANCED_CHAT])
  48. def post(self, app_model):
  49. file = request.files["file"]
  50. try:
  51. response = AudioService.transcript_asr(
  52. app_model=app_model,
  53. file=file,
  54. end_user=None,
  55. )
  56. return response
  57. except services.errors.app_model_config.AppModelConfigBrokenError:
  58. logger.exception("App model config broken.")
  59. raise AppUnavailableError()
  60. except NoAudioUploadedServiceError:
  61. raise NoAudioUploadedError()
  62. except AudioTooLargeServiceError as e:
  63. raise AudioTooLargeError(str(e))
  64. except UnsupportedAudioTypeServiceError:
  65. raise UnsupportedAudioTypeError()
  66. except ProviderNotSupportSpeechToTextServiceError:
  67. raise ProviderNotSupportSpeechToTextError()
  68. except ProviderTokenNotInitError as ex:
  69. raise ProviderNotInitializeError(ex.description)
  70. except QuotaExceededError:
  71. raise ProviderQuotaExceededError()
  72. except ModelCurrentlyNotSupportError:
  73. raise ProviderModelCurrentlyNotSupportError()
  74. except InvokeError as e:
  75. raise CompletionRequestError(e.description)
  76. except ValueError as e:
  77. raise e
  78. except Exception as e:
  79. logger.exception("Failed to handle post request to ChatMessageAudioApi")
  80. raise InternalServerError()
  81. @console_ns.route("/apps/<uuid:app_id>/text-to-audio")
  82. class ChatMessageTextApi(Resource):
  83. @api.doc("chat_message_text_to_speech")
  84. @api.doc(description="Convert text to speech for chat messages")
  85. @api.doc(params={"app_id": "App ID"})
  86. @api.expect(
  87. api.model(
  88. "TextToSpeechRequest",
  89. {
  90. "message_id": fields.String(description="Message ID"),
  91. "text": fields.String(required=True, description="Text to convert to speech"),
  92. "voice": fields.String(description="Voice to use for TTS"),
  93. "streaming": fields.Boolean(description="Whether to stream the audio"),
  94. },
  95. )
  96. )
  97. @api.response(200, "Text to speech conversion successful")
  98. @api.response(400, "Bad request - Invalid parameters")
  99. @get_app_model
  100. @setup_required
  101. @login_required
  102. @account_initialization_required
  103. def post(self, app_model: App):
  104. try:
  105. parser = reqparse.RequestParser()
  106. parser.add_argument("message_id", type=str, location="json")
  107. parser.add_argument("text", type=str, location="json")
  108. parser.add_argument("voice", type=str, location="json")
  109. parser.add_argument("streaming", type=bool, location="json")
  110. args = parser.parse_args()
  111. message_id = args.get("message_id", None)
  112. text = args.get("text", None)
  113. voice = args.get("voice", None)
  114. response = AudioService.transcript_tts(
  115. app_model=app_model, text=text, voice=voice, message_id=message_id, is_draft=True
  116. )
  117. return response
  118. except services.errors.app_model_config.AppModelConfigBrokenError:
  119. logger.exception("App model config broken.")
  120. raise AppUnavailableError()
  121. except NoAudioUploadedServiceError:
  122. raise NoAudioUploadedError()
  123. except AudioTooLargeServiceError as e:
  124. raise AudioTooLargeError(str(e))
  125. except UnsupportedAudioTypeServiceError:
  126. raise UnsupportedAudioTypeError()
  127. except ProviderNotSupportSpeechToTextServiceError:
  128. raise ProviderNotSupportSpeechToTextError()
  129. except ProviderTokenNotInitError as ex:
  130. raise ProviderNotInitializeError(ex.description)
  131. except QuotaExceededError:
  132. raise ProviderQuotaExceededError()
  133. except ModelCurrentlyNotSupportError:
  134. raise ProviderModelCurrentlyNotSupportError()
  135. except InvokeError as e:
  136. raise CompletionRequestError(e.description)
  137. except ValueError as e:
  138. raise e
  139. except Exception as e:
  140. logger.exception("Failed to handle post request to ChatMessageTextApi")
  141. raise InternalServerError()
  142. @console_ns.route("/apps/<uuid:app_id>/text-to-audio/voices")
  143. class TextModesApi(Resource):
  144. @api.doc("get_text_to_speech_voices")
  145. @api.doc(description="Get available TTS voices for a specific language")
  146. @api.doc(params={"app_id": "App ID"})
  147. @api.expect(api.parser().add_argument("language", type=str, required=True, location="args", help="Language code"))
  148. @api.response(200, "TTS voices retrieved successfully", fields.List(fields.Raw(description="Available voices")))
  149. @api.response(400, "Invalid language parameter")
  150. @get_app_model
  151. @setup_required
  152. @login_required
  153. @account_initialization_required
  154. def get(self, app_model):
  155. try:
  156. parser = reqparse.RequestParser()
  157. parser.add_argument("language", type=str, required=True, location="args")
  158. args = parser.parse_args()
  159. response = AudioService.transcript_tts_voices(
  160. tenant_id=app_model.tenant_id,
  161. language=args["language"],
  162. )
  163. return response
  164. except services.errors.audio.ProviderNotSupportTextToSpeechLanageServiceError:
  165. raise AppUnavailableError("Text to audio voices language parameter loss.")
  166. except NoAudioUploadedServiceError:
  167. raise NoAudioUploadedError()
  168. except AudioTooLargeServiceError as e:
  169. raise AudioTooLargeError(str(e))
  170. except UnsupportedAudioTypeServiceError:
  171. raise UnsupportedAudioTypeError()
  172. except ProviderNotSupportSpeechToTextServiceError:
  173. raise ProviderNotSupportSpeechToTextError()
  174. except ProviderTokenNotInitError as ex:
  175. raise ProviderNotInitializeError(ex.description)
  176. except QuotaExceededError:
  177. raise ProviderQuotaExceededError()
  178. except ModelCurrentlyNotSupportError:
  179. raise ProviderModelCurrentlyNotSupportError()
  180. except InvokeError as e:
  181. raise CompletionRequestError(e.description)
  182. except ValueError as e:
  183. raise e
  184. except Exception as e:
  185. logger.exception("Failed to handle get request to TextModesApi")
  186. raise InternalServerError()