sensory-audio-cli


Namesensory-audio-cli JSON
Version 0.1.2 PyPI version JSON
download
home_pagehttp://10.10.0.20:3000/SensoryLAB/sensory-audio-cli/src/branch/master/README.md
SummaryClient library for Audio Processing API
upload_time2025-02-17 01:54:46
maintainerNone
docs_urlNone
authorSensoryLAB
requires_python>=3.8
licenseNone
keywords
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # **Audio Processor Client**


Описание

**Audio Processor Client** – это асинхронная библиотека для взаимодействия с сервером транскрибатора. Клиент поддерживает различные сценарии обработки аудио:
 
    • Обработка аудиофайлов с использованием синхронного (HTTP POST) и асинхронного (задачи с polling) режимов  
    • Стриминговая обработка аудио через WebSocket (в том числе файлы и поток с микрофона)  
    • Обнаружение доступных микрофонов и реализацию предварительной проверки перед началом записи  
    • Возможность включить специальный режим обработки – emotional. Благодаря нему транскрибатор анализирует не только речь, но и эмоциональную окраску голоса

Эта документация демонстрирует лучшие практики для использования клиента и предлагает подробные примеры работы.

# **Требования и установка**

Для работы клиента понадобятся Python 3.7+ и следующие зависимости:
```
– asyncio  
– httpx  
– websockets  
– pydantic  
– numpy  
– sounddevice  
– pyaudio (для альтернативной реализации работы с микрофоном, если требуется)
```

Установка зависимостей (например, через pip):
```
pip install httpx websockets pydantic numpy sounddevice pyaudio
```
Убедитесь, что аудиодрайверы и библиотеки для работы с аудиоустройствами (PortAudio) настроены правильно.

# **Быстрый старт**

Базовая схема использования клиента выглядит так:

1. Импортируйте необходимые классы:
  
    • **AudioClient** – для подключения и обработки аудио  
    • **ProcessingSettings** – для задания режима транскрипции и настроек

2. Вызывайте методы для обработки аудио:
  
    – process_audio – для передачи аудиофайлов (синхронно или асинхронно)  
    – stream_audio – для потоковой обработки файла через вебсокет  
    – async_microphone_stream – для получения аудио с микрофона и передачи на сервер в режиме реального времени

### Ниже приведён упрощённый пример:

----------------------------------------------------------------
```
import asyncio
from audio_processor.client import AudioClient, ProcessingSettings

async def main():
    async with AudioClient(base_url="http://адрес_вашего_сервера:8000") as client:
        # Пример стриминговой обработки файла
        async for chunk in client.stream_audio(
            "path/to/your_file.opus",
            ProcessingSettings(
                mode="stt",
                format_output="json",
                transcription_settings={"task": "transcribe", "emotional": True, "language": "ru"}
            )
        ):
            print(chunk)

        # Синхронная обработка: результат возвращается полностью после завершения обработки
        result = await client.process_audio(
            "path/to/your_file.opus",
            ProcessingSettings(
                mode="stt",
                format_output="json",
                transcription_settings={"emotional": True}
            )
        )
        print(result)

        # Асинхронная обработка: клиент вернёт job_id, а затем будет регулярно опрашивать статус задачи
        async_result = await client.process_audio(
            "path/to/your_file.opus",
            ProcessingSettings(
                mode="stt",
                format_output="json",
                transcription_settings={"emotional": True},
                async_process=True
            )
        )
        print(async_result)

        # Пример работы с микрофоном (подробнее в разделе "Работа с микрофоном")
        for mic_chunk in client.async_microphone_stream(mic_index=2):
            print(mic_chunk)

asyncio.run(main())
```
----------------------------------------------------------------

# **Режимы обработки аудио**

## 1. Обработка файла (process_audio)
  
   • Клиент отправляет аудиофайл на сервер через HTTP запрос  
   • Параметры задаются через объект ProcessingSettings  
   • Если параметр async_process установлен в True, клиент будет опрашивать статус обработки до получения результата  
     
   ### Пример настроек:
```
ProcessingSettings(
    mode="stt",                   # Стандартный режим распознавания речи (stt | diarization | both)
    format_output="json",         # Формат возврата результата (json | text)
    async_process=False,          # False – синхронная обработка; True – асинхронная обработка
    transcription_settings={      # Дополнительные настройки транскрипции
        "emotional": True         # Включение режима эмоциональной обработки
    }
)
```

## 2. Потоковая обработка файла (stream_audio)
  
   • Используется WebSocket соединение для передачи аудио чанками  
   • Изначально в вебсокет отправляются настройки обработки, полученные через settings.json()  
   • Сервер в режиме стриминга возвращает промежуточные результаты, которые можно обрабатывать в режиме реального времени
     
#### Для включения режима emotional достаточно передать в transcription_settings параметр "emotional": True

## 3. Обработка аудио с микрофона (async_microphone_stream)
  
   • Позволяет передавать аудио с микрофонного входа в режиме реального времени  
   • Перед началом записи рекомендуется выполнить предварительную проверку подключения микрофона:
        
