#!/usr/bin/env python
# -*- coding: utf-8 -*-

"""
Аудио
"""

# ######################################################################################################################
# Импорт необходимых инструментов
# ######################################################################################################################

import warnings

# Подавление Warning
for warn in [UserWarning, FutureWarning]:
    warnings.filterwarnings("ignore", category=warn)

from dataclasses import dataclass  # Класс данных

import os  # Взаимодействие с файловой системой
import requests  # Отправка HTTP запросов
import numpy as np  # Научные вычисления
import pandas as pd  # Обработка и анализ данных
import opensmile  # Анализ, обработка и классификация звука
import librosa  # Обработка аудио
import audioread  # Декодирование звука
import math
import gradio
import cv2

from urllib.parse import urlparse
from urllib.error import URLError
from pathlib import Path  # Работа с путями в файловой системе
from sklearn import preprocessing
from sklearn.metrics import mean_absolute_error
from datetime import datetime  # Работа со временем
import subprocess

from typing import Dict, List, Tuple, Union, Optional, Callable  # Типы данных

from IPython.display import clear_output

# Персональные
from oceanai.modules.lab.download import Download  # Загрузка файлов
from oceanai.modules.core.exceptions import IsSmallWindowSizeError

import torch
import torch.nn as nn

from oceanai.modules.lab.architectures.audio_architectures import audio_model_hc, audio_model_nn, audio_model_b5

# ######################################################################################################################
# Настройки необходимых инструментов
# ######################################################################################################################
pd.set_option("display.max_columns", None)  # Максимальное количество отображаемых столбцов
pd.set_option("display.max_rows", None)  # Максимальное количество отображаемых строк


# ######################################################################################################################
# Сообщения
# ######################################################################################################################
@dataclass
class AudioMessages(Download):
    """Класс для сообщений

    Args:
        lang (str): Смотреть :attr:`~oceanai.modules.core.language.Language.lang`
        color_simple (str): Смотреть :attr:`~oceanai.modules.core.settings.Settings.color_simple`
        color_info (str): Смотреть :attr:`~oceanai.modules.core.settings.Settings.color_info`
        color_err (str): Смотреть :attr:`~oceanai.modules.core.settings.Settings.color_err`
        color_true (str): Смотреть :attr:`~oceanai.modules.core.settings.Settings.color_true`
        bold_text (bool): Смотреть :attr:`~oceanai.modules.core.settings.Settings.bold_text`
        num_to_df_display (int): Смотреть :attr:`~oceanai.modules.core.settings.Settings.num_to_df_display`
        text_runtime (str): Смотреть :attr:`~oceanai.modules.core.settings.Settings.text_runtime`
    """

    # ------------------------------------------------------------------------------------------------------------------
    # Конструктор
    # ------------------------------------------------------------------------------------------------------------------

    def __post_init__(self):
        super().__post_init__()  # Выполнение конструктора из суперкласса

        self._audio_modality: str = self._(" (аудио модальность) ...")
        self._formation_audio_model_hc: str = self._formation_model_hc + self._audio_modality
        self._formation_audio_model_nn: str = self._formation_model_nn + self._audio_modality
        self._formation_audio_models_b5: str = self._formation_models_b5 + self._audio_modality

        self._load_audio_model_weights_hc: str = self._load_model_weights_hc + self._audio_modality
        self._load_audio_model_weights_nn: str = self._load_model_weights_nn + self._audio_modality
        self._load_audio_models_weights_b5: str = self._load_models_weights_b5 + self._audio_modality

        self._get_acoustic_feature_info: str = self._(
            "Извлечение признаков (экспертных и лог мел-спектрограмм) из " "акустического сигнала ..."
        )
        self._get_acoustic_feature_hc_error: str = self._oh + self._(
            "экспертные признаки из акустического сигнала не " "извлечены ..."
        )
        self._get_acoustic_feature_spec_error: str = self._oh + self._(
            "лог мел-спектрограммы из акустического сигнала " "не извлечены ..."
        )

        self._window_small_size_error: str = self._oh + self._(
            "указан слишком маленький размер ({}) окна сегмента " "сигнала ..."
        )

        self._model_audio_hc_not_formation: str = self._model_hc_not_formation + self._audio_modality
        self._model_audio_nn_not_formation: str = self._model_nn_not_formation + self._audio_modality
        self._models_audio_not_formation: str = self._models_not_formation + self._audio_modality

        self._concat_audio_pred_error: str = self._concat_pred_error + self._audio_modality
        self._norm_audio_pred_error: str = self._norm_pred_error + self._audio_modality


