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 .orm import Base, IdCreatedUpdatedBaseMixin
from .token import Token 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 * from .voice import *
__all__ = [ __all__ = [
"LanguageCodes", "ElevenLabsListVoiceModelsModel",
"TTSRequestModel", "ElevenLabsVoiceModel",
"TTSResponseModel", "LIST_VOICE_MODELS_TYPE",
"VoiceModel", "LIST_VOICE_MODELS_TYPE",
"YandexVoiceModelNamesString", "TTSCreateRequestServiceModel",
"YandexVoiceModels", "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 * from .yandex import *
__all__ = [ __all__ = [
"LanguageCodes", "ElevenLabsListVoiceModelsModel",
"VoiceModel", "ElevenLabsVoiceModel",
"YandexVoiceModelNamesString", "YandexListVoiceModelsModel",
"YandexVoiceModels", "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): class YandexVoiceModel(models.BaseVoiceModel):
ERMIL_NEUTRAL = "ermil neutral" voice_id: str
ERMIL_GOOD = "ermil good" voice_name: str | None = None
ALENA_NEUTRAL = "alena neutral" languages: list[models.LANGUAGE_CODES_ENUM_TYPE]
ALENA_GOOD = "alena good" company_name: str = "yandex"
JANE_NEUTRAL = "jane neutral" role: str | None = None
JANE_GOOD = "jane good"
JANE_EVIL = "jane evil" @pydantic.model_validator(mode="before")
OMAZH_NEUTRAL = "omazh neutral" @classmethod
OMAZH_EVIL = "omazh evil" def check_voice_name_exists(cls, data: typing.Any) -> typing.Any:
ZAHAR_NEUTRAL = "zahar neutral" voice_id = data.get("voice_id")
ZAHAR_GOOD = "zahar good" voice_name = data.get("voice_name")
FILIPP = "filipp" role = data.get("role")
MADIRUS = "madirus" if not voice_name and voice_id:
DASHA = "dasha" data["voice_name"] = f"{voice_id} {role}" if role else voice_id
JULIA = "julia" return data
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 YandexVoiceModels(enum.Enum): class YandexListVoiceModelsModel(pydantic.BaseModel):
# Russian models: list[YandexVoiceModel] = [
ERMIL_NEUTRAL = tts_models_voice_base.VoiceModel( YandexVoiceModel(voice_id="ermil", role="neutral", languages=[models.YandexLanguageCodesEnum.RUSSIAN]),
voice_name="ermil", role="neutral", lang=tts_models_voice_base.LanguageCodes.RUSSIAN YandexVoiceModel(voice_id="ermil", role="good", languages=[models.YandexLanguageCodesEnum.RUSSIAN]),
) YandexVoiceModel(voice_id="alena", role="neutral", languages=[models.YandexLanguageCodesEnum.RUSSIAN]),
ERMIL_GOOD = tts_models_voice_base.VoiceModel( YandexVoiceModel(voice_id="alena", role="good", languages=[models.YandexLanguageCodesEnum.RUSSIAN]),
voice_name="ermil", role="good", lang=tts_models_voice_base.LanguageCodes.RUSSIAN YandexVoiceModel(voice_id="jane", role="neutral", languages=[models.YandexLanguageCodesEnum.RUSSIAN]),
) YandexVoiceModel(voice_id="jane", role="good", languages=[models.YandexLanguageCodesEnum.RUSSIAN]),
ALENA_NEUTRAL = tts_models_voice_base.VoiceModel( YandexVoiceModel(voice_id="jane", role="evil", languages=[models.YandexLanguageCodesEnum.RUSSIAN]),
voice_name="alena", role="neutral", lang=tts_models_voice_base.LanguageCodes.RUSSIAN YandexVoiceModel(voice_id="omazh", role="neutral", languages=[models.YandexLanguageCodesEnum.RUSSIAN]),
) YandexVoiceModel(voice_id="omazh", role="evil", languages=[models.YandexLanguageCodesEnum.RUSSIAN]),
ALENA_GOOD = tts_models_voice_base.VoiceModel( YandexVoiceModel(voice_id="zahar", role="neutral", languages=[models.YandexLanguageCodesEnum.RUSSIAN]),
voice_name="alena", role="good", lang=tts_models_voice_base.LanguageCodes.RUSSIAN YandexVoiceModel(voice_id="zahar", role="good", languages=[models.YandexLanguageCodesEnum.RUSSIAN]),
) YandexVoiceModel(voice_id="filipp", role=None, languages=[models.YandexLanguageCodesEnum.RUSSIAN]),
JANE_NEUTRAL = tts_models_voice_base.VoiceModel( YandexVoiceModel(voice_id="madirus", role=None, languages=[models.YandexLanguageCodesEnum.RUSSIAN]),
voice_name="jane", role="neutral", lang=tts_models_voice_base.LanguageCodes.RUSSIAN YandexVoiceModel(voice_id="dasha", role=None, languages=[models.YandexLanguageCodesEnum.RUSSIAN]),
) YandexVoiceModel(voice_id="julia", role=None, languages=[models.YandexLanguageCodesEnum.RUSSIAN]),
JANE_GOOD = tts_models_voice_base.VoiceModel( YandexVoiceModel(voice_id="lera", role=None, languages=[models.YandexLanguageCodesEnum.RUSSIAN]),
voice_name="jane", role="good", lang=tts_models_voice_base.LanguageCodes.RUSSIAN YandexVoiceModel(voice_id="marina", role=None, languages=[models.YandexLanguageCodesEnum.RUSSIAN]),
) YandexVoiceModel(voice_id="alexander", role=None, languages=[models.YandexLanguageCodesEnum.RUSSIAN]),
JANE_EVIL = tts_models_voice_base.VoiceModel( YandexVoiceModel(voice_id="kirill", role=None, languages=[models.YandexLanguageCodesEnum.RUSSIAN]),
voice_name="jane", role="evil", lang=tts_models_voice_base.LanguageCodes.RUSSIAN YandexVoiceModel(voice_id="anton", role=None, languages=[models.YandexLanguageCodesEnum.RUSSIAN]),
) YandexVoiceModel(voice_id="john", role=None, languages=[models.YandexLanguageCodesEnum.ENGLISH]),
OMAZH_NEUTRAL = tts_models_voice_base.VoiceModel( YandexVoiceModel(voice_id="amira", role=None, languages=[models.YandexLanguageCodesEnum.KAZAKH]),
voice_name="omazh", role="neutral", lang=tts_models_voice_base.LanguageCodes.RUSSIAN YandexVoiceModel(voice_id="madi", role=None, languages=[models.YandexLanguageCodesEnum.KAZAKH]),
) YandexVoiceModel(voice_id="lea", role=None, languages=[models.YandexLanguageCodesEnum.GERMAN]),
OMAZH_EVIL = tts_models_voice_base.VoiceModel( YandexVoiceModel(voice_id="naomi", role="modern", languages=[models.YandexLanguageCodesEnum.HEBREW]),
voice_name="omazh", role="evil", lang=tts_models_voice_base.LanguageCodes.RUSSIAN YandexVoiceModel(voice_id="naomi", role="classic", languages=[models.YandexLanguageCodesEnum.HEBREW]),
) YandexVoiceModel(voice_id="nigora", role=None, languages=[models.YandexLanguageCodesEnum.UZBEK]),
ZAHAR_NEUTRAL = tts_models_voice_base.VoiceModel( ]
voice_name="zahar", role="neutral", lang=tts_models_voice_base.LanguageCodes.RUSSIAN
) @classmethod
ZAHAR_GOOD = tts_models_voice_base.VoiceModel( def from_api(cls, voice_models_from_api: list[dict[str, typing.Any]]) -> typing.Self:
voice_name="zahar", role="good", lang=tts_models_voice_base.LanguageCodes.RUSSIAN voice_models = [YandexVoiceModel.model_validate(voice_model) for voice_model in voice_models_from_api]
) return YandexListVoiceModelsModel(models=voice_models)
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
)

View File

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