|
|
|
|
@ -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)
|
|
|
|
|
|