```
mics = AudioClient.list_microphones()
# Вывод списка доступных устройств и выбор нужного индекса
```
     
   • Внутри метода используется sounddevice.InputStream для чтения аудио с выбранного устройства  
   • Полученные аудио чанк преобразуются в формат PCM 16-bit и отправляются через вебсокет на сервер
  
   ### Пример предварительной проверки:
```
import numpy as np
import sounddevice as sd
data_received = False
def callback(indata, frames, time, status):
    if np.max(np.abs(indata)) > 0.01:
        data_received = True

with sd.InputStream(callback=callback, samplerate=16000, channels=1):
    await asyncio.sleep(2)
if not data_received:
    print("Данные не получены. Проверьте микрофон.")
```

# **Конфигурация и настройки**

Объект ProcessingSettings позволяет гибко настраивать режим работы. Ключевые параметры:

• mode – режим обработки (например, "stt" – распознавание речи).  
• format_output – формат возвращаемых данных ("json", "text").  
• async_process – параметр, определяющий синхронную (False) или асинхронную (True) обработку аудио.  
• transcription_settings – словарь дополнительных настроек, в который можно передать:
   – "task" – задача, например "transcribe"  
   – "language" – код языка (например, "ru")  
   – "emotional" – если True, сервер активирует режим эмоционального анализа (рекомендуется для задач, где важна интонация и эмоциональная окраска речи)

### Пример включения эмоционального режима:
```
transcription_settings = {
    "task": "transcribe",
    "emotional": True,
    "language": "ru"
}
```

# Примеры использования

## A. Стриминговая обработка аудиофайла

  • Клиент открывает вебсокет соединение с сервером  
  • Отправляет настройки и затем передает аудиофайл чанками  
  • Результаты возвращаются в режиме реального времени
```
async for chunk in client.stream_audio("audio.opus", settings):
    print(chunk)
```

## B. Синхронная обработка файла

  • Клиент отправляет запрос с файлом и ждёт полного ответа от сервера
``` 
result = await client.process_audio("audio.opus", settings)
print(result)
```

## C. Асинхронная обработка файла (job polling)

  • При async_process=True клиент получает job_id и периодически опрашивает статус обработки
```
async_result = await client.process_audio("audio.opus", settings_with_async)
print(async_result)
```

## D. Обработка аудио с микрофона

  • Используйте метод list_microphones() для отображения списка доступных устройств  
  • Выберите нужный индекс микрофона и запустите потоковую передачу аудио с микрофона
```  
async for chunk in client.async_microphone_stream(chosen_mic):
    print(chunk)
```

# **Логи и отладка**

Клиент использует стандартный модуль logging для вывода служебной информации. Рекомендуется:

• Настроить логгеры для отладки ошибок подключения (например, к PortAudio)
• Проверять корректность работы предварительных callback’ов и обработку уровня сигнала с микрофона

Пример настройки логгера:
```
import logging
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
```

# **Заключение**

**Audio Processor Client** представляет собой универсальное решение для интеграции с сервером транскрипции. Библиотека позволяет:

– Обрабатывать как готовые аудиофайлы, так и потоки аудио  
– Включать режим эмоциональной транскрипции посредством передачи параметра transcription_settings: {"emotional": True}  
– Обеспечивать гибкий выбор между синхронной и асинхронной обработкой  
– Легко работать с аудиоустройствами (микрофонами) и получать список доступных устройств

Придерживайтесь описанных выше примеров и лучших практик для интеграции с вашим сервером, а также проведите предварительные тесты подключения микрофонов, чтобы обеспечить корректное получение аудиоданных.

Для любых вопросов или предложений по улучшению, пожалуйста, обращайтесь к разработчику.

# **Пример файловой структуры проекта**

```
project/
├── src/
│   └── audio_processor/
│       ├── __init__.py       
│       ├── client.py         # Основной код клиента
│       ├── exceptions.py     # Пользовательские исключения
│       ├── models.py         # Pydantic модели
│       └── utils.py          # Вспомогательный код (MicrophoneStream)
├── examples/                # Папка с примерами НЕ входит в пакет
│   └── test.py              # Пример использования
└── README.md

```

# **Вывод**

В этой документации подробно раскрыты все режимы работы с вашим клиентом транскрибатора. Особое внимание уделено режиму эмоциональной обработки, позволяющему учитывать эмоциональную окраску речи при транскрипции. Используйте предоставленные примеры в качестве основы для интеграции и дальнейшего развития функционала.

Удачной разработки!

            

