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