|  | @@ -1,18 +1,16 @@
 | 
	
		
			
				|  |  | -import hashlib
 | 
	
		
			
				|  |  |  import logging
 | 
	
		
			
				|  |  |  import re
 | 
	
		
			
				|  |  | -import subprocess
 | 
	
		
			
				|  |  | -import uuid
 | 
	
		
			
				|  |  |  from abc import abstractmethod
 | 
	
		
			
				|  |  |  from typing import Optional
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  from pydantic import ConfigDict
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  from core.model_runtime.entities.model_entities import ModelPropertyKey, ModelType
 | 
	
		
			
				|  |  | -from core.model_runtime.errors.invoke import InvokeBadRequestError
 | 
	
		
			
				|  |  |  from core.model_runtime.model_providers.__base.ai_model import AIModel
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  logger = logging.getLogger(__name__)
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  class TTSModel(AIModel):
 | 
	
		
			
				|  |  |      """
 | 
	
		
			
				|  |  |      Model class for ttstext model.
 | 
	
	
		
			
				|  | @@ -37,8 +35,6 @@ class TTSModel(AIModel):
 | 
	
		
			
				|  |  |          :return: translated audio file
 | 
	
		
			
				|  |  |          """
 | 
	
		
			
				|  |  |          try:
 | 
	
		
			
				|  |  | -            logger.info(f"Invoke TTS model: {model} , invoke content : {content_text}")
 | 
	
		
			
				|  |  | -            self._is_ffmpeg_installed()
 | 
	
		
			
				|  |  |              return self._invoke(model=model, credentials=credentials, user=user,
 | 
	
		
			
				|  |  |                                  content_text=content_text, voice=voice, tenant_id=tenant_id)
 | 
	
		
			
				|  |  |          except Exception as e:
 | 
	
	
		
			
				|  | @@ -75,7 +71,8 @@ class TTSModel(AIModel):
 | 
	
		
			
				|  |  |          if model_schema and ModelPropertyKey.VOICES in model_schema.model_properties:
 | 
	
		
			
				|  |  |              voices = model_schema.model_properties[ModelPropertyKey.VOICES]
 | 
	
		
			
				|  |  |              if language:
 | 
	
		
			
				|  |  | -                return [{'name': d['name'], 'value': d['mode']} for d in voices if language and language in d.get('language')]
 | 
	
		
			
				|  |  | +                return [{'name': d['name'], 'value': d['mode']} for d in voices if
 | 
	
		
			
				|  |  | +                        language and language in d.get('language')]
 | 
	
		
			
				|  |  |              else:
 | 
	
		
			
				|  |  |                  return [{'name': d['name'], 'value': d['mode']} for d in voices]
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -146,28 +143,3 @@ class TTSModel(AIModel):
 | 
	
		
			
				|  |  |          if one_sentence != '':
 | 
	
		
			
				|  |  |              result.append(one_sentence)
 | 
	
		
			
				|  |  |          return result
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    @staticmethod
 | 
	
		
			
				|  |  | -    def _is_ffmpeg_installed():
 | 
	
		
			
				|  |  | -        try:
 | 
	
		
			
				|  |  | -            output = subprocess.check_output("ffmpeg -version", shell=True)
 | 
	
		
			
				|  |  | -            if "ffmpeg version" in output.decode("utf-8"):
 | 
	
		
			
				|  |  | -                return True
 | 
	
		
			
				|  |  | -            else:
 | 
	
		
			
				|  |  | -                raise InvokeBadRequestError("ffmpeg is not installed, "
 | 
	
		
			
				|  |  | -                                            "details: https://docs.dify.ai/getting-started/install-self-hosted"
 | 
	
		
			
				|  |  | -                                            "/install-faq#id-14.-what-to-do-if-this-error-occurs-in-text-to-speech")
 | 
	
		
			
				|  |  | -        except Exception:
 | 
	
		
			
				|  |  | -            raise InvokeBadRequestError("ffmpeg is not installed, "
 | 
	
		
			
				|  |  | -                                        "details: https://docs.dify.ai/getting-started/install-self-hosted"
 | 
	
		
			
				|  |  | -                                        "/install-faq#id-14.-what-to-do-if-this-error-occurs-in-text-to-speech")
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    # Todo: To improve the streaming function
 | 
	
		
			
				|  |  | -    @staticmethod
 | 
	
		
			
				|  |  | -    def _get_file_name(file_content: str) -> str:
 | 
	
		
			
				|  |  | -        hash_object = hashlib.sha256(file_content.encode())
 | 
	
		
			
				|  |  | -        hex_digest = hash_object.hexdigest()
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        namespace_uuid = uuid.UUID('a5da6ef9-b303-596f-8e88-bf8fa40f4b31')
 | 
	
		
			
				|  |  | -        unique_uuid = uuid.uuid5(namespace_uuid, hex_digest)
 | 
	
		
			
				|  |  | -        return str(unique_uuid)
 |