Raw data

            {
    "_id": null,
    "home_page": "http://10.10.0.20:3000/SensoryLAB/sensory-audio-cli/src/branch/master/README.md",
    "name": "sensory-audio-cli",
    "maintainer": null,
    "docs_url": null,
    "requires_python": ">=3.8",
    "maintainer_email": null,
    "keywords": null,
    "author": "SensoryLAB",
    "author_email": "SensoryLAB <fox@sensorylab.ru>",
    "download_url": "https://files.pythonhosted.org/packages/7a/37/791be32a5e5bab5cbf9ea91c857324bb76927ad8c2f9a5a04a304a0051d3/sensory_audio_cli-0.1.2.tar.gz",
    "platform": null,
    "description": "# **Audio Processor Client**\r\n\r\n\r\n\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435\r\n\r\n**Audio Processor Client** \u2013 \u044d\u0442\u043e \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u0430\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0434\u043b\u044f \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u043c \u0442\u0440\u0430\u043d\u0441\u043a\u0440\u0438\u0431\u0430\u0442\u043e\u0440\u0430. \u041a\u043b\u0438\u0435\u043d\u0442 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0430\u0443\u0434\u0438\u043e:\r\n \r\n    \u2022 \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0430\u0443\u0434\u0438\u043e\u0444\u0430\u0439\u043b\u043e\u0432 \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0433\u043e (HTTP POST) \u0438 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0433\u043e (\u0437\u0430\u0434\u0430\u0447\u0438 \u0441 polling) \u0440\u0435\u0436\u0438\u043c\u043e\u0432  \r\n    \u2022 \u0421\u0442\u0440\u0438\u043c\u0438\u043d\u0433\u043e\u0432\u0430\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0430\u0443\u0434\u0438\u043e \u0447\u0435\u0440\u0435\u0437 WebSocket (\u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435 \u0444\u0430\u0439\u043b\u044b \u0438 \u043f\u043e\u0442\u043e\u043a \u0441 \u043c\u0438\u043a\u0440\u043e\u0444\u043e\u043d\u0430)  \r\n    \u2022 \u041e\u0431\u043d\u0430\u0440\u0443\u0436\u0435\u043d\u0438\u0435 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0445 \u043c\u0438\u043a\u0440\u043e\u0444\u043e\u043d\u043e\u0432 \u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u043f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043f\u0435\u0440\u0435\u0434 \u043d\u0430\u0447\u0430\u043b\u043e\u043c \u0437\u0430\u043f\u0438\u0441\u0438  \r\n    \u2022 \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0432\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 \u0440\u0435\u0436\u0438\u043c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u2013 emotional. \u0411\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u043d\u0435\u043c\u0443 \u0442\u0440\u0430\u043d\u0441\u043a\u0440\u0438\u0431\u0430\u0442\u043e\u0440 \u0430\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0440\u0435\u0447\u044c, \u043d\u043e \u0438 \u044d\u043c\u043e\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u0443\u044e \u043e\u043a\u0440\u0430\u0441\u043a\u0443 \u0433\u043e\u043b\u043e\u0441\u0430\r\n\r\n\u042d\u0442\u0430 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u0442 \u043b\u0443\u0447\u0448\u0438\u0435 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0438 \u0434\u043b\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043a\u043b\u0438\u0435\u043d\u0442\u0430 \u0438 \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u0435\u0442 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u044b\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u0440\u0430\u0431\u043e\u0442\u044b.\r\n\r\n# **\u0422\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f \u0438 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430**\r\n\r\n\u0414\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u043a\u043b\u0438\u0435\u043d\u0442\u0430 \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u044f\u0442\u0441\u044f Python 3.7+ \u0438 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438:\r\n```\r\n\u2013 asyncio  \r\n\u2013 httpx  \r\n\u2013 websockets  \r\n\u2013 pydantic  \r\n\u2013 numpy  \r\n\u2013 sounddevice  \r\n\u2013 pyaudio (\u0434\u043b\u044f \u0430\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u043d\u043e\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043c\u0438\u043a\u0440\u043e\u0444\u043e\u043d\u043e\u043c, \u0435\u0441\u043b\u0438 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f)\r\n```\r\n\r\n\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0447\u0435\u0440\u0435\u0437 pip):\r\n```\r\npip install httpx websockets pydantic numpy sounddevice pyaudio\r\n```\r\n\u0423\u0431\u0435\u0434\u0438\u0442\u0435\u0441\u044c, \u0447\u0442\u043e \u0430\u0443\u0434\u0438\u043e\u0434\u0440\u0430\u0439\u0432\u0435\u0440\u044b \u0438 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0430\u0443\u0434\u0438\u043e\u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430\u043c\u0438 (PortAudio) \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d\u044b \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e.\r\n\r\n# **\u0411\u044b\u0441\u0442\u0440\u044b\u0439 \u0441\u0442\u0430\u0440\u0442**\r\n\r\n\u0411\u0430\u0437\u043e\u0432\u0430\u044f \u0441\u0445\u0435\u043c\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043a\u043b\u0438\u0435\u043d\u0442\u0430 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a:\r\n\r\n1. \u0418\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u0443\u0439\u0442\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u043a\u043b\u0430\u0441\u0441\u044b:\r\n  \r\n    \u2022 **AudioClient** \u2013 \u0434\u043b\u044f \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0430\u0443\u0434\u0438\u043e  \r\n    \u2022 **ProcessingSettings** \u2013 \u0434\u043b\u044f \u0437\u0430\u0434\u0430\u043d\u0438\u044f \u0440\u0435\u0436\u0438\u043c\u0430 \u0442\u0440\u0430\u043d\u0441\u043a\u0440\u0438\u043f\u0446\u0438\u0438 \u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a\r\n\r\n2. \u0412\u044b\u0437\u044b\u0432\u0430\u0439\u0442\u0435 \u043c\u0435\u0442\u043e\u0434\u044b \u0434\u043b\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0430\u0443\u0434\u0438\u043e:\r\n  \r\n    \u2013 process_audio \u2013 \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u0430\u0443\u0434\u0438\u043e\u0444\u0430\u0439\u043b\u043e\u0432 (\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e \u0438\u043b\u0438 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e)  \r\n    \u2013 stream_audio \u2013 \u0434\u043b\u044f \u043f\u043e\u0442\u043e\u043a\u043e\u0432\u043e\u0439 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0444\u0430\u0439\u043b\u0430 \u0447\u0435\u0440\u0435\u0437 \u0432\u0435\u0431\u0441\u043e\u043a\u0435\u0442  \r\n    \u2013 async_microphone_stream \u2013 \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0430\u0443\u0434\u0438\u043e \u0441 \u043c\u0438\u043a\u0440\u043e\u0444\u043e\u043d\u0430 \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440 \u0432 \u0440\u0435\u0436\u0438\u043c\u0435 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438\r\n\r\n### \u041d\u0438\u0436\u0435 \u043f\u0440\u0438\u0432\u0435\u0434\u0451\u043d \u0443\u043f\u0440\u043e\u0449\u0451\u043d\u043d\u044b\u0439 \u043f\u0440\u0438\u043c\u0435\u0440:\r\n\r\n----------------------------------------------------------------\r\n```\r\nimport asyncio\r\nfrom audio_processor.client import AudioClient, ProcessingSettings\r\n\r\nasync def main():\r\n    async with AudioClient(base_url=\"http://\u0430\u0434\u0440\u0435\u0441_\u0432\u0430\u0448\u0435\u0433\u043e_\u0441\u0435\u0440\u0432\u0435\u0440\u0430:8000\") as client:\r\n        # \u041f\u0440\u0438\u043c\u0435\u0440 \u0441\u0442\u0440\u0438\u043c\u0438\u043d\u0433\u043e\u0432\u043e\u0439 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0444\u0430\u0439\u043b\u0430\r\n        async for chunk in client.stream_audio(\r\n            \"path/to/your_file.opus\",\r\n            ProcessingSettings(\r\n                mode=\"stt\",\r\n                format_output=\"json\",\r\n                transcription_settings={\"task\": \"transcribe\", \"emotional\": True, \"language\": \"ru\"}\r\n            )\r\n        ):\r\n            print(chunk)\r\n\r\n        # \u0421\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u0430\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430: \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u043f\u043e\u0441\u043b\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438\r\n        result = await client.process_audio(\r\n            \"path/to/your_file.opus\",\r\n            ProcessingSettings(\r\n                mode=\"stt\",\r\n                format_output=\"json\",\r\n                transcription_settings={\"emotional\": True}\r\n            )\r\n        )\r\n        print(result)\r\n\r\n        # \u0410\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u0430\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430: \u043a\u043b\u0438\u0435\u043d\u0442 \u0432\u0435\u0440\u043d\u0451\u0442 job_id, \u0430 \u0437\u0430\u0442\u0435\u043c \u0431\u0443\u0434\u0435\u0442 \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u043e \u043e\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0442\u044c \u0441\u0442\u0430\u0442\u0443\u0441 \u0437\u0430\u0434\u0430\u0447\u0438\r\n        async_result = await client.process_audio(\r\n            \"path/to/your_file.opus\",\r\n            ProcessingSettings(\r\n                mode=\"stt\",\r\n                format_output=\"json\",\r\n                transcription_settings={\"emotional\": True},\r\n                async_process=True\r\n            )\r\n        )\r\n        print(async_result)\r\n\r\n        # \u041f\u0440\u0438\u043c\u0435\u0440 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043c\u0438\u043a\u0440\u043e\u0444\u043e\u043d\u043e\u043c (\u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u0432 \u0440\u0430\u0437\u0434\u0435\u043b\u0435 \"\u0420\u0430\u0431\u043e\u0442\u0430 \u0441 \u043c\u0438\u043a\u0440\u043e\u0444\u043e\u043d\u043e\u043c\")\r\n        for mic_chunk in client.async_microphone_stream(mic_index=2):\r\n            print(mic_chunk)\r\n\r\nasyncio.run(main())\r\n```\r\n----------------------------------------------------------------\r\n\r\n# **\u0420\u0435\u0436\u0438\u043c\u044b \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0430\u0443\u0434\u0438\u043e**\r\n\r\n## 1. \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0444\u0430\u0439\u043b\u0430 (process_audio)\r\n  \r\n   \u2022 \u041a\u043b\u0438\u0435\u043d\u0442 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u0430\u0443\u0434\u0438\u043e\u0444\u0430\u0439\u043b \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440 \u0447\u0435\u0440\u0435\u0437 HTTP \u0437\u0430\u043f\u0440\u043e\u0441  \r\n   \u2022 \u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0437\u0430\u0434\u0430\u044e\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 \u043e\u0431\u044a\u0435\u043a\u0442 ProcessingSettings  \r\n   \u2022 \u0415\u0441\u043b\u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 async_process \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d \u0432 True, \u043a\u043b\u0438\u0435\u043d\u0442 \u0431\u0443\u0434\u0435\u0442 \u043e\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0442\u044c \u0441\u0442\u0430\u0442\u0443\u0441 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0434\u043e \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430  \r\n     \r\n   ### \u041f\u0440\u0438\u043c\u0435\u0440 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a:\r\n```\r\nProcessingSettings(\r\n    mode=\"stt\",                   # \u0421\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 \u0440\u0435\u0436\u0438\u043c \u0440\u0430\u0441\u043f\u043e\u0437\u043d\u0430\u0432\u0430\u043d\u0438\u044f \u0440\u0435\u0447\u0438 (stt | diarization | both)\r\n    format_output=\"json\",         # \u0424\u043e\u0440\u043c\u0430\u0442 \u0432\u043e\u0437\u0432\u0440\u0430\u0442\u0430 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430 (json | text)\r\n    async_process=False,          # False \u2013 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u0430\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430; True \u2013 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u0430\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430\r\n    transcription_settings={      # \u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0442\u0440\u0430\u043d\u0441\u043a\u0440\u0438\u043f\u0446\u0438\u0438\r\n        \"emotional\": True         # \u0412\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0440\u0435\u0436\u0438\u043c\u0430 \u044d\u043c\u043e\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0439 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438\r\n    }\r\n)\r\n```\r\n\r\n## 2. \u041f\u043e\u0442\u043e\u043a\u043e\u0432\u0430\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0444\u0430\u0439\u043b\u0430 (stream_audio)\r\n  \r\n   \u2022 \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f WebSocket \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u0430\u0443\u0434\u0438\u043e \u0447\u0430\u043d\u043a\u0430\u043c\u0438  \r\n   \u2022 \u0418\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u0432 \u0432\u0435\u0431\u0441\u043e\u043a\u0435\u0442 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438, \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0435 \u0447\u0435\u0440\u0435\u0437 settings.json()  \r\n   \u2022 \u0421\u0435\u0440\u0432\u0435\u0440 \u0432 \u0440\u0435\u0436\u0438\u043c\u0435 \u0441\u0442\u0440\u0438\u043c\u0438\u043d\u0433\u0430 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u044b\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0436\u043d\u043e \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0432 \u0440\u0435\u0436\u0438\u043c\u0435 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438\r\n     \r\n#### \u0414\u043b\u044f \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0440\u0435\u0436\u0438\u043c\u0430 emotional \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0432 transcription_settings \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \"emotional\": True\r\n\r\n## 3. \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0430\u0443\u0434\u0438\u043e \u0441 \u043c\u0438\u043a\u0440\u043e\u0444\u043e\u043d\u0430 (async_microphone_stream)\r\n  \r\n   \u2022 \u041f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u0430\u0443\u0434\u0438\u043e \u0441 \u043c\u0438\u043a\u0440\u043e\u0444\u043e\u043d\u043d\u043e\u0433\u043e \u0432\u0445\u043e\u0434\u0430 \u0432 \u0440\u0435\u0436\u0438\u043c\u0435 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438  \r\n   \u2022 \u041f\u0435\u0440\u0435\u0434 \u043d\u0430\u0447\u0430\u043b\u043e\u043c \u0437\u0430\u043f\u0438\u0441\u0438 \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u0442\u0441\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u0443\u044e \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043c\u0438\u043a\u0440\u043e\u0444\u043e\u043d\u0430:\r\n        \r\n```\r\nmics = AudioClient.list_microphones()\r\n# \u0412\u044b\u0432\u043e\u0434 \u0441\u043f\u0438\u0441\u043a\u0430 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0445 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432 \u0438 \u0432\u044b\u0431\u043e\u0440 \u043d\u0443\u0436\u043d\u043e\u0433\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0430\r\n```\r\n     \r\n   \u2022 \u0412\u043d\u0443\u0442\u0440\u0438 \u043c\u0435\u0442\u043e\u0434\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f sounddevice.InputStream \u0434\u043b\u044f \u0447\u0442\u0435\u043d\u0438\u044f \u0430\u0443\u0434\u0438\u043e \u0441 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u043e\u0433\u043e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430  \r\n   \u2022 \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0435 \u0430\u0443\u0434\u0438\u043e \u0447\u0430\u043d\u043a \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u044e\u0442\u0441\u044f \u0432 \u0444\u043e\u0440\u043c\u0430\u0442 PCM 16-bit \u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 \u0432\u0435\u0431\u0441\u043e\u043a\u0435\u0442 \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\r\n  \r\n   ### \u041f\u0440\u0438\u043c\u0435\u0440 \u043f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438:\r\n```\r\nimport numpy as np\r\nimport sounddevice as sd\r\ndata_received = False\r\ndef callback(indata, frames, time, status):\r\n    if np.max(np.abs(indata)) > 0.01:\r\n        data_received = True\r\n\r\nwith sd.InputStream(callback=callback, samplerate=16000, channels=1):\r\n    await asyncio.sleep(2)\r\nif not data_received:\r\n    print(\"\u0414\u0430\u043d\u043d\u044b\u0435 \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u044b. \u041f\u0440\u043e\u0432\u0435\u0440\u044c\u0442\u0435 \u043c\u0438\u043a\u0440\u043e\u0444\u043e\u043d.\")\r\n```\r\n\r\n# **\u041a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f \u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438**\r\n\r\n\u041e\u0431\u044a\u0435\u043a\u0442 ProcessingSettings \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0433\u0438\u0431\u043a\u043e \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0442\u044c \u0440\u0435\u0436\u0438\u043c \u0440\u0430\u0431\u043e\u0442\u044b. \u041a\u043b\u044e\u0447\u0435\u0432\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b:\r\n\r\n\u2022 mode \u2013 \u0440\u0435\u0436\u0438\u043c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \"stt\" \u2013 \u0440\u0430\u0441\u043f\u043e\u0437\u043d\u0430\u0432\u0430\u043d\u0438\u0435 \u0440\u0435\u0447\u0438).  \r\n\u2022 format_output \u2013 \u0444\u043e\u0440\u043c\u0430\u0442 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 (\"json\", \"text\").  \r\n\u2022 async_process \u2013 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440, \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u044e\u0449\u0438\u0439 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u0443\u044e (False) \u0438\u043b\u0438 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u0443\u044e (True) \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u0430\u0443\u0434\u0438\u043e.  \r\n\u2022 transcription_settings \u2013 \u0441\u043b\u043e\u0432\u0430\u0440\u044c \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a, \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c:\r\n   \u2013 \"task\" \u2013 \u0437\u0430\u0434\u0430\u0447\u0430, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \"transcribe\"  \r\n   \u2013 \"language\" \u2013 \u043a\u043e\u0434 \u044f\u0437\u044b\u043a\u0430 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \"ru\")  \r\n   \u2013 \"emotional\" \u2013 \u0435\u0441\u043b\u0438 True, \u0441\u0435\u0440\u0432\u0435\u0440 \u0430\u043a\u0442\u0438\u0432\u0438\u0440\u0443\u0435\u0442 \u0440\u0435\u0436\u0438\u043c \u044d\u043c\u043e\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0430\u043d\u0430\u043b\u0438\u0437\u0430 (\u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0437\u0430\u0434\u0430\u0447, \u0433\u0434\u0435 \u0432\u0430\u0436\u043d\u0430 \u0438\u043d\u0442\u043e\u043d\u0430\u0446\u0438\u044f \u0438 \u044d\u043c\u043e\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u0430\u044f \u043e\u043a\u0440\u0430\u0441\u043a\u0430 \u0440\u0435\u0447\u0438)\r\n\r\n### \u041f\u0440\u0438\u043c\u0435\u0440 \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u044d\u043c\u043e\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0440\u0435\u0436\u0438\u043c\u0430:\r\n```\r\ntranscription_settings = {\r\n    \"task\": \"transcribe\",\r\n    \"emotional\": True,\r\n    \"language\": \"ru\"\r\n}\r\n```\r\n\r\n# \u041f\u0440\u0438\u043c\u0435\u0440\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f\r\n\r\n## A. \u0421\u0442\u0440\u0438\u043c\u0438\u043d\u0433\u043e\u0432\u0430\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0430\u0443\u0434\u0438\u043e\u0444\u0430\u0439\u043b\u0430\r\n\r\n  \u2022 \u041a\u043b\u0438\u0435\u043d\u0442 \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u0432\u0435\u0431\u0441\u043e\u043a\u0435\u0442 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u0441 \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u043c  \r\n  \u2022 \u041e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0438 \u0437\u0430\u0442\u0435\u043c \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442 \u0430\u0443\u0434\u0438\u043e\u0444\u0430\u0439\u043b \u0447\u0430\u043d\u043a\u0430\u043c\u0438  \r\n  \u2022 \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u044e\u0442\u0441\u044f \u0432 \u0440\u0435\u0436\u0438\u043c\u0435 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438\r\n```\r\nasync for chunk in client.stream_audio(\"audio.opus\", settings):\r\n    print(chunk)\r\n```\r\n\r\n## B. \u0421\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u0430\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0444\u0430\u0439\u043b\u0430\r\n\r\n  \u2022 \u041a\u043b\u0438\u0435\u043d\u0442 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u0437\u0430\u043f\u0440\u043e\u0441 \u0441 \u0444\u0430\u0439\u043b\u043e\u043c \u0438 \u0436\u0434\u0451\u0442 \u043f\u043e\u043b\u043d\u043e\u0433\u043e \u043e\u0442\u0432\u0435\u0442\u0430 \u043e\u0442 \u0441\u0435\u0440\u0432\u0435\u0440\u0430\r\n``` \r\nresult = await client.process_audio(\"audio.opus\", settings)\r\nprint(result)\r\n```\r\n\r\n## C. \u0410\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u0430\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0444\u0430\u0439\u043b\u0430 (job polling)\r\n\r\n  \u2022 \u041f\u0440\u0438 async_process=True \u043a\u043b\u0438\u0435\u043d\u0442 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 job_id \u0438 \u043f\u0435\u0440\u0438\u043e\u0434\u0438\u0447\u0435\u0441\u043a\u0438 \u043e\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u0442 \u0441\u0442\u0430\u0442\u0443\u0441 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438\r\n```\r\nasync_result = await client.process_audio(\"audio.opus\", settings_with_async)\r\nprint(async_result)\r\n```\r\n\r\n## D. \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0430\u0443\u0434\u0438\u043e \u0441 \u043c\u0438\u043a\u0440\u043e\u0444\u043e\u043d\u0430\r\n\r\n  \u2022 \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 \u043c\u0435\u0442\u043e\u0434 list_microphones() \u0434\u043b\u044f \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0441\u043f\u0438\u0441\u043a\u0430 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0445 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432  \r\n  \u2022 \u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u043d\u0443\u0436\u043d\u044b\u0439 \u0438\u043d\u0434\u0435\u043a\u0441 \u043c\u0438\u043a\u0440\u043e\u0444\u043e\u043d\u0430 \u0438 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u0435 \u043f\u043e\u0442\u043e\u043a\u043e\u0432\u0443\u044e \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0443 \u0430\u0443\u0434\u0438\u043e \u0441 \u043c\u0438\u043a\u0440\u043e\u0444\u043e\u043d\u0430\r\n```  \r\nasync for chunk in client.async_microphone_stream(chosen_mic):\r\n    print(chunk)\r\n```\r\n\r\n# **\u041b\u043e\u0433\u0438 \u0438 \u043e\u0442\u043b\u0430\u0434\u043a\u0430**\r\n\r\n\u041a\u043b\u0438\u0435\u043d\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 \u043c\u043e\u0434\u0443\u043b\u044c logging \u0434\u043b\u044f \u0432\u044b\u0432\u043e\u0434\u0430 \u0441\u043b\u0443\u0436\u0435\u0431\u043d\u043e\u0439 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438. \u0420\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u0442\u0441\u044f:\r\n\r\n\u2022 \u041d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043b\u043e\u0433\u0433\u0435\u0440\u044b \u0434\u043b\u044f \u043e\u0442\u043b\u0430\u0434\u043a\u0438 \u043e\u0448\u0438\u0431\u043e\u043a \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043a PortAudio)\r\n\u2022 \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u044b \u043f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 callback\u2019\u043e\u0432 \u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u0443\u0440\u043e\u0432\u043d\u044f \u0441\u0438\u0433\u043d\u0430\u043b\u0430 \u0441 \u043c\u0438\u043a\u0440\u043e\u0444\u043e\u043d\u0430\r\n\r\n\u041f\u0440\u0438\u043c\u0435\u0440 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043b\u043e\u0433\u0433\u0435\u0440\u0430:\r\n```\r\nimport logging\r\nlogging.basicConfig(level=logging.INFO)\r\nlogger = logging.getLogger(__name__)\r\n```\r\n\r\n# **\u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435**\r\n\r\n**Audio Processor Client** \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 \u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0438 \u0441 \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u043c \u0442\u0440\u0430\u043d\u0441\u043a\u0440\u0438\u043f\u0446\u0438\u0438. \u0411\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442:\r\n\r\n\u2013 \u041e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u043a\u0430\u043a \u0433\u043e\u0442\u043e\u0432\u044b\u0435 \u0430\u0443\u0434\u0438\u043e\u0444\u0430\u0439\u043b\u044b, \u0442\u0430\u043a \u0438 \u043f\u043e\u0442\u043e\u043a\u0438 \u0430\u0443\u0434\u0438\u043e  \r\n\u2013 \u0412\u043a\u043b\u044e\u0447\u0430\u0442\u044c \u0440\u0435\u0436\u0438\u043c \u044d\u043c\u043e\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0439 \u0442\u0440\u0430\u043d\u0441\u043a\u0440\u0438\u043f\u0446\u0438\u0438 \u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u043e\u043c \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430 transcription_settings: {\"emotional\": True}  \r\n\u2013 \u041e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0442\u044c \u0433\u0438\u0431\u043a\u0438\u0439 \u0432\u044b\u0431\u043e\u0440 \u043c\u0435\u0436\u0434\u0443 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0439 \u0438 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0439 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u043e\u0439  \r\n\u2013 \u041b\u0435\u0433\u043a\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u0430\u0443\u0434\u0438\u043e\u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430\u043c\u0438 (\u043c\u0438\u043a\u0440\u043e\u0444\u043e\u043d\u0430\u043c\u0438) \u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0445 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\r\n\r\n\u041f\u0440\u0438\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0439\u0442\u0435\u0441\u044c \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0445 \u0432\u044b\u0448\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432 \u0438 \u043b\u0443\u0447\u0448\u0438\u0445 \u043f\u0440\u0430\u043a\u0442\u0438\u043a \u0434\u043b\u044f \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0438 \u0441 \u0432\u0430\u0448\u0438\u043c \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u043c, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043f\u0440\u043e\u0432\u0435\u0434\u0438\u0442\u0435 \u043f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0442\u0435\u0441\u0442\u044b \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043c\u0438\u043a\u0440\u043e\u0444\u043e\u043d\u043e\u0432, \u0447\u0442\u043e\u0431\u044b \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0442\u044c \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0435 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0430\u0443\u0434\u0438\u043e\u0434\u0430\u043d\u043d\u044b\u0445.\r\n\r\n\u0414\u043b\u044f \u043b\u044e\u0431\u044b\u0445 \u0432\u043e\u043f\u0440\u043e\u0441\u043e\u0432 \u0438\u043b\u0438 \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u043f\u043e \u0443\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u044e, \u043f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, \u043e\u0431\u0440\u0430\u0449\u0430\u0439\u0442\u0435\u0441\u044c \u043a \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0443.\r\n\r\n# **\u041f\u0440\u0438\u043c\u0435\u0440 \u0444\u0430\u0439\u043b\u043e\u0432\u043e\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u043f\u0440\u043e\u0435\u043a\u0442\u0430**\r\n\r\n```\r\nproject/\r\n\u251c\u2500\u2500 src/\r\n\u2502   \u2514\u2500\u2500 audio_processor/\r\n\u2502       \u251c\u2500\u2500 __init__.py       \r\n\u2502       \u251c\u2500\u2500 client.py         # \u041e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u043a\u043e\u0434 \u043a\u043b\u0438\u0435\u043d\u0442\u0430\r\n\u2502       \u251c\u2500\u2500 exceptions.py     # \u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0435 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f\r\n\u2502       \u251c\u2500\u2500 models.py         # Pydantic \u043c\u043e\u0434\u0435\u043b\u0438\r\n\u2502       \u2514\u2500\u2500 utils.py          # \u0412\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043a\u043e\u0434 (MicrophoneStream)\r\n\u251c\u2500\u2500 examples/                # \u041f\u0430\u043f\u043a\u0430 \u0441 \u043f\u0440\u0438\u043c\u0435\u0440\u0430\u043c\u0438 \u041d\u0415 \u0432\u0445\u043e\u0434\u0438\u0442 \u0432 \u043f\u0430\u043a\u0435\u0442\r\n\u2502   \u2514\u2500\u2500 test.py              # \u041f\u0440\u0438\u043c\u0435\u0440 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f\r\n\u2514\u2500\u2500 README.md\r\n\r\n```\r\n\r\n# **\u0412\u044b\u0432\u043e\u0434**\r\n\r\n\u0412 \u044d\u0442\u043e\u0439 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u0440\u0430\u0441\u043a\u0440\u044b\u0442\u044b \u0432\u0441\u0435 \u0440\u0435\u0436\u0438\u043c\u044b \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0432\u0430\u0448\u0438\u043c \u043a\u043b\u0438\u0435\u043d\u0442\u043e\u043c \u0442\u0440\u0430\u043d\u0441\u043a\u0440\u0438\u0431\u0430\u0442\u043e\u0440\u0430. \u041e\u0441\u043e\u0431\u043e\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u0443\u0434\u0435\u043b\u0435\u043d\u043e \u0440\u0435\u0436\u0438\u043c\u0443 \u044d\u043c\u043e\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0439 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0435\u043c\u0443 \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c \u044d\u043c\u043e\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u0443\u044e \u043e\u043a\u0440\u0430\u0441\u043a\u0443 \u0440\u0435\u0447\u0438 \u043f\u0440\u0438 \u0442\u0440\u0430\u043d\u0441\u043a\u0440\u0438\u043f\u0446\u0438\u0438. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043e\u0441\u043d\u043e\u0432\u044b \u0434\u043b\u044f \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0438 \u0438 \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u0433\u043e \u0440\u0430\u0437\u0432\u0438\u0442\u0438\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u0430.\r\n\r\n\u0423\u0434\u0430\u0447\u043d\u043e\u0439 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438!\r\n",
    "bugtrack_url": null,
    "license": null,
    "summary": "Client library for Audio Processing API",
    "version": "0.1.2",
    "project_urls": {
        "Homepage": "http://10.10.0.20:3000/SensoryLAB/sensory-audio-cli/src/branch/master/README.md"
    },
    "split_keywords": [],
    "urls": [
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "2245014d6e8fecee43173658a948afc96f86848052a7b6d274359c2563c2a6e9",
                "md5": "6f48f6431d0d49a9fbbdc0b32afdcbe5",
                "sha256": "6f9c5ba8ec02de80a82162a46c96984130a4a370b40cbed82bae4adca599a086"
            },
            "downloads": -1,
            "filename": "sensory_audio_cli-0.1.2-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "6f48f6431d0d49a9fbbdc0b32afdcbe5",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.8",
            "size": 11648,
            "upload_time": "2025-02-17T01:54:44",
            "upload_time_iso_8601": "2025-02-17T01:54:44.526414Z",
            "url": "https://files.pythonhosted.org/packages/22/45/014d6e8fecee43173658a948afc96f86848052a7b6d274359c2563c2a6e9/sensory_audio_cli-0.1.2-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "7a37791be32a5e5bab5cbf9ea91c857324bb76927ad8c2f9a5a04a304a0051d3",
                "md5": "1a325143845c1128e73a7c8160264cea",
                "sha256": "9d42c739d76f8091af9d02fb4291b1753a588bca66031ed78d676d93131d8e68"
            },
            "downloads": -1,
            "filename": "sensory_audio_cli-0.1.2.tar.gz",
            "has_sig": false,
            "md5_digest": "1a325143845c1128e73a7c8160264cea",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.8",
            "size": 15047,
            "upload_time": "2025-02-17T01:54:46",
            "upload_time_iso_8601": "2025-02-17T01:54:46.294422Z",
            "url": "https://files.pythonhosted.org/packages/7a/37/791be32a5e5bab5cbf9ea91c857324bb76927ad8c2f9a5a04a304a0051d3/sensory_audio_cli-0.1.2.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2025-02-17 01:54:46",
    "github": false,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "lcname": "sensory-audio-cli"
}
        
Elapsed time: 0.42109s