1
0
mirror of https://github.com/ijaric/voice_assistant.git synced 2025-05-24 14:33:26 +00:00

feat: [#28] models update

This commit is contained in:
ksieuk 2023-10-10 18:33:33 +03:00
parent d70375956c
commit 61e968c33b
14 changed files with 337 additions and 168 deletions

View File

@ -1,4 +1,18 @@
from .orm import Base, IdCreatedUpdatedBaseMixin
from .token import Token
from .tts import *
__all__ = ["Base", "IdCreatedUpdatedBaseMixin", "Token"]
__all__ = [
"Base",
"BaseLanguageCodesEnum",
"BaseVoiceModel",
"BaseVoiceModel",
"ElevenLabsLanguageCodesEnum",
"IdCreatedUpdatedBaseMixin",
"LANGUAGE_CODES_ENUM_TYPE",
"TTSCreateRequestModel",
"TTSCreateResponseModel",
"TTSSearchVoiceRequestModel",
"Token",
"YandexLanguageCodesEnum",
]

View File

@ -0,0 +1,13 @@
from .base import *
from .languages import *
__all__ = [
"BaseLanguageCodesEnum",
"BaseVoiceModel",
"ElevenLabsLanguageCodesEnum",
"LANGUAGE_CODES_ENUM_TYPE",
"TTSCreateRequestModel",
"TTSCreateResponseModel",
"TTSSearchVoiceRequestModel",
"YandexLanguageCodesEnum",
]

View File

@ -0,0 +1,45 @@
import typing
import pydantic
import lib.models.tts.languages as models_tts_languages
class TTSCreateRequestModel(pydantic.BaseModel):
model_config = pydantic.ConfigDict(use_enum_values=True)
voice_model_name: str
text: str
class TTSCreateResponseModel(pydantic.BaseModel):
audio_content: bytes
class BaseVoiceModel(pydantic.BaseModel):
voice_id: str
voice_name: str | None = None
languages: list[models_tts_languages.LANGUAGE_CODES_ENUM_TYPE]
company_name: str
@pydantic.model_validator(mode="before")
@classmethod
def check_voice_name_exists(cls, data: typing.Any) -> typing.Any:
voice_id = data.get("voice_id")
voice_name = data.get("voice_name")
if not voice_name and voice_id:
data["voice_name"] = voice_id
return data
class TTSSearchVoiceRequestModel(pydantic.BaseModel):
voice_id: str | None = None
voice_name: str | None = None
languages: list[models_tts_languages.LANGUAGE_CODES_ENUM_TYPE] | None = None
company_name: str | None = None
@pydantic.model_validator(mode="after")
def check_at_least_one_field(self):
if not any((self.voice_name, self.languages, self.company_name)):
raise ValueError("At least one field required")
return self

View File

@ -0,0 +1,83 @@
import enum
class BaseLanguageCodesEnum(enum.Enum):
RUSSIAN = "ru"
ENGLISH = "en"
KAZAKH = "kk"
GERMAN = "de"
HEBREW = "he"
UZBEK = "uz"
JAPANESE = "ja"
CHINESE = "zh"
HINDI = "hi"
FRENCH = "fr"
KOREAN = "ko"
PORTUGUESE = "pt"
ITALIAN = "it"
SPANISH = "es"
INDONESIAN = "id"
DUTCH = "nl"
TURKISH = "tr"
FILIPINO = "fil"
POLISH = "pl"
SWEDISH = "sv"
BULGARIAN = "bg"
ROMANIAN = "ro"
ARABIC = "ar"
CZECH = "cs"
GREEK = "el"
FINNISH = "fi"
CROATIAN = "hr"
MALAY = "ms"
SLOVAK = "sk"
DANISH = "da"
TAMIL = "ta"
UKRAINIAN = "uk"
class ElevenLabsLanguageCodesEnum(enum.Enum):
RUSSIAN = "ru"
ENGLISH = "en"
KAZAKH = "kk"
GERMAN = "de"
HEBREW = "he"
UZBEK = "uz"
JAPANESE = "ja"
CHINESE = "zh"
HINDI = "hi"
FRENCH = "fr"
KOREAN = "ko"
PORTUGUESE = "pt"
ITALIAN = "it"
SPANISH = "es"
INDONESIAN = "id"
DUTCH = "nl"
TURKISH = "tr"
FILIPINO = "fil"
POLISH = "pl"
SWEDISH = "sv"
BULGARIAN = "bg"
ROMANIAN = "ro"
ARABIC = "ar"
CZECH = "cs"
GREEK = "el"
FINNISH = "fi"
CROATIAN = "hr"
MALAY = "ms"
SLOVAK = "sk"
DANISH = "da"
TAMIL = "ta"
UKRAINIAN = "uk"
class YandexLanguageCodesEnum(enum.Enum):
RUSSIAN = "ru-RU"
ENGLISH = "en-US"
KAZAKH = "kk-KK"
GERMAN = "de-DE"
HEBREW = "he-IL"
UZBEK = "uz-UZ"
LANGUAGE_CODES_ENUM_TYPE = BaseLanguageCodesEnum | ElevenLabsLanguageCodesEnum | YandexLanguageCodesEnum

View File

@ -1,11 +1,17 @@
from .models import *
from .repository import *
from .service import *
from .utils import *
from .voice import *
__all__ = [
"LanguageCodes",
"TTSRequestModel",
"TTSResponseModel",
"VoiceModel",
"YandexVoiceModelNamesString",
"YandexVoiceModels",
"ElevenLabsListVoiceModelsModel",
"ElevenLabsVoiceModel",
"LIST_VOICE_MODELS_TYPE",
"LIST_VOICE_MODELS_TYPE",
"TTSCreateRequestServiceModel",
"TTSCreateResponseServiceModel",
"TTSRepositoryProtocol",
"VOICE_MODELS_TYPE",
"YandexListVoiceModelsModel",
"YandexVoiceModel",
]

View File

@ -1,14 +0,0 @@
import pydantic
import lib.tts.models.voice as tts_models_voice
class TTSRequestModel(pydantic.BaseModel):
model_config = pydantic.ConfigDict(use_enum_values=True)
voice_model_name: tts_models_voice.YandexVoiceModelNamesString
text: str
class TTSResponseModel(pydantic.BaseModel):
audio_content: bytes

View File

@ -0,0 +1,17 @@
import typing
import lib.models as models
import lib.tts.models.utils as tts_models_utils
class TTSRepositoryProtocol(typing.Protocol):
def get_audio_as_bytes_from_text(self, text: str) -> models.TTSCreateResponseModel:
...
def get_voice_model_by_name(self, voice_model_name: str) -> models.BaseVoiceModel | None:
...
def get_voice_models_by_fields(
self, fields: models.TTSSearchVoiceRequestModel
) -> tts_models_utils.LIST_VOICE_MODELS_TYPE:
...

View File

@ -0,0 +1,9 @@
import lib.models as models
class TTSCreateRequestServiceModel(models.TTSCreateRequestModel):
...
class TTSCreateResponseServiceModel(models.TTSCreateResponseModel):
...

View File

@ -0,0 +1,4 @@
import lib.tts.models.voice as tts_models_voice
VOICE_MODELS_TYPE = tts_models_voice.YandexVoiceModel | tts_models_voice.ElevenLabsVoiceModel
LIST_VOICE_MODELS_TYPE = tts_models_voice.YandexListVoiceModelsModel | tts_models_voice.ElevenLabsListVoiceModelsModel

View File

@ -1,9 +1,9 @@
from .base import *
from .eleven_labs import *
from .yandex import *
__all__ = [
"LanguageCodes",
"VoiceModel",
"YandexVoiceModelNamesString",
"YandexVoiceModels",
"ElevenLabsListVoiceModelsModel",
"ElevenLabsVoiceModel",
"YandexListVoiceModelsModel",
"YandexVoiceModel",
]

View File

@ -1,20 +0,0 @@
import enum
import pydantic
class LanguageCodes(enum.Enum):
RUSSIAN = "ru-RU"
ENGLISH = "en-US"
KAZAKH = "kk-KK"
GERMAN = "de-DE"
HEBREW = "he-IL"
UZBEK = "uz-UZ"
class VoiceModel(pydantic.BaseModel):
model_config = pydantic.ConfigDict(use_enum_values=True)
voice_name: str
role: str | None = None
lang: LanguageCodes

View File

@ -0,0 +1,73 @@
import typing
import pydantic
import lib.models as models
class ElevenLabsVoiceModel(models.BaseVoiceModel):
voice_id: str
voice_name: str | None = None
languages: list[models.LANGUAGE_CODES_ENUM_TYPE]
company_name: str = "eleven labs"
class ElevenLabsListVoiceModelsModel(pydantic.BaseModel):
models: list[ElevenLabsVoiceModel] = [
ElevenLabsVoiceModel(
voice_id="eleven_multilingual_v1",
languages=[
models.ElevenLabsLanguageCodesEnum.ENGLISH,
models.ElevenLabsLanguageCodesEnum.GERMAN,
models.ElevenLabsLanguageCodesEnum.POLISH,
models.ElevenLabsLanguageCodesEnum.SPANISH,
models.ElevenLabsLanguageCodesEnum.ITALIAN,
models.ElevenLabsLanguageCodesEnum.FRENCH,
models.ElevenLabsLanguageCodesEnum.PORTUGUESE,
models.ElevenLabsLanguageCodesEnum.HINDI,
models.ElevenLabsLanguageCodesEnum.ARABIC,
],
),
ElevenLabsVoiceModel(
voice_id="eleven_multilingual_v2",
languages=[
models.ElevenLabsLanguageCodesEnum.ENGLISH,
models.ElevenLabsLanguageCodesEnum.JAPANESE,
models.ElevenLabsLanguageCodesEnum.CHINESE,
models.ElevenLabsLanguageCodesEnum.GERMAN,
models.ElevenLabsLanguageCodesEnum.HINDI,
models.ElevenLabsLanguageCodesEnum.FRENCH,
models.ElevenLabsLanguageCodesEnum.KOREAN,
models.ElevenLabsLanguageCodesEnum.PORTUGUESE,
models.ElevenLabsLanguageCodesEnum.ITALIAN,
models.ElevenLabsLanguageCodesEnum.SPANISH,
models.ElevenLabsLanguageCodesEnum.INDONESIAN,
models.ElevenLabsLanguageCodesEnum.DUTCH,
models.ElevenLabsLanguageCodesEnum.TURKISH,
models.ElevenLabsLanguageCodesEnum.FILIPINO,
models.ElevenLabsLanguageCodesEnum.POLISH,
models.ElevenLabsLanguageCodesEnum.SWEDISH,
models.ElevenLabsLanguageCodesEnum.BULGARIAN,
models.ElevenLabsLanguageCodesEnum.ROMANIAN,
models.ElevenLabsLanguageCodesEnum.ARABIC,
models.ElevenLabsLanguageCodesEnum.CZECH,
models.ElevenLabsLanguageCodesEnum.GREEK,
models.ElevenLabsLanguageCodesEnum.FINNISH,
models.ElevenLabsLanguageCodesEnum.CROATIAN,
models.ElevenLabsLanguageCodesEnum.MALAY,
models.ElevenLabsLanguageCodesEnum.SLOVAK,
models.ElevenLabsLanguageCodesEnum.DANISH,
models.ElevenLabsLanguageCodesEnum.TAMIL,
models.ElevenLabsLanguageCodesEnum.UKRAINIAN,
],
),
ElevenLabsVoiceModel(
voice_id="eleven_multilingual_v2",
languages=[models.ElevenLabsLanguageCodesEnum.ENGLISH],
),
]
@classmethod
def from_api(cls, voice_models_from_api: list[dict[str, typing.Any]]) -> typing.Self:
voice_models = [ElevenLabsVoiceModel.model_validate(voice_model) for voice_model in voice_models_from_api]
return ElevenLabsListVoiceModelsModel(models=voice_models)

View File

@ -1,126 +1,60 @@
import enum
import typing
import lib.tts.models.voice.base as tts_models_voice_base
import pydantic
import lib.models as models
class YandexVoiceModelNamesString(enum.Enum):
ERMIL_NEUTRAL = "ermil neutral"
ERMIL_GOOD = "ermil good"
ALENA_NEUTRAL = "alena neutral"
ALENA_GOOD = "alena good"
JANE_NEUTRAL = "jane neutral"
JANE_GOOD = "jane good"
JANE_EVIL = "jane evil"
OMAZH_NEUTRAL = "omazh neutral"
OMAZH_EVIL = "omazh evil"
ZAHAR_NEUTRAL = "zahar neutral"
ZAHAR_GOOD = "zahar good"
FILIPP = "filipp"
MADIRUS = "madirus"
DASHA = "dasha"
JULIA = "julia"
LERA = "lera"
MARINA = "marina"
ALEXANDER = "alexander"
KIRILL = "kirill"
ANTON = "anton"
# English
JOHN = "john"
# Kazakh
AMIRA = "amira"
MADI = "madi"
# German
LEA = "lea"
# HEBREW
NAOMI_MODERN = "naomi modern"
NAOMI_CLASSIC = "naomi classic"
# Uzbek
NIGORA = "nigora"
class YandexVoiceModel(models.BaseVoiceModel):
voice_id: str
voice_name: str | None = None
languages: list[models.LANGUAGE_CODES_ENUM_TYPE]
company_name: str = "yandex"
role: str | None = None
@pydantic.model_validator(mode="before")
@classmethod
def check_voice_name_exists(cls, data: typing.Any) -> typing.Any:
voice_id = data.get("voice_id")
voice_name = data.get("voice_name")
role = data.get("role")
if not voice_name and voice_id:
data["voice_name"] = f"{voice_id} {role}" if role else voice_id
return data
class YandexVoiceModels(enum.Enum):
# Russian
ERMIL_NEUTRAL = tts_models_voice_base.VoiceModel(
voice_name="ermil", role="neutral", lang=tts_models_voice_base.LanguageCodes.RUSSIAN
)
ERMIL_GOOD = tts_models_voice_base.VoiceModel(
voice_name="ermil", role="good", lang=tts_models_voice_base.LanguageCodes.RUSSIAN
)
ALENA_NEUTRAL = tts_models_voice_base.VoiceModel(
voice_name="alena", role="neutral", lang=tts_models_voice_base.LanguageCodes.RUSSIAN
)
ALENA_GOOD = tts_models_voice_base.VoiceModel(
voice_name="alena", role="good", lang=tts_models_voice_base.LanguageCodes.RUSSIAN
)
JANE_NEUTRAL = tts_models_voice_base.VoiceModel(
voice_name="jane", role="neutral", lang=tts_models_voice_base.LanguageCodes.RUSSIAN
)
JANE_GOOD = tts_models_voice_base.VoiceModel(
voice_name="jane", role="good", lang=tts_models_voice_base.LanguageCodes.RUSSIAN
)
JANE_EVIL = tts_models_voice_base.VoiceModel(
voice_name="jane", role="evil", lang=tts_models_voice_base.LanguageCodes.RUSSIAN
)
OMAZH_NEUTRAL = tts_models_voice_base.VoiceModel(
voice_name="omazh", role="neutral", lang=tts_models_voice_base.LanguageCodes.RUSSIAN
)
OMAZH_EVIL = tts_models_voice_base.VoiceModel(
voice_name="omazh", role="evil", lang=tts_models_voice_base.LanguageCodes.RUSSIAN
)
ZAHAR_NEUTRAL = tts_models_voice_base.VoiceModel(
voice_name="zahar", role="neutral", lang=tts_models_voice_base.LanguageCodes.RUSSIAN
)
ZAHAR_GOOD = tts_models_voice_base.VoiceModel(
voice_name="zahar", role="good", lang=tts_models_voice_base.LanguageCodes.RUSSIAN
)
FILIPP = tts_models_voice_base.VoiceModel(
voice_name="filipp", role=None, lang=tts_models_voice_base.LanguageCodes.RUSSIAN
)
MADIRUS = tts_models_voice_base.VoiceModel(
voice_name="madirus", role=None, lang=tts_models_voice_base.LanguageCodes.RUSSIAN
)
DASHA = tts_models_voice_base.VoiceModel(
voice_name="dasha", role=None, lang=tts_models_voice_base.LanguageCodes.RUSSIAN
)
JULIA = tts_models_voice_base.VoiceModel(
voice_name="julia", role=None, lang=tts_models_voice_base.LanguageCodes.RUSSIAN
)
LERA = tts_models_voice_base.VoiceModel(
voice_name="lera", role=None, lang=tts_models_voice_base.LanguageCodes.RUSSIAN
)
MARINA = tts_models_voice_base.VoiceModel(
voice_name="marina", role=None, lang=tts_models_voice_base.LanguageCodes.RUSSIAN
)
ALEXANDER = tts_models_voice_base.VoiceModel(
voice_name="alexander", role=None, lang=tts_models_voice_base.LanguageCodes.RUSSIAN
)
KIRILL = tts_models_voice_base.VoiceModel(
voice_name="kirill", role=None, lang=tts_models_voice_base.LanguageCodes.RUSSIAN
)
ANTON = tts_models_voice_base.VoiceModel(
voice_name="anton", role=None, lang=tts_models_voice_base.LanguageCodes.RUSSIAN
)
# English
JOHN = tts_models_voice_base.VoiceModel(
voice_name="john", role=None, lang=tts_models_voice_base.LanguageCodes.ENGLISH
)
# Kazakh
AMIRA = tts_models_voice_base.VoiceModel(
voice_name="amira", role=None, lang=tts_models_voice_base.LanguageCodes.KAZAKH
)
MADI = tts_models_voice_base.VoiceModel(
voice_name="madi", role=None, lang=tts_models_voice_base.LanguageCodes.KAZAKH
)
# German
LEA = tts_models_voice_base.VoiceModel(voice_name="lea", role=None, lang=tts_models_voice_base.LanguageCodes.GERMAN)
# HEBREW
NAOMI_MODERN = tts_models_voice_base.VoiceModel(
voice_name="naomi", role="modern", lang=tts_models_voice_base.LanguageCodes.HEBREW
)
NAOMI_CLASSIC = tts_models_voice_base.VoiceModel(
voice_name="naomi", role="classic", lang=tts_models_voice_base.LanguageCodes.HEBREW
)
# Uzbek
NIGORA = tts_models_voice_base.VoiceModel(
voice_name="nigora", role=None, lang=tts_models_voice_base.LanguageCodes.UZBEK
)
class YandexListVoiceModelsModel(pydantic.BaseModel):
models: list[YandexVoiceModel] = [
YandexVoiceModel(voice_id="ermil", role="neutral", languages=[models.YandexLanguageCodesEnum.RUSSIAN]),
YandexVoiceModel(voice_id="ermil", role="good", languages=[models.YandexLanguageCodesEnum.RUSSIAN]),
YandexVoiceModel(voice_id="alena", role="neutral", languages=[models.YandexLanguageCodesEnum.RUSSIAN]),
YandexVoiceModel(voice_id="alena", role="good", languages=[models.YandexLanguageCodesEnum.RUSSIAN]),
YandexVoiceModel(voice_id="jane", role="neutral", languages=[models.YandexLanguageCodesEnum.RUSSIAN]),
YandexVoiceModel(voice_id="jane", role="good", languages=[models.YandexLanguageCodesEnum.RUSSIAN]),
YandexVoiceModel(voice_id="jane", role="evil", languages=[models.YandexLanguageCodesEnum.RUSSIAN]),
YandexVoiceModel(voice_id="omazh", role="neutral", languages=[models.YandexLanguageCodesEnum.RUSSIAN]),
YandexVoiceModel(voice_id="omazh", role="evil", languages=[models.YandexLanguageCodesEnum.RUSSIAN]),
YandexVoiceModel(voice_id="zahar", role="neutral", languages=[models.YandexLanguageCodesEnum.RUSSIAN]),
YandexVoiceModel(voice_id="zahar", role="good", languages=[models.YandexLanguageCodesEnum.RUSSIAN]),
YandexVoiceModel(voice_id="filipp", role=None, languages=[models.YandexLanguageCodesEnum.RUSSIAN]),
YandexVoiceModel(voice_id="madirus", role=None, languages=[models.YandexLanguageCodesEnum.RUSSIAN]),
YandexVoiceModel(voice_id="dasha", role=None, languages=[models.YandexLanguageCodesEnum.RUSSIAN]),
YandexVoiceModel(voice_id="julia", role=None, languages=[models.YandexLanguageCodesEnum.RUSSIAN]),
YandexVoiceModel(voice_id="lera", role=None, languages=[models.YandexLanguageCodesEnum.RUSSIAN]),
YandexVoiceModel(voice_id="marina", role=None, languages=[models.YandexLanguageCodesEnum.RUSSIAN]),
YandexVoiceModel(voice_id="alexander", role=None, languages=[models.YandexLanguageCodesEnum.RUSSIAN]),
YandexVoiceModel(voice_id="kirill", role=None, languages=[models.YandexLanguageCodesEnum.RUSSIAN]),
YandexVoiceModel(voice_id="anton", role=None, languages=[models.YandexLanguageCodesEnum.RUSSIAN]),
YandexVoiceModel(voice_id="john", role=None, languages=[models.YandexLanguageCodesEnum.ENGLISH]),
YandexVoiceModel(voice_id="amira", role=None, languages=[models.YandexLanguageCodesEnum.KAZAKH]),
YandexVoiceModel(voice_id="madi", role=None, languages=[models.YandexLanguageCodesEnum.KAZAKH]),
YandexVoiceModel(voice_id="lea", role=None, languages=[models.YandexLanguageCodesEnum.GERMAN]),
YandexVoiceModel(voice_id="naomi", role="modern", languages=[models.YandexLanguageCodesEnum.HEBREW]),
YandexVoiceModel(voice_id="naomi", role="classic", languages=[models.YandexLanguageCodesEnum.HEBREW]),
YandexVoiceModel(voice_id="nigora", role=None, languages=[models.YandexLanguageCodesEnum.UZBEK]),
]
@classmethod
def from_api(cls, voice_models_from_api: list[dict[str, typing.Any]]) -> typing.Self:
voice_models = [YandexVoiceModel.model_validate(voice_model) for voice_model in voice_models_from_api]
return YandexListVoiceModelsModel(models=voice_models)

View File

@ -0,0 +1,5 @@
from .base import *
__all__ = [
"TTSBaseRepository",
]