# ######################################################################################################################
# Аудио
# ######################################################################################################################
@dataclass
class Audio(AudioMessages):
    """Класс для обработки аудио

    Args:
        lang (str): Смотреть :attr:`~oceanai.modules.core.language.Language.lang`
        color_simple (str): Смотреть :attr:`~oceanai.modules.core.settings.Settings.color_simple`
        color_info (str): Смотреть :attr:`~oceanai.modules.core.settings.Settings.color_info`
        color_err (str): Смотреть :attr:`~oceanai.modules.core.settings.Settings.color_err`
        color_true (str): Смотреть :attr:`~oceanai.modules.core.settings.Settings.color_true`
        bold_text (bool): Смотреть :attr:`~oceanai.modules.core.settings.Settings.bold_text`
        num_to_df_display (int): Смотреть :attr:`~oceanai.modules.core.settings.Settings.num_to_df_display`
        text_runtime (str): Смотреть :attr:`~oceanai.modules.core.settings.Settings.text_runtime`
    """

    # ------------------------------------------------------------------------------------------------------------------
    # Конструктор
    # ------------------------------------------------------------------------------------------------------------------

    def __post_init__(self):
        super().__post_init__()  # Выполнение конструктора из суперкласса

        # Нейросетевая модель **nn.Module** для получения оценок по экспертным признакам
        self._audio_model_hc: Optional[nn.Module] = None
        # Нейросетевая модель **nn.Module** для получения оценок по нейросетевым признакам
        self._audio_model_nn: Optional[nn.Module] = None
        # Нейросетевые модели **nn.Module** для получения результатов оценки персональных качеств
        self._audio_models_b5: Dict[str, Optional[nn.Module]] = dict(zip(self._b5["en"], [None] * len(self._b5["en"])))

        self._smile: opensmile.core.smile.Smile = self.__smile()  # Извлечение функций OpenSmile

        # ----------------------- Только для внутреннего использования внутри класса

        # Настройки для спектрограммы
        self.__pl: List[Union[int, str, bool, float, None]] = [
            2048,
            512,
            None,
            True,
            "reflect",
            2.0,
            128,
            "slaney",
            True,
            None,
        ]
        self.__len_paths: int = 0  # Количество искомых файлов
        self.__local_path: Union[Callable[[str], str], None] = None  # Локальный путь

        # Ключи для точности
        self.__df_accuracy_index: List[str] = ["MAE", "Accuracy"]
        self.__df_accuracy_index_name: str = "Metrics"
        self.__df_accuracy_mean: str = "Mean"

    # ------------------------------------------------------------------------------------------------------------------
    # Свойства
    # ------------------------------------------------------------------------------------------------------------------

    @property
    def audio_model_hc_(self) -> Optional[nn.Module]:
        """Получение нейросетевой модели **nn.Module** для получения оценок по экспертным признакам

        Returns:
            Optional[nn.Module]: Нейросетевая модель **nn.Module** или None

        .. dropdown:: Примеры
            :class-body: sd-pr-5

            :bdg-success:`Верно` :bdg-light:`-- 1 --`

            .. code-cell:: python
                :execution-count: 1
                :linenos:
                :tab-width: 8

                from oceanai.modules.lab.audio import Audio

                audio = Audio()

                audio.load_audio_model_hc(
                    show_summary = False, out = True,
                    runtime = True, run = True
                )

                audio.audio_model_hc_

            .. output-cell::
                :execution-count: 1
                :linenos:

                [2024-10-06 22:49:58] Формирование нейросетевой архитектуры модели для получения оценок по экспертным признакам (аудио модальность) ...

                --- Время выполнения: 0.011 сек. ---

                audio_model_hc(
                    (lstm1): LSTM(25, 64, batch_first=True)
                    (dropout1): Dropout(p=0.2, inplace=False)
                    (lstm2): LSTM(64, 128, batch_first=True)
                    (dropout2): Dropout(p=0.2, inplace=False)
                    (fc): Linear(in_features=128, out_features=5, bias=True)
                )

            :bdg-danger:`Ошибка` :bdg-light:`-- 1 --`

            .. code-cell:: python
                :execution-count: 2
                :linenos:
                :tab-width: 8

                from oceanai.modules.lab.audio import Audio

                audio = Audio()

                audio.audio_model_hc_

            .. output-cell::
                :execution-count: 2
                :linenos:


        """

        return self._audio_model_hc

    @property
    def audio_model_nn_(self) -> Optional[nn.Module]:
        """Получение нейросетевой модели **nn.Module** для получения оценок по нейросетевым признакам

        Returns:
            Optional[nn.Module]: Нейросетевая модель **nn.Module** или None

        .. dropdown:: Примеры
            :class-body: sd-pr-5

            :bdg-success:`Верно` :bdg-light:`-- 1 --`

            .. code-cell:: python
                :execution-count: 1
                :linenos:
                :tab-width: 8

                from oceanai.modules.lab.audio import Audio

                audio = Audio()

                audio.load_audio_model_nn(
                    show_summary = False, out = True,
                    runtime = True, run = True
                )

                audio.audio_model_nn_

            .. output-cell::
                :execution-count: 1
                :linenos:

                [2024-10-06 22:57:46] Формирование нейросетевой архитектуры для получения оценок по нейросетевым признакам (аудио модальность) ...

                --- Время выполнения: 1.59 сек. ---

                audio_model_nn(
                (vgg): VGG(
                    (features): Sequential(
                    (0): Conv2d(3, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
                    (1): ReLU(inplace=True)
                    (2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
                    (3): ReLU(inplace=True)
                    (4): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
                    (5): Conv2d(64, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
                    (6): ReLU(inplace=True)
                    (7): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
                    (8): ReLU(inplace=True)
                    (9): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
                    (10): Conv2d(128, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
                    (11): ReLU(inplace=True)
                    (12): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
                    (13): ReLU(inplace=True)
                    (14): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
                    (15): ReLU(inplace=True)
                    (16): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
                    (17): Conv2d(256, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
                    (18): ReLU(inplace=True)
                    (19): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
                    (20): ReLU(inplace=True)
                    (21): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
                    (22): ReLU(inplace=True)
                    (23): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
                    (24): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
                    (25): ReLU(inplace=True)
                    (26): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
                    (27): ReLU(inplace=True)
                    (28): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
                    (29): ReLU(inplace=True)
                    (30): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
                    )
                    (avgpool): AdaptiveAvgPool2d(output_size=(7, 7))
                    (classifier): Identity()
                )
                (flatten): Flatten(start_dim=1, end_dim=-1)
                (fc1): Linear(in_features=25088, out_features=512, bias=True)
                (relu): ReLU()
                (dropout): Dropout(p=0.5, inplace=False)
                (fc2): Linear(in_features=512, out_features=256, bias=True)
                (fc3): Linear(in_features=256, out_features=5, bias=True)
                )

            :bdg-danger:`Ошибка` :bdg-light:`-- 1 --`

            .. code-cell:: python
                :execution-count: 2
                :linenos:
                :tab-width: 8

                from oceanai.modules.lab.audio import Audio

                audio = Audio()

                audio.audio_model_nn_

            .. output-cell::
                :execution-count: 2
                :linenos:


        """

        return self._audio_model_nn

    @property
    def audio_models_b5_(self) -> Dict[str, Optional[nn.Module]]:
        """Получение нейросетевых моделей **nn.Module** для получения результатов оценки персональных качеств

        Returns:
            Dict: Словарь с нейросетевыми моделями **nn.Module**

        .. dropdown:: Примеры
            :class-body: sd-pr-5

            :bdg-success:`Верно` :bdg-light:`-- 1 --`

            .. code-cell:: python
                :execution-count: 1
                :linenos:
                :tab-width: 8

                from oceanai.modules.lab.audio import Audio

                audio = Audio()

                audio.load_audio_models_b5(
                    show_summary = False, out = True,
                    runtime = True, run = True
                )

                audio.audio_models_b5_

            .. output-cell::
                :execution-count: 1
                :linenos:

                [2024-10-06 22:58:27] Формирование нейросетевых архитектур моделей для получения результатов оценки персональных качеств (аудио модальность) ...

                --- Время выполнения: 0.002 сек. ---

                {'openness': audio_model_b5(
                    (fc): Linear(in_features=32, out_features=1, bias=True)
                    (sigmoid): Sigmoid()
                ),
                'conscientiousness': audio_model_b5(
                    (fc): Linear(in_features=32, out_features=1, bias=True)
                    (sigmoid): Sigmoid()
                ),
                'extraversion': audio_model_b5(
                    (fc): Linear(in_features=32, out_features=1, bias=True)
                    (sigmoid): Sigmoid()
                ),
                'agreeableness': audio_model_b5(
                    (fc): Linear(in_features=32, out_features=1, bias=True)
                    (sigmoid): Sigmoid()
                ),
                'non-neuroticism': audio_model_b5(
                    (fc): Linear(in_features=32, out_features=1, bias=True)
                    (sigmoid): Sigmoid()
                )}

            :bdg-danger:`Ошибка` :bdg-light:`-- 1 --`

            .. code-cell:: python
                :execution-count: 2
                :linenos:
                :tab-width: 8

                from oceanai.modules.lab.audio import Audio

                audio = Audio()

                audio.audio_models_b5_

            .. output-cell::
                :execution-count: 2
                :linenos:
                :tab-width: 8

                {
                    'openness': None,
                    'conscientiousness': None,
                    'extraversion': None,
                    'agreeableness': None,
                    'non_neuroticism': None
                }
        """

        return self._audio_models_b5

    @property
    def smile_(self) -> opensmile.core.smile.Smile:
        """Получение функций OpenSmile

        Returns:
            opensmile.core.smile.Smile: Извлеченные функции OpenSmile

        .. dropdown:: Пример
            :class-body: sd-pr-5

            :bdg-success:`Верно` :bdg-light:`-- 1 --`

            .. code-cell:: python
                :execution-count: 1
                :linenos:
                :tab-width: 8

                from oceanai.modules.lab.audio import Audio

                audio = Audio()
                audio.smile_

            .. output-cell::
                :execution-count: 1
                :linenos:
                :tab-width: 8

                {
                    '$opensmile.core.smile.Smile': {
                        'feature_set': 'eGeMAPSv02',
                        'feature_level': 'LowLevelDescriptors',
                        'options': {},
                        'sampling_rate': None,
                        'channels': [0],
                        'mixdown': False,
                        'resample': False
                    }
                }
        """

        return self._smile

    # ------------------------------------------------------------------------------------------------------------------
    # Внутренние методы (приватные)
    # ------------------------------------------------------------------------------------------------------------------

    def __load_model_weights(
        self,
        url: str,
        force_reload: bool = True,
        info_text: str = "",
        out: bool = True,
        runtime: bool = True,
        run: bool = True,
    ) -> bool:
        """Загрузка весов нейросетевой модели

        .. note::
            private (приватный метод)

        Args:
            url (str): Полный путь к файлу с весами нейросетевой модели
            force_reload (bool): Принудительная загрузка файла с весами нейросетевой модели из сети
            info_text (str): Текст для информационного сообщения
            out (bool): Отображение
            runtime (bool): Подсчет времени выполнения
            run (bool): Блокировка выполнения

        Returns:
            bool: **True** если веса нейросетевой модели загружены, в обратном случае **False**

        .. dropdown:: Примеры
            :class-body: sd-pr-5

            :bdg-success:`Верно` :bdg-light:`-- 1 --`

            .. code-cell:: python
                :execution-count: 1
                :linenos:
                :tab-width: 8

                from oceanai.modules.lab.audio import Audio

                audio = Audio()

                audio.path_to_save_ = './models'
                audio.chunk_size_ = 2000000

                audio._Audio__load_model_weights(
                    url = 'https://download.sberdisk.ru/download/file/400635799?token=MMRrak8fMsyzxLE&filename=weights_2022-05-05_11-27-55.h5',
                    force_reload = True,
                    info_text = 'Загрузка весов нейросетевой модели',
                    out = True, runtime = True, run = True
                )

            .. output-cell::
                :execution-count: 1
                :linenos:

                [2022-10-17 12:21:48] Загрузка весов нейросетевой модели

                [2022-10-17 12:21:48] Загрузка файла "weights_2022-05-05_11-27-55.h5" (100.0%) ...

                --- Время выполнения: 0.439 сек. ---

                True

            :bdg-light:`-- 2 --`

            .. code-cell:: python
                :execution-count: 2
                :linenos:
                :tab-width: 8

                from oceanai.modules.lab.audio import Audio

                audio = Audio()

                audio.path_to_save_ = './models'
                audio.chunk_size_ = 2000000

                audio._Audio__load_model_weights(
                    url = './models/weights_2022-05-05_11-27-55.h5',
                    force_reload = True,
                    info_text = 'Загрузка весов нейросетевой модели',
                    out = True, runtime = True, run = True
                )

            .. output-cell::
                :execution-count: 2
                :linenos:

                [2022-10-17 12:21:50] Загрузка весов нейросетевой модели

                --- Время выполнения: 0.002 сек. ---

                True

            :bdg-danger:`Ошибка` :bdg-light:`-- 1 --`

            .. code-cell:: python
                :execution-count: 3
                :linenos:
                :tab-width: 8

                from oceanai.modules.lab.audio import Audio

                audio = Audio()

                audio.path_to_save_ = './models'
                audio.chunk_size_ = 2000000

                audio._Audio__load_model_weights(
                    url = 'https://download.sberdisk.ru/download/file/400635799?token=MMRrak8fMsyzxLE&filename=weights_2022-05-05_11-27-55.h5',
                    force_reload = True, info_text = '',
                    out = True, runtime = True, run = True
                )

            .. output-cell::
                :execution-count: 3
                :linenos:

                [2022-10-17 12:21:57] Неверные типы или значения аргументов в "Audio.__load_model_weights" ...

                False
        """

        self._clear_notebook_history_output()  # Очистка истории вывода сообщений в ячейке Jupyter

        try:
            # Проверка аргументов
            if (
                type(url) is not str
                or not url
                or type(force_reload) is not bool
                or type(info_text) is not str
                or not info_text
                or type(out) is not bool
                or type(runtime) is not bool
                or type(run) is not bool
            ):
                raise TypeError
        except TypeError:
            self._inv_args(__class__.__name__, self.__load_model_weights.__name__, out=out)
            return False
        else:
            # Блокировка выполнения
            if run is False:
                self._error(self._lock_user, out=out)
                return False

            if runtime:
                self._r_start()

            # Информационное сообщение
            self._info(info_text, last=False, out=out)

            sections = urlparse(url)  # Парсинг URL адреса

            try:
                # URL файл невалидный
                if sections.scheme == "":
                    raise requests.exceptions.InvalidURL
            except requests.exceptions.InvalidURL:
                url = os.path.normpath(url)

                try:
                    if os.path.isfile(url) is False:
                        raise FileNotFoundError  # Не файл
                except FileNotFoundError:
                    self._other_error(self._load_model_weights_error, out=out)
                    return False
                except Exception:
                    self._other_error(self._unknown_err, out=out)
                    return False
                else:
                    self._url_last_filename = url
                    return True
            else:
                try:
                    if force_reload is False:
                        clear_output(True)
                    # Загрузка файла из URL
                    res_download_file_from_url = self._download_file_from_url(
                        url=url, force_reload=force_reload, runtime=False, out=out, run=True
                    )
                except Exception:
                    self._other_error(self._unknown_err, out=out)
                    return False
                else:
                    # Файл загружен
                    if res_download_file_from_url != 200:
                        return False

                    return True
            finally:
                if runtime:
                    self._r_end(out=out)

    @staticmethod
    def __smile() -> opensmile.core.smile.Smile:
        """Извлечение функций OpenSmile

        .. note::
            private (приватный метод)

        Returns:
            opensmile.core.smile.Smile: Извлеченные функции OpenSmile

        .. dropdown:: Пример
            :class-body: sd-pr-5

            :bdg-success:`Верно` :bdg-light:`-- 1 --`

            .. code-cell:: python
                :execution-count: 1
                :linenos:
                :tab-width: 8

                from oceanai.modules.lab.audio import Audio

                audio = Audio()
                audio._Audio__smile()

            .. output-cell::
                :execution-count: 1
                :linenos:
                :tab-width: 8

                {
                    '$opensmile.core.smile.Smile': {
                        'feature_set': 'eGeMAPSv02',
                        'feature_level': 'LowLevelDescriptors',
                        'options': {},
                        'sampling_rate': None,
                        'channels': [0],
                        'mixdown': False,
                        'resample': False
                    }
                }
        """

        return opensmile.Smile(
            feature_set=opensmile.FeatureSet.eGeMAPSv02,
            feature_level=opensmile.FeatureLevel.LowLevelDescriptors,
        )

    def __norm_pred(self, pred_data: np.ndarray, len_spec: int = 16, out: bool = True) -> np.ndarray:
        """Нормализация оценок по экспертным и нейросетевым признакам

        .. note::
            private (приватный метод)

        Args:
            pred_data (np.ndarray): Оценки
            len_spec (int): Максимальный размер вектора оценок
            out (bool): Отображение

        Returns:
            np.ndarray: Нормализованные оценки по экспертным и нейросетевым признакам

        .. dropdown:: Примеры
            :class-body: sd-pr-5

            :bdg-success:`Верно` :bdg-light:`-- 1 --`

            .. code-cell:: python
                :execution-count: 1
                :linenos:
                :tab-width: 8

                import numpy as np
                from oceanai.modules.lab.audio import Audio

                audio = Audio()

                arr = np.array([
                    [0.64113516, 0.6217892, 0.54451424, 0.6144415, 0.59334993],
                    [0.6652424, 0.63606125, 0.572305, 0.63169795, 0.612515]
                ])

                audio._Audio__norm_pred(
                    pred_data = arr,
                    len_spec = 4,
                    out = True
                )

            .. output-cell::
                :execution-count: 1
                :linenos:
                :tab-width: 8

                array([
                    [0.64113516, 0.6217892 , 0.54451424, 0.6144415 , 0.59334993],
                    [0.6652424 , 0.63606125, 0.572305  , 0.63169795, 0.612515],
                    [0.65318878, 0.62892523, 0.55840962, 0.62306972, 0.60293247],
                    [0.65318878, 0.62892523, 0.55840962, 0.62306972, 0.60293247]
                ])

            :bdg-danger:`Ошибка` :bdg-light:`-- 1 --`

            .. code-cell:: python
                :execution-count: 2
                :linenos:
                :tab-width: 8

                import numpy as np
                from oceanai.modules.lab.audio import Audio

                audio = Audio()

                arr = np.array([])

                audio._Audio__norm_pred(
                    pred_data = arr,
                    len_spec = 4,
                    out = True
                )

            .. output-cell::
                :execution-count: 3
                :linenos:

                [2022-10-20 22:03:17] Неверные типы или значения аргументов в "Audio.__norm_pred" ...

                array([], dtype=float64)
        """

        try:
            # Проверка аргументов
            if (
                type(pred_data) is not np.ndarray
                or len(pred_data) < 1
                or type(len_spec) is not int
                or len_spec < 1
                or type(out) is not bool
            ):
                raise TypeError
        except TypeError:
            self._inv_args(__class__.__name__, self.__norm_pred.__name__, out=out)
            return np.array([])
        else:
            try:
                if pred_data.shape[0] < len_spec:
                    return np.pad(pred_data, ((0, len_spec - pred_data.shape[0]), (0, 0)), "mean")
                return pred_data[:len_spec]
            except ValueError:
                self._other_error(self._norm_audio_pred_error, last=False, out=out)
                return np.array([])
            except Exception:
                self._other_error(self._unknown_err, out=out)
                return np.array([])

    def __concat_pred(
        self, pred_hc: np.ndarray, pred_melspectrogram: np.ndarray, out: bool = True
    ) -> List[Optional[np.ndarray]]:
        """Конкатенация оценок по экспертным и нейросетевым признакам

        .. note::
            private (приватный метод)

        Args:
            pred_hc (np.ndarray): Оценки по экспертным признакам
            pred_melspectrogram (np.ndarray): Оценки по нейросетевым признакам
            out (bool): Отображение

        Returns:
            List[Optional[np.ndarray]]: Конкатенированные оценки по экспертным и нейросетевым признакам

        .. dropdown:: Примеры
            :class-body: sd-pr-5

            :bdg-success:`Верно` :bdg-light:`-- 1 --`

            .. code-cell:: python
                :execution-count: 1
                :linenos:
                :tab-width: 8

                import numpy as np
                from oceanai.modules.lab.audio import Audio

                audio = Audio()

                arr_hc = np.array([
                    [0.64113516, 0.6217892, 0.54451424, 0.6144415, 0.59334993],
                    [0.6652424, 0.63606125, 0.572305, 0.63169795, 0.612515]
                ])

                arr_melspectrogram = np.array([
                    [0.56030345, 0.7488746, 0.44648764, 0.59893465, 0.5701077],
                    [0.5900006, 0.7652722, 0.4795154, 0.6409055, 0.6088242]
                ])

                audio._Audio__concat_pred(
                    pred_hc = arr_hc,
                    pred_melspectrogram = arr_melspectrogram,
                    out = True
                )

            .. output-cell::
                :execution-count: 1
                :linenos:
                :tab-width: 12

                [
                    array([
                        0.64113516, 0.6652424, 0.65318878, 0.65318878, 0.65318878,
                        0.65318878, 0.65318878, 0.65318878, 0.65318878, 0.65318878,
                        0.65318878, 0.65318878, 0.65318878, 0.65318878, 0.65318878,
                        0.65318878, 0.56030345, 0.5900006, 0.57515202, 0.57515202,
                        0.57515202, 0.57515202, 0.57515202, 0.57515202, 0.57515202,
                        0.57515202, 0.57515202, 0.57515202, 0.57515202, 0.57515202,
                        0.57515202, 0.57515202
                    ]),
                    array([
                        0.6217892, 0.63606125, 0.62892523, 0.62892523, 0.62892523,
                        0.62892523, 0.62892523, 0.62892523, 0.62892523, 0.62892523,
                        0.62892523, 0.62892523, 0.62892523, 0.62892523, 0.62892523,
                        0.62892523, 0.7488746, 0.7652722, 0.7570734, 0.7570734,
                        0.7570734, 0.7570734, 0.7570734, 0.7570734, 0.7570734,
                        0.7570734, 0.7570734, 0.7570734, 0.7570734, 0.7570734,
                        0.7570734, 0.7570734
                    ]),
                    array([
                        0.54451424, 0.572305, 0.55840962, 0.55840962, 0.55840962,
                        0.55840962, 0.55840962, 0.55840962, 0.55840962, 0.55840962,
                        0.55840962, 0.55840962, 0.55840962, 0.55840962, 0.55840962,
                        0.55840962, 0.44648764, 0.4795154, 0.46300152, 0.46300152,
                        0.46300152, 0.46300152, 0.46300152, 0.46300152, 0.46300152,
                        0.46300152, 0.46300152, 0.46300152, 0.46300152, 0.46300152,
                        0.46300152, 0.46300152
                    ]),
                    array([
                        0.6144415, 0.63169795, 0.62306972, 0.62306972, 0.62306972,
                        0.62306972, 0.62306972, 0.62306972, 0.62306972, 0.62306972,
                        0.62306972, 0.62306972, 0.62306972, 0.62306972, 0.62306972,
                        0.62306972, 0.59893465, 0.6409055, 0.61992008, 0.61992008,
                        0.61992008, 0.61992008, 0.61992008, 0.61992008, 0.61992008,
                        0.61992008, 0.61992008, 0.61992008, 0.61992008, 0.61992008,
                        0.61992008, 0.61992008
                    ]),
                    array([
                        0.59334993, 0.612515, 0.60293247, 0.60293247, 0.60293247,
                        0.60293247, 0.60293247, 0.60293247, 0.60293247, 0.60293247,
                        0.60293247, 0.60293247, 0.60293247, 0.60293247, 0.60293247,
                        0.60293247, 0.5701077, 0.6088242, 0.58946595, 0.58946595,
                        0.58946595, 0.58946595, 0.58946595, 0.58946595, 0.58946595,
                        0.58946595, 0.58946595, 0.58946595, 0.58946595, 0.58946595,
                        0.58946595, 0.58946595
                    ])
                ]

            :bdg-danger:`Ошибка` :bdg-light:`-- 1 --`

            .. code-cell:: python
                :execution-count: 2
                :linenos:
                :tab-width: 8

                import numpy as np
                from oceanai.modules.lab.audio import Audio

                audio = Audio()

                arr_hc = np.array([
                    [0.64113516, 0.6217892, 0.54451424, 0.6144415],
                    [0.6652424, 0.63606125, 0.572305, 0.63169795, 0.612515]
                ])

                arr_melspectrogram = np.array([
                    [0.56030345, 0.7488746, 0.44648764, 0.59893465, 0.5701077],
                    [0.5900006, 0.7652722, 0.4795154, 0.6409055, 0.6088242]
                ])

                audio._Audio__concat_pred(
                    pred_hc = arr_hc,
                    pred_melspectrogram = arr_melspectrogram,
                    out = True
                )

            .. output-cell::
                :execution-count: 3
                :linenos:

                [2022-10-20 22:33:31] Что-то пошло не так ... конкатенация оценок по экспертным и нейросетевым
                признакам не произведена (аудио модальность) ...

                []
        """

        try:
            # Проверка аргументов
            if (
                type(pred_hc) is not np.ndarray
                or len(pred_hc) < 1
                or type(pred_melspectrogram) is not np.ndarray
                or len(pred_melspectrogram) < 1
                or type(out) is not bool
            ):
                raise TypeError
        except TypeError:
            self._inv_args(__class__.__name__, self.__concat_pred.__name__, out=out)
            return []
        else:
            # Нормализация оценок по экспертным и нейросетевым признакам
            pred_hc_norm = self.__norm_pred(pred_hc, out=False)
            pred_melspectrogram_norm = self.__norm_pred(pred_melspectrogram, out=False)

            if len(pred_hc_norm) == 0 or len(pred_melspectrogram_norm) == 0:
                self._error(self._concat_audio_pred_error, out=out)
                return []

            concat = []

            try:
                # Проход по всем персональным качествам личности человека
                for i in range(len(self._b5["en"])):
                    concat.append(
                        np.hstack((np.asarray(pred_hc_norm)[:, i], np.asarray(pred_melspectrogram_norm)[:, i]))
                    )
            except IndexError:
                self._other_error(self._concat_audio_pred_error, last=False, out=out)
                return []
            except Exception:
                self._other_error(self._unknown_err, out=out)
                return []

            return concat

    def __load_audio_model_b5(self, show_summary: bool = False, out: bool = True) -> Optional[nn.Module]:
        """Формирование нейросетевой архитектуры модели для получения результата оценки персонального качества

        .. note::
            private (приватный метод)

        Args:
            show_summary (bool): Отображение сформированной нейросетевой архитектуры модели
            out (bool): Отображение

        Returns:
            Optional[nn.Module]:
                **None** если неверные типы или значения аргументов, в обратном случае нейросетевая модель
                **nn.Module** для получения результата оценки персонального качества

        .. dropdown:: Примеры
            :class-body: sd-pr-5

            :bdg-success:`Верно` :bdg-light:`-- 1 --`

            .. code-cell:: python
                :execution-count: 1
                :linenos:
                :tab-width: 8

                from oceanai.modules.lab.audio import Audio

                audio = Audio()

                audio._Audio__load_audio_model_b5(
                    show_summary = True, out = True
                )

            .. output-cell::
                :execution-count: 1
                :linenos:

                audio_model_b5(
                    (fc): Linear(in_features=32, out_features=1, bias=True)
                    (sigmoid): Sigmoid()
                )
                audio_model_b5(
                    (fc): Linear(in_features=32, out_features=1, bias=True)
                    (sigmoid): Sigmoid()
                )

            :bdg-danger:`Ошибка` :bdg-light:`-- 1 --`

            .. code-cell:: python
                :execution-count: 2
                :linenos:
                :tab-width: 8

                from oceanai.modules.lab.audio import Audio

                audio = Audio()

                audio._Audio__load_audio_model_b5(
                    show_summary = True, out = []
                )

            .. output-cell::
                :execution-count: 3
                :linenos:

                [2022-10-17 10:53:03] Неверные типы или значения аргументов в "Audio.__load_audio_model_b5" ...
        """

        try:
            # Проверка аргументов
            if type(show_summary) is not bool or type(out) is not bool:
                raise TypeError
        except TypeError:
            self._inv_args(__class__.__name__, self.__load_audio_model_b5.__name__, out=out)
            return None
        else:
            model = audio_model_b5()

            if show_summary and out:
                print(model)

            return model

    # ------------------------------------------------------------------------------------------------------------------
    # Внутренние методы (защищенные)
    # ------------------------------------------------------------------------------------------------------------------

    def _get_acoustic_features(
        self,
        path: str,
        sr: int = 44100,
        window: Union[int, float] = 2.0,
        step: Union[int, float] = 1.0,
        last: bool = False,
        out: bool = True,
        runtime: bool = True,
        run: bool = True,
    ) -> Tuple[List[Optional[np.ndarray]], List[Optional[np.ndarray]]]:
        """Извлечение признаков из акустического сигнала (без очистки истории вывода сообщений в ячейке Jupyter)

        .. note::
            protected (защищенный метод)

        Args:
            path (str): Путь к аудио или видеофайлу
            sr (int): Частота дискретизации
            window (Union[int, float]): Размер окна сегмента сигнала (в секундах)
            step (Union[int, float]): Шаг сдвига окна сегмента сигнала (в секундах)
            last (bool): Замена последнего сообщения
            out (bool): Отображение
            runtime (bool): Подсчет времени выполнения
            run (bool): Блокировка выполнения

        Returns:
            Tuple[List[Optional[np.ndarray]], List[Optional[np.ndarray]]]: Кортеж с двумя списками:

                1. Список с экспертными признаками
                2. Список с лог мел-спектрограммами

        .. dropdown:: Примеры
            :class-body: sd-pr-5

            :bdg-success:`Верно` :bdg-light:`-- 1 --`

            .. code-cell:: python
                :execution-count: 1
                :linenos:
                :tab-width: 8

                from oceanai.modules.lab.audio import Audio

                audio = Audio()

                sr = 44100
                path = '/Users/dl/GitHub/oceanai/oceanai/dataset/test80_01/glgfB3vFewc.004.mp4'

                hc_features, melspectrogram_features = audio._get_acoustic_features(
                    path = path, sr = sr,
                    window = 2, step = 1,
                    last = False, out = True,
                    runtime = True, run = True
                )

            .. output-cell::
                :execution-count: 1
                :linenos:

                [2022-10-19 14:58:19] Извлечение признаков (экспертных и лог мел-спектрограмм) из акустического сигнала ...

                [2022-10-19 14:58:20] Статистика извлеченных признаков из акустического сигнала:
                    Общее количество сегментов с:
                        1. экспертными признаками: 12
                        2. лог мел-спектрограммами: 12
                    Размерность матрицы экспертных признаков одного сегмента: 196 ✕ 25
                    Размерность тензора с лог мел-спектрограммами одного сегмента: 224 ✕ 224 ✕ 3

                --- Время выполнения: 1.273 сек. ---

            :bdg-danger:`Ошибки` :bdg-light:`-- 1 --`

            .. code-cell:: python
                :execution-count: 2
                :linenos:
                :tab-width: 8

                from oceanai.modules.lab.audio import Audio

                audio = Audio()

                sr = 44100
                path = '/Users/dl/GitHub/oceanai/oceanai/dataset/test80_01/glgfB3vFewc.004.mp4'

                hc_features, melspectrogram_features = audio._get_acoustic_features(
                    path = 1, sr = sr,
                    window = 2, step = 1,
                    last = False, out = True,
                    runtime = True, run = True
                )

            .. output-cell::
                :execution-count: 2
                :linenos:

                [2022-10-19 15:33:04] Неверные типы или значения аргументов в "Audio._get_acoustic_features" ...

            :bdg-light:`-- 2 --`

            .. code-cell:: python
                :execution-count: 2
                :linenos:
                :tab-width: 8

                from oceanai.modules.lab.audio import Audio

                audio = Audio()

                sr = 44100
                path = '/Users/dl/GitHub/oceanai/oceanai/dataset/test80_01/glgfB3vFewc.004.mp4'

                hc_features, melspectrogram_features = audio._get_acoustic_features(
                    path = path, sr = sr,
                    window = 0.04, step = 1,
                    last = False, out = True,
                    runtime = True, run = True
                )

            .. output-cell::
                :execution-count: 2
                :linenos:

                [2022-10-19 15:34:38] Извлечение признаков (экспертных и лог мел-спектрограмм) из акустического сигнала ...

                [2022-10-19 15:34:38] Что-то пошло не так ... указан слишком маленький размер (0.04) окна сегмента сигнала ...

                    Файл: /Users/dl/GitHub/oceanai/oceanai/modules/lab/audio.py
                    Линия: 863
                    Метод: _get_acoustic_features
                    Тип ошибки: IsSmallWindowSizeError

                --- Время выполнения: 0.049 сек. ---
        """

        try:
            # Проверка аргументов
            if (
                (type(path) is not str or not path)
                and (type(path) is not gradio.utils.NamedString)
                or type(sr) is not int
                or sr < 1
                or ((type(window) is not int or window < 1) and (type(window) is not float or window <= 0))
                or ((type(step) is not int or step < 1) and (type(step) is not float or step <= 0))
                or type(last) is not bool
                or type(out) is not bool
                or type(runtime) is not bool
                or type(run) is not bool
            ):
                raise TypeError
        except TypeError:
            self._inv_args(__class__.__name__, self._get_acoustic_features.__name__, last=last, out=out)
            return [], []
        else:
            # Блокировка выполнения
            if run is False:
                self._error(self._lock_user, last=last, out=out)
                return [], []

            if runtime:
                self._r_start()

            if last is False:
                # Информационное сообщение
                self._info(self._get_acoustic_feature_info, out=False)
                if out:
                    self.show_notebook_history_output()  # Отображение истории вывода сообщений в ячейке Jupyter

            try:
                # Считывание аудио или видеофайла
                path_to_wav = os.path.join(str(Path(path).parent), Path(path).stem + "." + "wav")

                if not Path(path_to_wav).is_file():
                    if Path(path).suffix not in ["mp3", "wav"]:
                        ff_audio = "ffmpeg -loglevel quiet -i {} -vn -acodec pcm_s16le -ar 44100 -ac 2 {}".format(
                            path, path_to_wav
                        )
                        call_audio = subprocess.call(ff_audio, shell=True)

                        try:
                            if call_audio == 1:
                                raise OSError
                        except OSError:
                            self._other_error(self._unknown_err, last=last, out=out)
                            return np.empty([]), np.empty([])
                        except Exception:
                            self._other_error(self._unknown_err, last=last, out=out)
                            return np.empty([]), np.empty([])
                        else:
                            audio, sr = librosa.load(path=path_to_wav, sr=sr)
                else:
                    audio, sr = librosa.load(path=path_to_wav, sr=sr)
            except FileNotFoundError:
                self._other_error(self._file_not_found.format(self._info_wrapper(path)), last=last, out=out)
                return [], []
            except IsADirectoryError:
                self._other_error(self._directory_inst_file.format(self._info_wrapper(path)), last=last, out=out)
                return [], []
            except audioread.NoBackendError:
                self._other_error(self._no_acoustic_signal.format(self._info_wrapper(path)), last=last, out=out)
                return [], []
            except Exception:
                self._other_error(self._unknown_err, last=last, out=out)
                return [], []
            else:
                hc_features = []  # Список с экспертными признаками
                melspectrogram_features = []  # Список с лог мел-спектрограммами

                try:
                    lhcf = int((window * 1000 - 40) / 10)

                    if lhcf < 2:
                        raise IsSmallWindowSizeError
                except IsSmallWindowSizeError:
                    self._other_error(
                        self._window_small_size_error.format(self._info_wrapper(str(window))), last=last, out=out
                    )
                    return [], []
                except Exception:
                    self._other_error(self._unknown_err, last=last, out=out)
                    return [], []
                else:
                    window_local = int(sr * window)

                    len_spec = window_local / self.__pl[1]
                    if math.modf(len_spec)[0] == 0:
                        len_spec += 1
                    len_spec = math.ceil(len_spec)

                    for cnt, val in enumerate(range(0, audio.shape[0] + 1, int(sr * step))):
                        val_end = val + window_local

                        curr_audio = audio[val:val_end]  # Часть аудио

                        # Формирование экспертных признаков
                        hc_feature = self.smile_.process_signal(curr_audio, sr).to_numpy()

                        try:
                            # Нормализация экспертных признаков
                            hc_feature = preprocessing.normalize(hc_feature, norm="l2", axis=0)
                        except Exception:
                            pass
                        else:
                            # Дополнение экспертных признаков нулями
                            hc_feature = np.pad(hc_feature, ((0, lhcf - hc_feature.shape[0]), (0, 0)))
                            hc_features.append(hc_feature)  # Добавление экспертных признаков в список

                        # Получение лог мел-спектрограмм
                        if len(curr_audio) > self.__pl[0]:
                            melspectrogram = librosa.feature.melspectrogram(
                                y=curr_audio,
                                sr=sr,
                                n_fft=self.__pl[0],
                                hop_length=self.__pl[1],
                                win_length=self.__pl[2],
                                center=self.__pl[3],
                                pad_mode=self.__pl[4],
                                power=self.__pl[5],
                                n_mels=self.__pl[6],
                                norm=self.__pl[7],
                                htk=self.__pl[8],
                                fmax=self.__pl[9],
                            )

                            # Преобразование спектрограммы из мощности (квадрат амплитуды) в децибелы (дБ)
                            melspectrogram_to_db = librosa.power_to_db(melspectrogram, top_db=80)

                            if melspectrogram_to_db.shape[1] < len_spec:
                                melspectrogram_to_db = np.pad(
                                    melspectrogram_to_db,
                                    ((0, 0), (0, len_spec - melspectrogram_to_db.shape[1])),
                                    "mean",
                                )
                            melspectrogram_to_db /= 255  # Линейная нормализация
                            melspectrogram_to_db = np.expand_dims(melspectrogram_to_db, axis=-1)
                            melspectrogram_to_db = cv2.resize(
                                melspectrogram_to_db, (224, 224), interpolation=cv2.INTER_LINEAR
                            )
                            melspectrogram_to_db = np.expand_dims(melspectrogram_to_db, axis=-1)
                            melspectrogram_to_db = np.repeat(melspectrogram_to_db, 3, axis=-1)
                            # Добавление лог мел-спектрограммы в список
                            melspectrogram_features.append(melspectrogram_to_db)

                    if last is False:
                        # Статистика извлеченных признаков из акустического сигнала
                        self._stat_acoustic_features(
                            last=last,
                            out=out,
                            len_hc_features=len(hc_features),
                            len_melspectrogram_features=len(melspectrogram_features),
                            shape_hc_features=hc_features[0].shape,
                            shape_melspectrogram_features=melspectrogram_features[0].shape,
                        )

                    return hc_features, melspectrogram_features
            finally:
                if runtime:
                    self._r_end(out=out)

    # ------------------------------------------------------------------------------------------------------------------
    # Внешние методы
    # ------------------------------------------------------------------------------------------------------------------

    def load_audio_model_hc(
        self, show_summary: bool = False, out: bool = True, runtime: bool = True, run: bool = True
    ) -> bool:
        """Формирование нейросетевой архитектуры модели для получения оценок по экспертным признакам

        Args:
            show_summary (bool): Отображение сформированной нейросетевой архитектуры модели
            out (bool): Отображение
            runtime (bool): Подсчет времени выполнения
            run (bool): Блокировка выполнения

        Returns:
            bool: **True** если нейросетевая архитектура модели сформирована, в обратном случае **False**

        .. dropdown:: Примеры
            :class-body: sd-pr-5

            :bdg-success:`Верно` :bdg-light:`-- 1 --`

            .. code-cell:: python
                :execution-count: 1
                :linenos:
                :tab-width: 8

                from oceanai.modules.lab.audio import Audio

                audio = Audio()
                audio.load_audio_model_hc(
                    show_summary = False, out = True,
                    runtime = True, run = True
                )

            .. output-cell::
                :execution-count: 1
                :linenos:

                [2022-10-17 13:16:23] Формирование нейросетевой архитектуры модели для получения оценок по экспертным признакам (аудио модальность) ...

                --- Время выполнения: 0.364 сек. ---

                True

            :bdg-danger:`Ошибка` :bdg-light:`-- 1 --`

            .. code-cell:: python
                :execution-count: 2
                :linenos:
                :tab-width: 8

                from oceanai.modules.lab.audio import Audio

                audio = Audio()
                audio.load_audio_model_hc(
                    show_summary = 1, out = True,
                    runtime = True, run = True
                )

            .. output-cell::
                :execution-count: 2
                :linenos:

                [2022-10-17 13:20:04] Неверные типы или значения аргументов в "Audio.load_audio_model_hc" ...

                False
        """

        self._clear_notebook_history_output()  # Очистка истории вывода сообщений в ячейке Jupyter

        try:
            # Проверка аргументов
            if (
                type(show_summary) is not bool
                or type(out) is not bool
                or type(runtime) is not bool
                or type(run) is not bool
            ):
                raise TypeError
        except TypeError:
            self._inv_args(__class__.__name__, self.load_audio_model_hc.__name__, out=out)
            return False
        else:
            # Блокировка выполнения
            if run is False:
                self._error(self._lock_user, out=out)
                return False

            if runtime:
                self._r_start()

            # Информационное сообщение
            self._info(self._formation_audio_model_hc, last=False, out=False)
            if out:
                self.show_notebook_history_output()  # Отображение истории вывода сообщений в ячейке Jupyter

            self._audio_model_hc = audio_model_hc()

            if show_summary and out:
                print(self._audio_model_hc)

            if runtime:
                self._r_end(out=out)

            return True

    def load_audio_model_nn(
        self, show_summary: bool = False, out: bool = True, runtime: bool = True, run: bool = True
    ) -> bool:
        """Формирование нейросетевой архитектуры для получения оценок по нейросетевым признакам

        Args:
            show_summary (bool): Отображение сформированной нейросетевой архитектуры модели
            out (bool): Отображение
            runtime (bool): Подсчет времени выполнения
            run (bool): Блокировка выполнения

        Returns:
            bool: **True** если нейросетевая архитектура модели сформирована, в обратном случае **False**

        .. dropdown:: Примеры
            :class-body: sd-pr-5

            :bdg-success:`Верно` :bdg-light:`-- 1 --`

            .. code-cell:: python
                :execution-count: 1
                :linenos:
                :tab-width: 8

                from oceanai.modules.lab.audio import Audio

                audio = Audio()

                audio.load_audio_model_nn(
                    show_summary = True, out = True,
                    runtime = True, run = True
                )

            .. output-cell::
                :execution-count: 1
                :linenos:

                [2024-10-06 23:01:20] Формирование нейросетевой архитектуры для получения оценок по нейросетевым признакам (аудио модальность) ...

                audio_model_nn(
                (vgg): VGG(
                    (features): Sequential(
                    (0): Conv2d(3, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
                    (1): ReLU(inplace=True)
                    (2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
                    (3): ReLU(inplace=True)
                    (4): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
                    (5): Conv2d(64, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
                    (6): ReLU(inplace=True)
                    (7): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
                    (8): ReLU(inplace=True)
                    (9): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
                    (10): Conv2d(128, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
                    (11): ReLU(inplace=True)
                    (12): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
                    (13): ReLU(inplace=True)
                    (14): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
                    (15): ReLU(inplace=True)
                    (16): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
                    (17): Conv2d(256, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
                    (18): ReLU(inplace=True)
                    (19): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
                    (20): ReLU(inplace=True)
                    (21): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
                    (22): ReLU(inplace=True)
                    (23): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
                    (24): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
                    (25): ReLU(inplace=True)
                    (26): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
                    (27): ReLU(inplace=True)
                    (28): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
                    (29): ReLU(inplace=True)
                    (30): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
                    )
                    (avgpool): AdaptiveAvgPool2d(output_size=(7, 7))
                    (classifier): Identity()
                )
                (flatten): Flatten(start_dim=1, end_dim=-1)
                (fc1): Linear(in_features=25088, out_features=512, bias=True)
                (relu): ReLU()
                (dropout): Dropout(p=0.5, inplace=False)
                (fc2): Linear(in_features=512, out_features=256, bias=True)
                (fc3): Linear(in_features=256, out_features=5, bias=True)
                )
                --- Время выполнения: 1.958 сек. ---

                True

            :bdg-danger:`Ошибка` :bdg-light:`-- 1 --`

            .. code-cell:: python
                :execution-count: 2
                :linenos:
                :tab-width: 8

                from oceanai.modules.lab.audio import Audio

                audio = Audio()
                audio.load_audio_model_nn(
                    show_summary = 1, out = True,
                    runtime = True, run = True
                )

            .. output-cell::
                :execution-count: 2
                :linenos:

                [2022-10-17 13:25:40] Неверные типы или значения аргументов в "Audio.load_audio_model_nn" ...

                False
        """

        self._clear_notebook_history_output()  # Очистка истории вывода сообщений в ячейке Jupyter

        try:
            # Проверка аргументов
            if (
                type(show_summary) is not bool
                or type(out) is not bool
                or type(runtime) is not bool
                or type(run) is not bool
            ):
                raise TypeError
        except TypeError:
            self._inv_args(__class__.__name__, self.load_audio_model_nn.__name__, out=out)
            return False
        else:
            # Блокировка выполнения
            if run is False:
                self._error(self._lock_user, out=out)
                return False

            if runtime:
                self._r_start()

            # Информационное сообщение
            self._info(self._formation_audio_model_nn, last=False, out=False)
            if out:
                self.show_notebook_history_output()  # Отображение истории вывода сообщений в ячейке Jupyter

            self._audio_model_nn = audio_model_nn()

            if show_summary and out:
                print(self._audio_model_nn)

            if runtime:
                self._r_end(out=out)

            return True

    def load_audio_models_b5(
        self, show_summary: bool = False, out: bool = True, runtime: bool = True, run: bool = True
    ) -> bool:
        """Формирование нейросетевых архитектур моделей для получения результатов оценки персональных качеств

        Args:
            show_summary (bool): Отображение последней сформированной нейросетевой архитектуры моделей
            out (bool): Отображение
            runtime (bool): Подсчет времени выполнения
            run (bool): Блокировка выполнения

        Returns:
            bool: **True** если нейросетевые архитектуры модели сформированы, в обратном случае **False**

        .. dropdown:: Примеры
            :class-body: sd-pr-5

            :bdg-success:`Верно` :bdg-light:`-- 1 --`

            .. code-cell:: python
                :execution-count: 1
                :linenos:
                :tab-width: 8

                from oceanai.modules.lab.audio import Audio

                audio = Audio()
                audio.load_audio_models_b5(
                    show_summary = True, out = True,
                    runtime = True, run = True
                )

            .. output-cell::
                :execution-count: 1
                :linenos:

                [2024-10-06 23:21:04] Формирование нейросетевых архитектур моделей для получения результатов оценки персональных качеств (аудио модальность) ...

                audio_model_b5(
                    (fc): Linear(in_features=32, out_features=1, bias=True)
                    (sigmoid): Sigmoid()
                )
                --- Время выполнения: 0.003 сек. ---

                True

            :bdg-danger:`Ошибка` :bdg-light:`-- 1 --`

            .. code-cell:: python
                :execution-count: 2
                :linenos:
                :tab-width: 8

                from oceanai.modules.lab.audio import Audio

                audio = Audio()
                audio.load_audio_models_b5(
                    show_summary = 1, out = True,
                    runtime = True, run = True
                )

            .. output-cell::
                :execution-count: 2
                :linenos:

                [2022-10-18 13:47:36] Неверные типы или значения аргументов в "Audio.load_audio_models_b5" ...

                False
        """

        self._clear_notebook_history_output()  # Очистка истории вывода сообщений в ячейке Jupyter

        try:
            # Проверка аргументов
            if (
                type(show_summary) is not bool
                or type(out) is not bool
                or type(runtime) is not bool
                or type(run) is not bool
            ):
                raise TypeError
        except TypeError:
            self._inv_args(__class__.__name__, self.load_audio_models_b5.__name__, out=out)
            return False
        else:
            # Блокировка выполнения
            if run is False:
                self._error(self._lock_user, out=out)
                return False

            if runtime:
                self._r_start()

            # Информационное сообщение
            self._info(self._formation_audio_models_b5, last=False, out=False)
            if out:
                self.show_notebook_history_output()  # Отображение истории вывода сообщений в ячейке Jupyter

            for key, _ in self._audio_models_b5.items():
                self._audio_models_b5[key] = self.__load_audio_model_b5()

            if show_summary and out:
                print(self._audio_models_b5[key])

            if runtime:
                self._r_end(out=out)

            return True

    def load_audio_model_weights_hc(
        self, url: str, force_reload: bool = True, out: bool = True, runtime: bool = True, run: bool = True
    ) -> bool:
        """Загрузка весов нейросетевой модели для получения оценок по экспертным признакам

        Args:
            url (str): Полный путь к файлу с весами нейросетевой модели
            force_reload (bool): Принудительная загрузка файла с весами нейросетевой модели из сети
            out (bool): Отображение
            runtime (bool): Подсчет времени выполнения
            run (bool): Блокировка выполнения

        Returns:
            bool: **True** если веса нейросетевой модели загружены, в обратном случае **False**

        .. dropdown:: Примеры
            :class-body: sd-pr-5

            :bdg-success:`Верно` :bdg-light:`-- 1 --`

            .. code-cell:: python
                :execution-count: 1
                :linenos:
                :tab-width: 8

                from oceanai.modules.lab.audio import Audio

                audio = Audio()

                audio.load_audio_model_hc(
                    show_summary = False, out = True,
                    runtime = True, run = True
                )

            .. output-cell::
                :execution-count: 1
                :linenos:

                [2022-10-17 14:24:28] Формирование нейросетевой архитектуры модели для получения оценок по экспертным признакам (аудио модальность) ...

                --- Время выполнения: 0.398 сек. ---

                True

            .. code-cell:: python
                :execution-count: 2
                :linenos:
                :tab-width: 8

                audio.path_to_save_ = './models'
                audio.chunk_size_ = 2000000

                url = audio.weights_for_big5_['audio']['fi']['hc']['googledisk']

                audio.load_audio_model_weights_hc(
                    url = url,
                    force_reload = True,
                    out = True,
                    runtime = True,
                    run = True
                )

            .. output-cell::
                :execution-count: 2
                :linenos:

                [2024-10-06 23:05:53] Загрузка весов нейросетевой модели для получения оценок по экспертным признакам (аудио модальность) ...

                [2024-10-06 23:05:56] Загрузка файла "weights_2022-05-05_11-27-55.pth" 100.0% ...

                --- Время выполнения: 3.078 сек. ---

                True

            :bdg-danger:`Ошибка` :bdg-light:`-- 1 --`

            .. code-cell:: python
                :execution-count: 3
                :linenos:
                :tab-width: 8

                from oceanai.modules.lab.audio import Audio

                audio = Audio()

                audio.path_to_save_ = './models'
                audio.chunk_size_ = 2000000

                url = audio.weights_for_big5_['audio']['fi']['hc']['googledisk']

                audio.load_audio_model_weights_hc(
                    url = url,
                    force_reload = True,
                    out = True,
                    runtime = True,
                    run = True
                )

            .. output-cell::
                :execution-count: 3
                :linenos:

                [2024-10-06 23:07:25] Загрузка весов нейросетевой модели для получения оценок по экспертным признакам (аудио модальность) ...

                [2024-10-06 23:07:28] Загрузка файла "weights_2022-05-05_11-27-55.pth" 100.0% ...

                [2024-10-06 23:07:28] Что-то пошло не так ... нейросетевая архитектура модели для получения оценок по экспертным признакам не сформирована (аудио модальность) ...

                --- Время выполнения: 2.911 сек. ---

                False
        """

        if runtime:
            self._r_start()

        if self.__load_model_weights(url, force_reload, self._load_audio_model_weights_hc, out, False, run) is True:
            try:
                self._audio_model_hc.load_state_dict(torch.load(self._url_last_filename))
                self._audio_model_hc.to(self._device).eval()
                with torch.no_grad():
                    test_tensor = torch.randn((1, 196, 25)).to(self._device)
                    _, _ = self._audio_model_hc(test_tensor)
            except Exception:
                self._error(self._model_audio_hc_not_formation, out=out)
                return False
            else:
                return True
            finally:
                if runtime:
                    self._r_end(out=out)

        return False

    def load_audio_model_weights_nn(
        self, url: str, force_reload: bool = True, out: bool = True, runtime: bool = True, run: bool = True
    ) -> bool:
        """Загрузка весов нейросетевой модели для получения оценок по нейросетевым признакам

        Args:
            url (str): Полный путь к файлу с весами нейросетевой модели
            force_reload (bool): Принудительная загрузка файла с весами нейросетевой модели из сети
            out (bool): Отображение
            runtime (bool): Подсчет времени выполнения
            run (bool): Блокировка выполнения

        Returns:
            bool: **True** если веса нейросетевой модели загружены, в обратном случае **False**

        .. dropdown:: Примеры
            :class-body: sd-pr-5

            :bdg-success:`Верно` :bdg-light:`-- 1 --`

            .. code-cell:: python
                :execution-count: 1
                :linenos:
                :tab-width: 8

                from oceanai.modules.lab.audio import Audio

                audio = Audio()

                audio.load_audio_model_nn(
                    show_summary = False, out = True,
                    runtime = True, run = True
                )

            .. output-cell::
                :execution-count: 1
                :linenos:

                [2022-10-17 15:47:20] Формирование нейросетевой архитектуры для получения оценок по нейросетевым
                признакам (аудио модальность) ...

                --- Время выполнения: 0.419 сек. ---

                True

            .. code-cell:: python
                :execution-count: 2
                :linenos:
                :tab-width: 8

                audio.path_to_save_ = './models'
                audio.chunk_size_ = 2000000

                url = audio.weights_for_big5_['audio']['fi']['nn']['googledisk']

                audio.load_audio_model_weights_nn(
                    url = url,
                    force_reload = True,
                    out = True,
                    runtime = True,
                    run = True
                )

            .. output-cell::
                :execution-count: 2
                :linenos:

                [2024-10-06 23:22:33] Загрузка весов нейросетевой модели для получения оценок по нейросетевым признакам (аудио модальность) ...

                [2024-10-06 23:22:39] Загрузка файла "weights_2022-05-03_07-46-14.pth" 100.0% ...

                --- Время выполнения: 6.454 сек. ---

                True

            :bdg-danger:`Ошибка` :bdg-light:`-- 1 --`

            .. code-cell:: python
                :execution-count: 3
                :linenos:
                :tab-width: 8

                from oceanai.modules.lab.audio import Audio

                audio = Audio()

                audio.path_to_save_ = './models'
                audio.chunk_size_ = 2000000

                url = audio.weights_for_big5_['audio']['nn']['sberdisk']

                audio.load_audio_model_weights_nn(
                    url = url,
                    force_reload = True,
                    out = True,
                    runtime = True,
                    run = True
                )

            .. output-cell::
                :execution-count: 3
                :linenos:

                [2024-10-06 23:23:37] Загрузка весов нейросетевой модели для получения оценок по нейросетевым признакам (аудио модальность) ...

                [2024-10-06 23:23:43] Загрузка файла "weights_2022-05-03_07-46-14.pth" 100.0% ...

                [2024-10-06 23:23:43] Что-то пошло не так ... нейросетевая архитектура модели для получения оценок по нейросетевым признакам не сформирована (аудио модальность) ...

                --- Время выполнения: 5.639 сек. ---

                False
        """

        if runtime:
            self._r_start()

        if self.__load_model_weights(url, force_reload, self._load_audio_model_weights_nn, out, False, run) is True:
            try:
                self._audio_model_nn.load_state_dict(torch.load(self._url_last_filename))
                self._audio_model_nn.to(self._device).eval()
                with torch.no_grad():
                    test_tensor = torch.randn((1, 3, 224, 224)).to(self._device)
                    _, _ = self._audio_model_nn(test_tensor)
            except Exception:
                self._error(self._model_audio_nn_not_formation, out=out)
                return False
            else:
                return True
            finally:
                if runtime:
                    self._r_end(out=out)

        return False

    def load_audio_models_weights_b5(
        self,
        url_openness: str,
        url_conscientiousness: str,
        url_extraversion: str,
        url_agreeableness: str,
        url_non_neuroticism: str,
        force_reload: bool = True,
        out: bool = True,
        runtime: bool = True,
        run: bool = True,
    ) -> bool:
        """Загрузка весов нейросетевых моделей для получения результатов оценки персональных качеств

        Args:
            url_openness (str): Полный путь к файлу с весами нейросетевой модели (открытость опыту)
            url_conscientiousness (str): Полный путь к файлу с весами нейросетевой модели (добросовестность)
            url_extraversion (str): Полный путь к файлу с весами нейросетевой модели (экстраверсия)
            url_agreeableness (str): Полный путь к файлу с весами нейросетевой модели (доброжелательность)
            url_non_neuroticism (str): Полный путь к файлу с весами нейросетевой модели (эмоциональная стабильность)
            force_reload (bool): Принудительная загрузка файлов с весами нейросетевых моделей из сети
            out (bool): Отображение
            runtime (bool): Подсчет времени выполнения
            run (bool): Блокировка выполнения

        Returns:
            bool: **True** если веса нейросетевых моделей загружены, в обратном случае **False**

        .. dropdown:: Примеры
            :class-body: sd-pr-5

            :bdg-success:`Верно` :bdg-light:`-- 1 --`

            .. code-cell:: python
                :execution-count: 1
                :linenos:
                :tab-width: 8

                from oceanai.modules.lab.audio import Audio

                audio = Audio()

                audio.load_audio_models_b5(
                    show_summary = False, out = True,
                    runtime = True, run = True
                )

            .. output-cell::
                :execution-count: 1
                :linenos:

                [2022-10-18 22:40:05] Формирование нейросетевых архитектур моделей для получения результатов оценки
                персональных качеств (аудио модальность) ...

                --- Время выполнения: 0.163 сек. ---

                True

            .. code-cell:: python
                :execution-count: 2
                :linenos:
                :tab-width: 8

                audio.path_to_save_ = './models'
                audio.chunk_size_ = 2000000

                url_openness = audio.weights_for_big5_['audio']['fi']['b5']['openness']['googledisk']
                url_conscientiousness = audio.weights_for_big5_['audio']['fi']['b5']['conscientiousness']['googledisk']
                url_extraversion = audio.weights_for_big5_['audio']['fi']['b5']['extraversion']['googledisk']
                url_agreeableness = audio.weights_for_big5_['audio']['fi']['b5']['agreeableness']['googledisk']
                url_non_neuroticism = audio.weights_for_big5_['audio']['fi']['b5']['non_neuroticism']['googledisk']

                audio.load_audio_models_weights_b5(
                    url_openness = url_openness,
                    url_conscientiousness = url_conscientiousness,
                    url_extraversion = url_extraversion,
                    url_agreeableness = url_agreeableness,
                    url_non_neuroticism = url_non_neuroticism,
                    force_reload = True,
                    out = True,
                    runtime = True,
                    run = True
                )

            .. output-cell::
                :execution-count: 2
                :linenos:

                [2024-10-06 23:15:39] Загрузка весов нейросетевых моделей для получения результатов оценки персональных качеств (аудио модальность) ...

                [2024-10-06 23:15:42] Загрузка файла "weights_2022-06-15_16-16-20.pth" 100.0% ... Открытость опыту

                [2024-10-06 23:15:45] Загрузка файла "weights_2022-06-15_16-21-57.pth" 100.0% ... Добросовестность

                [2024-10-06 23:15:47] Загрузка файла "weights_2022-06-15_16-26-41.pth" 100.0% ... Экстраверсия

                [2024-10-06 23:15:49] Загрузка файла "weights_2022-06-15_16-32-51.pth" 100.0% ... Доброжелательность

                [2024-10-06 23:15:52] Загрузка файла "weights_2022-06-15_16-37-46.pth" 100.0% ... Эмоциональная стабильность

                --- Время выполнения: 12.466 сек. ---

                True

            :bdg-danger:`Ошибка` :bdg-light:`-- 1 --`

            .. code-cell:: python
                :execution-count: 3
                :linenos:
                :tab-width: 8

                from oceanai.modules.lab.audio import Audio

                audio = Audio()

                audio.path_to_save_ = './models'
                audio.chunk_size_ = 2000000

                url_openness = audio.weights_for_big5_['audio']['fi']['b5']['openness']['googledisk']
                url_conscientiousness = audio.weights_for_big5_['audio']['fi']['b5']['conscientiousness']['googledisk']
                url_extraversion = audio.weights_for_big5_['audio']['fi']['b5']['extraversion']['googledisk']
                url_agreeableness = audio.weights_for_big5_['audio']['fi']['b5']['agreeableness']['googledisk']
                url_non_neuroticism = audio.weights_for_big5_['audio']['fi']['b5']['non_neuroticism']['googledisk']

                audio.load_audio_models_weights_b5(
                    url_openness = url_openness,
                    url_conscientiousness = url_conscientiousness,
                    url_extraversion = url_extraversion,
                    url_agreeableness = url_agreeableness,
                    url_non_neuroticism = url_non_neuroticism,
                    force_reload = True,
                    out = True,
                    runtime = True,
                    run = True
                )

            .. output-cell::
                :execution-count: 3
                :linenos:

                [2024-10-06 23:17:35] Загрузка весов нейросетевых моделей для получения результатов оценки персональных качеств (аудио модальность) ...

                [2024-10-06 23:17:37] Загрузка файла "weights_2022-06-15_16-16-20.pth" 100.0% ...

                [2024-10-06 23:17:37] Что-то пошло не так ... не удалось загрузить веса нейросетевой модели ... Открытость опыту

                    Файл: /Users/dl/@DmitryRyumin/Python/envs/OCEANAI/lib/python3.9/site-packages/oceanai/modules/lab/audio.py
                    Линия: 2284
                    Метод: load_audio_models_weights_b5
                    Тип ошибки: AttributeError

                [2024-10-06 23:17:40] Загрузка файла "weights_2022-06-15_16-21-57.pth" 100.0% ...

                [2024-10-06 23:17:40] Что-то пошло не так ... не удалось загрузить веса нейросетевой модели ... Добросовестность

                    Файл: /Users/dl/@DmitryRyumin/Python/envs/OCEANAI/lib/python3.9/site-packages/oceanai/modules/lab/audio.py
                    Линия: 2284
                    Метод: load_audio_models_weights_b5
                    Тип ошибки: AttributeError

                [2024-10-06 23:17:42] Загрузка файла "weights_2022-06-15_16-26-41.pth" 100.0% ...

                [2024-10-06 23:17:42] Что-то пошло не так ... не удалось загрузить веса нейросетевой модели ... Экстраверсия

                    Файл: /Users/dl/@DmitryRyumin/Python/envs/OCEANAI/lib/python3.9/site-packages/oceanai/modules/lab/audio.py
                    Линия: 2284
                    Метод: load_audio_models_weights_b5
                    Тип ошибки: AttributeError

                [2024-10-06 23:17:45] Загрузка файла "weights_2022-06-15_16-32-51.pth" 100.0% ...

                [2024-10-06 23:17:45] Что-то пошло не так ... не удалось загрузить веса нейросетевой модели ... Доброжелательность

                    Файл: /Users/dl/@DmitryRyumin/Python/envs/OCEANAI/lib/python3.9/site-packages/oceanai/modules/lab/audio.py
                    Линия: 2284
                    Метод: load_audio_models_weights_b5
                    Тип ошибки: AttributeError

                [2024-10-06 23:17:47] Загрузка файла "weights_2022-06-15_16-37-46.pth" 100.0% ...

                [2024-10-06 23:17:47] Что-то пошло не так ... не удалось загрузить веса нейросетевой модели ... Эмоциональная стабильность

                    Файл: /Users/dl/@DmitryRyumin/Python/envs/OCEANAI/lib/python3.9/site-packages/oceanai/modules/lab/audio.py
                    Линия: 2284
                    Метод: load_audio_models_weights_b5
                    Тип ошибки: AttributeError

                --- Время выполнения: 12.562 сек. ---

                False
        """

        self._clear_notebook_history_output()  # Очистка истории вывода сообщений в ячейке Jupyter

        try:
            # Проверка аргументов
            if (
                type(url_openness) is not str
                or not url_openness
                or type(url_conscientiousness) is not str
                or not url_conscientiousness
                or type(url_extraversion) is not str
                or not url_extraversion
                or type(url_agreeableness) is not str
                or not url_agreeableness
                or type(url_non_neuroticism) is not str
                or not url_non_neuroticism
                or type(force_reload) is not bool
                or type(out) is not bool
                or type(runtime) is not bool
                or type(run) is not bool
            ):
                raise TypeError
        except TypeError:
            self._inv_args(__class__.__name__, self.load_audio_models_weights_b5.__name__, out=out)
            return False
        else:
            # Блокировка выполнения
            if run is False:
                self._error(self._lock_user, out=out)
                return False

            if runtime:
                self._r_start()

            result_download_models = 0  # Все веса нейросетевых моделей по умолчанию загружены

            # Информационное сообщение
            self._info(self._load_audio_models_weights_b5, last=False, out=out)

            # Проход по всем URL с весами нейросетевых моделей
            for cnt, url in enumerate(
                [
                    (url_openness, self._b5["ru"][0]),
                    (url_conscientiousness, self._b5["ru"][1]),
                    (url_extraversion, self._b5["ru"][2]),
                    (url_agreeableness, self._b5["ru"][3]),
                    (url_non_neuroticism, self._b5["ru"][4]),
                ]
            ):
                sections = urlparse(url[0])  # Парсинг URL адреса

                try:
                    # URL файл невалидный
                    if sections.scheme == "":
                        raise requests.exceptions.InvalidURL
                except requests.exceptions.InvalidURL:
                    url_norm = os.path.normpath(url[0])

                    try:
                        if os.path.isfile(url_norm) is False:
                            raise FileNotFoundError  # Не файл
                    except FileNotFoundError:
                        self._other_error(
                            self._load_model_weights_error + " " + self._bold_wrapper(url[1].capitalize()), out=out
                        )
                        continue
                    except Exception:
                        self._other_error(self._unknown_err, out=out)
                        continue
                    else:
                        self._url_last_filename = url_norm

                        # Отображение истории вывода сообщений в ячейке Jupyter
                        if out:
                            self.show_notebook_history_output()
                else:
                    try:
                        if force_reload is False:
                            clear_output(True)
                        # Загрузка файла из URL
                        res_download_file_from_url = self._download_file_from_url(
                            url=url[0], force_reload=force_reload, runtime=False, out=out, run=True
                        )
                    except Exception:
                        self._other_error(self._unknown_err, out=out)
                        continue
                    else:
                        # Файл загружен
                        if res_download_file_from_url != 200:
                            continue

                        try:
                            self._audio_models_b5[self._b5["en"][cnt]].load_state_dict(
                                torch.load(self._url_last_filename)
                            )
                            self._audio_models_b5[self._b5["en"][cnt]].to(self._device).eval()
                            with torch.no_grad():
                                test_tensor = torch.randn((1, 32)).to(self._device)
                                _ = self._audio_models_b5[self._b5["en"][cnt]](test_tensor)
                        except Exception:
                            self._other_error(
                                self._load_model_weights_error + " " + self._bold_wrapper(url[1].capitalize()), out=out
                            )
                            continue
                        else:
                            self._add_last_el_notebook_history_output(self._bold_wrapper(url[1].capitalize()))

                            result_download_models += 1

            clear_output(True)
            # Отображение истории вывода сообщений в ячейке Jupyter
            if out:
                self.show_notebook_history_output()

            if runtime:
                self._r_end(out=out)

            if result_download_models != len(self._b5["ru"]):
                return False
            return True

    def get_acoustic_features(
        self,
        path: str,
        sr: int = 44100,
        window: Union[int, float] = 2.0,
        step: Union[int, float] = 1.0,
        out: bool = True,
        runtime: bool = True,
        run: bool = True,
    ) -> Tuple[List[Optional[np.ndarray]], List[Optional[np.ndarray]]]:
        """Извлечение признаков из акустического сигнала

        Args:
            path (str): Путь к аудио или видеофайлу
            sr (int): Частота дискретизации
            window (Union[int, float]): Размер окна сегмента сигнала (в секундах)
            step (Union[int, float]): Шаг сдвига окна сегмента сигнала (в секундах)
            out (bool): Отображение
            runtime (bool): Подсчет времени выполнения
            run (bool): Блокировка выполнения

        Returns:
            Tuple[List[Optional[np.ndarray]], List[Optional[np.ndarray]]]: Кортеж с двумя списками:

                1. Список с экспертными признаками
                2. Список с лог мел-спектрограммами

        :bdg-link-light:`Пример <../../user_guide/notebooks/Audio-get_acoustic_features.ipynb>`
        """

        self._clear_notebook_history_output()  # Очистка истории вывода сообщений в ячейке Jupyter

        return self._get_acoustic_features(
            path=path, sr=sr, window=window, step=step, last=False, out=out, runtime=runtime, run=run
        )

    def get_audio_union_predictions(
        self,
        depth: int = 1,
        recursive: bool = False,
        sr: int = 44100,
        window: Union[int, float] = 2.0,
        step: Union[int, float] = 1.0,
        accuracy=True,
        url_accuracy: str = "",
        logs: bool = True,
        out: bool = True,
        runtime: bool = True,
        run: bool = True,
    ) -> bool:
        """Получения прогнозов по аудио

        Args:
            depth (int): Глубина иерархии для получения данных
            recursive (bool): Рекурсивный поиск данных
            sr (int): Частота дискретизации
            window (Union[int, float]): Размер окна сегмента сигнала (в секундах)
            step (Union[int, float]): Шаг сдвига окна сегмента сигнала (в секундах)
            accuracy (bool): Вычисление точности
            url_accuracy (str): Полный путь к файлу с верными предсказаниями для подсчета точности
            logs (bool): При необходимости формировать LOG файл
            out (bool): Отображение
            runtime (bool): Подсчет времени выполнения
            run (bool): Блокировка выполнения

        Returns:
            bool: **True** если прогнозы успешно получены, в обратном случае **False**

        :bdg-link-light:`Пример <../../user_guide/notebooks/Audio-get_audio_union_predictions.ipynb>`
        """

        self._clear_notebook_history_output()  # Очистка истории вывода сообщений в ячейке Jupyter

        # Сброс
        self._df_files = pd.DataFrame()  # Пустой DataFrame с данными
        self._df_accuracy = pd.DataFrame()  # Пустой DataFrame с результатами вычисления точности

        try:
            # Проверка аргументов
            if (
                type(depth) is not int
                or depth < 1
                or type(out) is not bool
                or type(recursive) is not bool
                or type(sr) is not int
                or sr < 1
                or ((type(window) is not int or window < 1) and (type(window) is not float or window <= 0))
                or ((type(step) is not int or step < 1) and (type(step) is not float or step <= 0))
                or type(accuracy) is not bool
                or type(url_accuracy) is not str
                or type(logs) is not bool
                or type(runtime) is not bool
                or type(run) is not bool
            ):
                raise TypeError
        except TypeError:
            self._inv_args(__class__.__name__, self.get_audio_union_predictions.__name__, out=out)
            return False
        else:
            # Блокировка выполнения
            if run is False:
                self._error(self._lock_user, out=out)
                return False

            if runtime:
                self._r_start()

            try:
                # Получение директорий, где хранятся данные
                path_to_data = self._get_paths(self.path_to_dataset_, depth, out=out)
                if type(path_to_data) is bool:
                    return False

                if type(self.keys_dataset_) is not list:
                    raise TypeError

                # Словарь для DataFrame набора данных с данными
                self._dict_of_files = dict(zip(self.keys_dataset_, [[] for _ in range(0, len(self.keys_dataset_))]))
                # Словарь для DataFrame набора данных с результатами вычисления точности
                self._dict_of_accuracy = dict(
                    zip(self.keys_dataset_[1:], [[] for _ in range(0, len(self.keys_dataset_[1:]))])
                )
            except (TypeError, FileNotFoundError):
                self._other_error(self._folder_not_found.format(self._info_wrapper(self.path_to_dataset_)), out=out)
                return False
            except Exception:
                self._other_error(self._unknown_err, out=out)
                return False
            else:
                # Вычисление точности
                if accuracy is True:
                    get_audio_union_predictions_info = self._get_union_predictions_info + self._get_accuracy_info
                else:
                    get_audio_union_predictions_info = self._get_union_predictions_info

                get_audio_union_predictions_info += self._audio_modality

                # Вычисление точности
                if accuracy is True:
                    # Информационное сообщение
                    self._info(get_audio_union_predictions_info, out=out)

                    if not url_accuracy:
                        url_accuracy = self._true_traits["sberdisk"]

                    try:
                        # Загрузка верных предсказаний
                        data_true_traits = pd.read_csv(url_accuracy)
                    except (FileNotFoundError, URLError, UnicodeDecodeError):
                        self._other_error(self._load_data_true_traits_error, out=out)
                        return False
                    except Exception:
                        self._other_error(self._unknown_err, out=out)
                        return False
                    else:
                        true_traits = []
                        self._del_last_el_notebook_history_output()

                paths = []  # Пути до искомых файлов

                # Проход по всем директориям
                for curr_path in path_to_data:
                    empty = True  # По умолчанию директория пустая

                    # Рекурсивный поиск данных
                    if recursive is True:
                        g = Path(curr_path).rglob("*")
                    else:
                        g = Path(curr_path).glob("*")

                    # Формирование словаря для DataFrame
                    for p in g:
                        try:
                            if type(self.ext_) is not list or len(self.ext_) < 1:
                                raise TypeError

                            self.ext_ = [x.lower() for x in self.ext_]
                        except TypeError:
                            self._other_error(self._wrong_ext, out=out)
                            return False
                        except Exception:
                            self._other_error(self._unknown_err, out=out)
                            return False
                        else:
                            # Расширение файла соответствует расширению искомых файлов
                            if p.suffix.lower() in self.ext_:
                                if empty is True:
                                    empty = False  # Каталог не пустой

                                paths.append(p.resolve())

                try:
                    self.__len_paths = len(paths)  # Количество искомых файлов

                    if self.__len_paths == 0:
                        raise TypeError
                except TypeError:
                    self._other_error(self._files_not_found, out=out)
                    return False
                except Exception:
                    self._other_error(self._unknown_err, out=out)
                    return False
                else:
                    # Локальный путь
                    self.__local_path = lambda path: os.path.join(
                        *Path(path).parts[-abs((len(Path(path).parts) - len(Path(self.path_to_dataset_).parts))) :]
                    )

                    last = False  # Замена последнего сообщения

                    with torch.no_grad():

                        # Проход по всем искомым файлов
                        for i, curr_path in enumerate(paths):
                            if i != 0:
                                last = True

                            # Индикатор выполнения
                            self._progressbar_union_predictions(
                                get_audio_union_predictions_info,
                                i,
                                self.__local_path(curr_path),
                                self.__len_paths,
                                True,
                                last,
                                out,
                            )

                            # Извлечение признаков из акустического сигнала
                            hc_features, melspectrogram_features = self._get_acoustic_features(
                                path=str(curr_path.resolve()),
                                sr=sr,
                                window=window,
                                step=step,
                                last=True,
                                out=False,
                                runtime=False,
                                run=run,
                            )

                            # Признаки из акустического сигнала извлечены
                            if len(hc_features) > 0 and len(melspectrogram_features) > 0:
                                # Коды ошибок нейросетевых моделей
                                code_error_pred_hc = -1
                                code_error_pred_melspectrogram = -1

                                try:
                                    # Оправка экспертных признаков в нейросетевую модель
                                    hc_features = torch.from_numpy(np.array(hc_features, dtype=np.float32))
                                    pred_hc, _ = self.audio_model_hc_(hc_features.to(self._device))
                                    pred_hc = pred_hc.detach().cpu()
                                except TypeError:
                                    code_error_pred_hc = 1
                                except Exception:
                                    code_error_pred_hc = 2

                                try:
                                    # Отправка нейросетевых признаков в нейросетевую модель
                                    melspectrogram_features = torch.from_numpy(
                                        np.array(melspectrogram_features, dtype=np.float32)
                                    )
                                    pred_melspectrogram, _ = self.audio_model_nn_(
                                        melspectrogram_features.permute(0, 3, 1, 2).to(self._device)
                                    )
                                    pred_melspectrogram = pred_melspectrogram.detach().cpu()
                                except TypeError:
                                    code_error_pred_melspectrogram = 1
                                except Exception:
                                    code_error_pred_melspectrogram = 2

                                if code_error_pred_hc != -1 and code_error_pred_melspectrogram != -1:
                                    self._error(self._models_audio_not_formation, out=out)
                                    return False

                                if code_error_pred_hc != -1:
                                    self._error(self._model_audio_hc_not_formation, out=out)
                                    return False

                                if code_error_pred_melspectrogram != -1:
                                    self._error(self._model_audio_nn_not_formation, out=out)
                                    return False

                                # Конкатенация оценок по экспертным и нейросетевым признакам
                                union_pred = self.__concat_pred(pred_hc.numpy(), pred_melspectrogram.numpy(), out=out)

                                if len(union_pred) == 0:
                                    return False

                                final_pred = []

                                for cnt, (name_b5, model) in enumerate(self.audio_models_b5_.items()):
                                    curr_union_pred = torch.from_numpy(np.expand_dims(union_pred[cnt], axis=0))
                                    result = model(curr_union_pred.to(self._device)).detach().cpu().numpy()[0][0]

                                    final_pred.append(result)

                                # Добавление данных в словарь для DataFrame
                                if self._append_to_list_of_files(str(curr_path.resolve()), final_pred, out) is False:
                                    return False

                                # Вычисление точности
                                if accuracy is True:
                                    try:
                                        true_trait = (
                                            data_true_traits[data_true_traits.NAME_VIDEO == curr_path.name][
                                                list(self._b5["en"])
                                            ]
                                            .values[0]
                                            .tolist()
                                        )
                                    except IndexError:
                                        self._other_error(self._expert_values_not_found, out=out)
                                        return False
                                    except Exception:
                                        self._other_error(self._unknown_err, out=out)
                                        return False
                                    else:
                                        true_traits.append(true_trait)
                            else:
                                # Добавление данных в словарь для DataFrame
                                if (
                                    self._append_to_list_of_files(
                                        str(curr_path.resolve()), [None] * len(self._b5["en"]), out
                                    )
                                    is False
                                ):
                                    return False

                    # Индикатор выполнения
                    self._progressbar_union_predictions(
                        get_audio_union_predictions_info,
                        self.__len_paths,
                        self.__local_path(paths[-1]),
                        self.__len_paths,
                        True,
                        last,
                        out,
                    )

                    # Отображение в DataFrame с данными
                    self._df_files = pd.DataFrame.from_dict(data=self._dict_of_files, orient="index").transpose()
                    self._df_files.index.name = self._keys_id
                    self._df_files.index += 1

                    self._df_files.index = self._df_files.index.map(str)

                    self._df_files.Path = [os.path.basename(i) for i in self._df_files.Path]

                    # Отображение
                    if out is True:
                        self._add_notebook_history_output(self._df_files.iloc[0 : self.num_to_df_display_, :])

                    # Подсчет точности
                    if accuracy is True:
                        mae_curr = []

                        for cnt, name_b5 in enumerate(self._df_files.keys().tolist()[1:]):
                            mae_curr.append(
                                mean_absolute_error(np.asarray(true_traits)[:, cnt], self._df_files[name_b5].to_list())
                            )

                        mae_curr = [round(float(i), 4) for i in mae_curr]
                        mae_mean = round(float(np.mean(mae_curr)), 4)
                        accuracy_curr = [round(float(i), 4) for i in 1 - np.asarray(mae_curr)]
                        accuracy_mean = round(float(np.mean(accuracy_curr)), 4)

                        for curr_acc in [mae_curr, accuracy_curr]:
                            # Добавление данных в словарь для DataFrame с результатами вычисления точности
                            if self._append_to_list_of_accuracy(curr_acc, out) is False:
                                return False

                        self._dict_of_accuracy.update({self.__df_accuracy_mean: [mae_mean, accuracy_mean]})
                        # Отображение в DataFrame с данными
                        self._df_accuracy = pd.DataFrame.from_dict(
                            data=self._dict_of_accuracy, orient="index"
                        ).transpose()
                        self._df_accuracy.index = self.__df_accuracy_index
                        self._df_accuracy.index.name = self.__df_accuracy_index_name

                        # Информационное сообщение
                        self._info(self._get_union_predictions_result, out=False)

                        # Отображение
                        if out is True:
                            self._add_notebook_history_output(self._df_accuracy.iloc[0 : self.num_to_df_display_, :])

                        self._info(
                            self._get_union_predictions_results_mean.format(
                                self._info_wrapper(str(mae_mean)), self._info_wrapper(str(accuracy_mean))
                            ),
                            out=False,
                        )

                    clear_output(True)
                    # Отображение истории вывода сообщений в ячейке Jupyter
                    if out is True:
                        self.show_notebook_history_output()

                    if logs is True:
                        # Текущее время для лог-файла
                        # см. datetime.fromtimestamp()
                        curr_ts = str(datetime.now().timestamp()).replace(".", "_")

                        name_logs_file = self.get_audio_union_predictions.__name__

                        # Сохранение LOG
                        res_save_logs_df_files = self._save_logs(
                            self._df_files, name_logs_file + "_df_files_" + curr_ts
                        )

                        # Подсчет точности
                        if accuracy is True:
                            # Сохранение LOG
                            res_save_logs_df_accuracy = self._save_logs(
                                self._df_accuracy, name_logs_file + "_df_accuracy_" + curr_ts
                            )

                        if res_save_logs_df_files is True:
                            # Сохранение LOG файла/файлов
                            if accuracy is True and res_save_logs_df_accuracy is True:
                                logs_s = self._logs_saves_true
                            else:
                                logs_s = self._logs_save_true

                            self._info_true(logs_s, out=out)

                    return True
            finally:
                if runtime:
                    self._r_end(out=out)
