# **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"
}