Открыть меню
Платформа Эра. Документация
Toggle preferences menu
Открыть персональное меню
Вы не представились системе
Your IP address will be publicly visible if you make any edits.

Установка сервиса распознавания речи NanoASR: различия между версиями

Материал из Платформа Эра. Документации
Нет описания правки
 
(не показано 5 промежуточных версий этого же участника)
Строка 7: Строка 7:
Для установки требуется 4гб свободного дискового пространства.
Для установки требуется 4гб свободного дискового пространства.


Технически, утилита способна работать на минимальной конфигурации - 1 ядро CPU и 1гб ОЗУ. Единственное требование к CPU - поддержка AVX-инструкций. В таком случае, она сможет обрабатывать 1 параллельный запрос, со скоростью примерно 0.5 от реального времени (1 минуту записи обрабатывать за 2 минуты).
Технически, утилита способна работать на минимальной конфигурации - 1 ядро CPU и 1гб ОЗУ. Единственное требование к CPU - поддержка AVX-инструкций. В таком случае, она сможет обрабатывать 1 параллельный запрос, со скоростью примерно 0.5 от реального времени (1 минуту записи обрабатывать за 2 минуты). Точная скорость зависит от параметров CPU.


Рекомендуемые параметры сервера:
Рекомендуемые параметры сервера:


* 4 ядра CPU
* 4 ядра CPU, AVX-инструкции
* 4гб RAM
* 4гб RAM
* 20гб SSD
* 20гб SSD
Строка 26: Строка 26:
!Назначение
!Назначение
|-
|-
|gigaam-v3-rnnt-punct-ru
|gigaam-v3-ctc-punct-ru
|Распознавание речи
|Распознавание речи
|-
|-
Строка 56: Строка 56:
Скрипт автоматически установит утилиту в C:/Program Files/NanoASR, создаст сервис, загрузит веса всех необходимых моделей и установит ffmpeg для работы с mp3.
Скрипт автоматически установит утилиту в C:/Program Files/NanoASR, создаст сервис, загрузит веса всех необходимых моделей и установит ffmpeg для работы с mp3.


Для быстрой установки необходимо вызвать данную команду в Powershell:<syntaxhighlight lang="powershell">
Для быстрой установки необходимо выполнить данную команду в Powershell:<syntaxhighlight lang="powershell">
irm https://github.com/usunrise88/NanoASR/releases/latest/download/install.ps1 | iex
irm https://github.com/usunrise88/NanoASR/releases/latest/download/install.ps1 | iex
</syntaxhighlight>Доступны также ручная установка и установка с помощью docker, оба варианта описаны в [https://github.com/usunrise88/NanoASR readme на github].
</syntaxhighlight>Доступны также ручная установка и установка с помощью docker, оба варианта описаны в [https://github.com/usunrise88/NanoASR readme на github].
После установки будет отображены данные для подключения, включая токены доступа.


Если необходимо реализовать доступ к сервису из внешней сети, необходимо настроить на сервере реверс-прокси (например nginx или Caddy) с  TLS к порту 8080.
Если необходимо реализовать доступ к сервису из внешней сети, необходимо настроить на сервере реверс-прокси (например nginx или Caddy) с  TLS к порту 8080.
Строка 117: Строка 119:
|}
|}


=== Конфигурационный файл nanoasr.yaml ===
= Конфигурационный файл nanoasr.yaml =
 
==== server — HTTP-сервер ====
{| class="wikitable"
!Параметр
!По умолчанию
!Комментарий
|-
|<code>addr</code>
|<code>:8080</code>
|Адрес прослушивания. <code>auth.mode: open</code> разрешён только если это loopback-интерфейс
|-
|<code>read_header_timeout</code>
|<code>10s</code>
|Таймаут чтения заголовков запроса
|-
|<code>max_upload_bytes</code>
|<code>1073741824</code>
|1 ГиБ. Подобрано под <code>max_duration</code>: 4 часа моно 16 кГц WAV ≈ 440 МБ
|-
|<code>shutdown_grace</code>
|<code>30s</code>
|Сколько ждать дорабатывающие задачи при остановке
|}
 
==== auth — доступ ====
{| class="wikitable"
!Параметр
!По умолчанию
!Комментарий
|-
|<code>mode</code>
|<code>apikey</code>
|<code>apikey</code> или <code>open</code>; <code>open</code> вне loopback — отказ при старте
|-
|<code>keys</code>
|<code>[]</code>
|В режиме <code>apikey</code> нужен хотя бы один, иначе сервер не стартует
|}
Поля ключа: <code>name</code> — имя; <code>key</code> — сам секрет или <code>sha256:<hex></code> (чтобы не хранить открытым); <code>admin: false</code> — право управлять моделями; <code>rps: 0</code> — без ограничения скорости; <code>priority: batch</code> — <code>interactive</code> пускает задачи этого ключа вперёд очереди.
 
==== api / ui ====
{| class="wikitable"
!Параметр
!По умолчанию
!Комментарий
|-
|<code>api.dialects</code>
|<code>[openai, native]</code>
|В поставляемом файле и после <code>init</code> — <code>[openai, native, era]</code>. <code>era</code> монтируется в корень, поэтому включается осознанно
|-
|<code>ui.enabled</code>
|<code>true</code>
|Встроенный веб-интерфейс для тестирования.
|-
|<code>ui.path</code>
|<code>/ui</code>
|Путь освобождён от авторизации, поэтому <code>/</code> и пересечение с API запрещены проверкой
|}
 
==== audio — приём и декодирование ====
{| class="wikitable"
!Параметр
!По умолчанию
!Комментарий
|-
|<code>ffmpeg_path</code>
|<code>ffmpeg</code>
|Пусто → только WAV/PCM, остальное отклоняется с 415
|-
|<code>ffmpeg_timeout</code>
|<code>120s</code>
|Предел на одно декодирование
|-
|<code>max_duration</code>
|<code>4h</code>
|Верхняя граница длительности файла; <code>0</code> — без ограничения
|-
|<code>target_sample_rate</code>
|<code>16000</code>
|Только 16000: все модели VAD и диаризации 16 кГц
|-
|<code>channel_mode</code>
|<code>downmix</code>
|<code>downmix</code><nowiki> | </nowiki><code>first</code><nowiki> | </nowiki><code>split</code>
|-
|<code>max_split_channels</code>
|<code>2</code>
|<code>split</code> декодирует все каналы целиком; 2 — пара телефонных плеч
|-
|<code>max_decoded_bytes</code>
|<code>0</code>
|→ <code>max_duration × rate × 4 × max_split_channels</code>
|}
 
==== vad — детектор речи ====
{| class="wikitable"
!Параметр
!По умолчанию
!Комментарий
|-
|<code>enabled</code>
|<code>true</code>
|
|-
|<code>model</code>
|<code>silero-vad-v5</code>
|
|-
|<code>threshold</code>
|<code>0.5</code>
|Порог вероятности речи
|-
|<code>min_silence_ms</code>
|<code>300</code>
|Короче — не считается паузой
|-
|<code>min_speech_ms</code>
|<code>250</code>
|Короче — не считается речью
|-
|<code>max_speech_sec</code>
|<code>20</code>
|Без верхней границы монолог станет одним огромным сегментом
|}
 
==== asr — распознавание ====
{| class="wikitable"
!Параметр
!По умолчанию
!Комментарий
|-
|<code>models_dir</code>
|<code>/var/lib/nanoasr/models</code>
|
|-
|<code>default_model</code>
|<code>gigaam-v3-ctc-punct-ru</code>
|Русская пунктуация и регистр приходят из самой модели
|-
|<code>max_resident_models</code>
|<code>0</code>
|→ <code>clamp(max_model_rss_mb / 1500, 1..6)</code>
|-
|<code>max_model_rss_mb</code>
|<code>0</code>
|→ <code>clamp(RAM / 2, 1024..16384)</code>
|-
|<code>inference_slots</code>
|<code>0</code>
|→ число CPU (GOMAXPROCS)
|-
|<code>num_threads</code>
|<code>0</code>
|→ <code>clamp(CPU / 2, 1..8)</code>, на один экземпляр модели
|-
|<code>idle_ttl</code>
|<code>15m</code>
|Через сколько простоя модель выгружается из пула
|-
|<code>acquire_timeout</code>
|<code>30s</code>
|Ожидание свободного слота инференса
|-
|<code>batch.max_size</code>
|<code>8</code>
|Сегментов в батче
|-
|<code>batch.max_seconds</code>
|<code>60</code>
|Суммарная длительность батча
|-
|<code>variants.max</code>
|<code>0</code>
|Сколько дополнительных копий модели под пер-запросные настройки; <code>0</code> — настройки запроса игнорируются с предупреждением
|-
|<code>variants.allow_hotwords</code>
|<code>false</code>
|Требует <code>variants.max > 0</code>
|}
 
==== registry — реестр моделей ====
{| class="wikitable"
!Параметр
!По умолчанию
!Комментарий
|-
|<code>allow_download</code>
|<code>true</code>
|Скачивание весов по запросу
|-
|<code>catalog_url</code>
|<code>""</code>
|Пусто → встроенный каталог
|-
|<code>mirrors</code>
|<code>[]</code>
|Зеркала для загрузки
|-
|<code>download_concurrency</code>
|<code>2</code>
|Параллельных загрузок
|-
|<code>strict_license</code>
|<code>false</code>
|<code>true</code> → отказывать некоммерческим весам
|}
 
==== jobs — очередь ====
{| class="wikitable"
!Параметр
!По умолчанию
!Комментарий
|-
|<code>queue_size</code>
|<code>100</code>
|Мест в очереди
|-
|<code>max_concurrent</code>
|<code>0</code>
|→ <code>clamp(CPU / num_threads, 1..8)</code>; при <code>channel_mode: split</code> делится на число каналов
|-
|<code>max_queued_bytes</code>
|<code>4294967296</code>
|4 ГиБ аудио на диске; не меньше <code>max_upload_bytes</code>, превышение → 429 с Retry-After
|-
|<code>max_processing_time</code>
|<code>30m</code>
|Предел на одну задачу
|-
|<code>history_ttl</code>
|<code>720h</code>
|30 суток метаданных и транскриптов
|-
|<code>webhook_secret</code>
|<code>""</code>
|Подпись <code>X-NanoASR-Signature</code>; пусто → без подписи и предупреждение в лог
|-
|<code>webhook_allow_private</code>
|<code>false</code>
|Разрешает webhook на приватные адреса; само требует loopback
|}
 
==== postproc — постобработка ====
{| class="wikitable"
!Параметр
!По умолчанию
!Комментарий
|-
|<code>punctuation.enabled</code>
|<code>false</code>
|Нужно только моделям без пунктуации в словаре
|-
|<code>punctuation.model</code>
|<code>""</code>
|Модель из каталога вида punctuation
|-
|<code>itn.enabled</code>
|<code>false</code>
|Числа, даты, время, валюта, телефоны, проценты
|-
|<code>itn.locale</code>
|<code>ru</code>
|
|-
|<code>hotwords.enabled</code>
|<code>false</code>
|Требует <code>asr.variants.max > 0</code>
|-
|<code>hotwords.default_score</code>
|<code>1.5</code>
|Вес, когда клиент не указал свой
|}
 
==== diarization — разделение по говорящим ====
{| class="wikitable"
!Параметр
!По умолчанию
!Комментарий
|-
|<code>enabled</code>
|<code>false</code>
|<code>nanoasr init</code> включает (если не <code>-no-diarize</code>)
|-
|<code>segmentation_model</code>
|<code>pyannote-segmentation-3</code>
|
|-
|<code>embedding_model</code>
|<code>campplus-sv-zh-en</code>
|Измерено: 2.9% DER при известном числе говорящих против 40.3% у voxceleb-модели
|-
|<code>clustering.num_clusters</code>
|<code>0</code>
|<code>0</code> → кластеризовать по порогу. Известное число говорящих сильнее любого порога
|-
|<code>clustering.threshold</code>
|<code>0.85</code>
|Выше — охотнее объединяет. У sherpa-onnx 0.5, что дробит диалог двоих на 36 «говорящих»
|-
|<code>min_duration_on</code>
|<code>0.3</code>
|Короче — реплика отбрасывается
|-
|<code>min_duration_off</code>
|<code>0.5</code>
|Короче — соседние реплики склеиваются
|}
 
==== storage / log ====
{| class="wikitable"
!Параметр
!По умолчанию
!Комментарий
|-
|<code>storage.db_path</code>
|/var/lib/nanoasr/nanoasr.db
|База задач
|-
|<code>storage.temp_dir</code>
|<code>""</code>
|→ <code><системный temp>/nanoasr-spool</code>. Аудио живёт здесь только до завершения задачи, настройки «хранить дольше» нет
|-
|<code>log.level</code>
|<code>info</code>
|<code>debug</code><nowiki> | </nowiki><code>info</code><nowiki> | </nowiki><code>warn</code><nowiki> | </nowiki><code>error</code>
|-
|<code>log.format</code>
|<code>json</code>
|<code>json</code><nowiki> | </nowiki><code>text</code>
|}

Текущая версия от 16:05, 18 сентября 2026

Общая информация

NanoASR - это утилита с открытым исходным кодом, позволяющая запускать модели машинного обучения для распознавания речи (транскрибации) и разделения спикеров (диаризации).

Данный проект позволяет запускать передовые модели для распознавания речи на серверах, не оборудованных графическими ускорителями.

Системные требования

Для установки требуется 4гб свободного дискового пространства.

Технически, утилита способна работать на минимальной конфигурации - 1 ядро CPU и 1гб ОЗУ. Единственное требование к CPU - поддержка AVX-инструкций. В таком случае, она сможет обрабатывать 1 параллельный запрос, со скоростью примерно 0.5 от реального времени (1 минуту записи обрабатывать за 2 минуты). Точная скорость зависит от параметров CPU.

Рекомендуемые параметры сервера:

  • 4 ядра CPU, AVX-инструкции
  • 4гб RAM
  • 20гб SSD

В таком режиме, NanoASR может обрабатывать до 4 параллельных запросов со скоростью реального времени (минуту записи за минуту расчетов), либо 2 параллельных запроса со скоростью х2 (минуту записи за 30 секунд расчетов).

Технические детали

Утилита написана на языке Golang и представляет собой единый бинарный файл. В качестве среды исполнения моделей используется библиотека sherpa-onnx.

Утилита поддерживает различные архитектуры моделей, однако "из коробки" загружает следующий набор:

Модели NanoASR
Модель Назначение
gigaam-v3-ctc-punct-ru Распознавание речи
silero-vad-v5 Детектор голосовой активности
pyannote-segmentation-3 Модель разделения спикеров
campplus-sv-zh-en Модель построения "слепков" голосов (голосовых эмбеддингов)

Установка на Linux

Результат установки на Linux

Доступна быстрая установка с помощью готового скрипта.

Скрипт автоматически установит утилиту в /opt/nanoasr, зарегистрирует в systemd, загрузит веса всех необходимых моделей и установит ffmpeg для работы с mp3.

curl -fsSL https://github.com/usunrise88/NanoASR/releases/latest/download/install.sh | bash

Доступны также ручная установка и установка с помощью docker, оба варианта описаны в readme на github.

После установки будет отображены данные для подключения, включая токены доступа.

Если необходимо реализовать доступ к сервису из внешней сети, необходимо настроить на сервере реверс-прокси (например nginx или Caddy) с TLS к порту 8080.

Установка на Windows

Результат установки Windows

Доступна быстрая установка с помощью готового скрипта. Скрипт автоматически установит утилиту в C:/Program Files/NanoASR, создаст сервис, загрузит веса всех необходимых моделей и установит ffmpeg для работы с mp3.

Для быстрой установки необходимо выполнить данную команду в Powershell:

irm https://github.com/usunrise88/NanoASR/releases/latest/download/install.ps1 | iex

Доступны также ручная установка и установка с помощью docker, оба варианта описаны в readme на github.

После установки будет отображены данные для подключения, включая токены доступа.

Если необходимо реализовать доступ к сервису из внешней сети, необходимо настроить на сервере реверс-прокси (например nginx или Caddy) с TLS к порту 8080.

Подключение к Платформе Эра

Мастер домен -> Приложение "Настройки" -> Домен -> Параметры

Необходимо найти параметр record_asr_options.

Задать значение по следующему шаблону:

{
  "servers": [
    {
      "headers": [
        "Authorization: Bearer sk-nanoasr-*"
      ],
      "uri": "http://[NanoASR_host]/asr_task?encode=true&task=transcribe&language=ru&output=json",
      "uri_get_task_result": "http://[NanoASR_host]/asr_task/%TASK_ID%"
    }
  ],
  "thread_count": 5,
  "type": "whisper",
  "utc_hours": [
    0,
    0
  ]
}

Где:

  • sk-nanoasr-* это ключ, полученный после установки (либо в yaml конфигурационном файле NanoASR);
  • [NanoASR_host] - адрес и порт установелнного сервиса NanoASR.

Подключение к AI Softphone

Настройки -> Расшифровка -> Распознаватели -> Добавить

Значения настроек для AI Softphone
Настройка Значение
Название NanoASR (любое название)
Вид Совместимый с OpenAI (Whisper, OpenAI)
Адрес http://[NanoASR_host]/v1 где [NanoASR_host] = адрес и порт установленного NanoASR
Ключ ключ, полученный после установки (либо в yaml конфигурационном файле NanoASR);
Модель По умолчанию gigaam-v3-ctc-punct-ru
Включен Да

Конфигурационный файл nanoasr.yaml

server — HTTP-сервер

Параметр По умолчанию Комментарий
addr :8080 Адрес прослушивания. auth.mode: open разрешён только если это loopback-интерфейс
read_header_timeout 10s Таймаут чтения заголовков запроса
max_upload_bytes 1073741824 1 ГиБ. Подобрано под max_duration: 4 часа моно 16 кГц WAV ≈ 440 МБ
shutdown_grace 30s Сколько ждать дорабатывающие задачи при остановке

auth — доступ

Параметр По умолчанию Комментарий
mode apikey apikey или open; open вне loopback — отказ при старте
keys [] В режиме apikey нужен хотя бы один, иначе сервер не стартует

Поля ключа: name — имя; key — сам секрет или sha256:<hex> (чтобы не хранить открытым); admin: false — право управлять моделями; rps: 0 — без ограничения скорости; priority: batchinteractive пускает задачи этого ключа вперёд очереди.

api / ui

Параметр По умолчанию Комментарий
api.dialects [openai, native] В поставляемом файле и после init[openai, native, era]. era монтируется в корень, поэтому включается осознанно
ui.enabled true Встроенный веб-интерфейс для тестирования.
ui.path /ui Путь освобождён от авторизации, поэтому / и пересечение с API запрещены проверкой

audio — приём и декодирование

Параметр По умолчанию Комментарий
ffmpeg_path ffmpeg Пусто → только WAV/PCM, остальное отклоняется с 415
ffmpeg_timeout 120s Предел на одно декодирование
max_duration 4h Верхняя граница длительности файла; 0 — без ограничения
target_sample_rate 16000 Только 16000: все модели VAD и диаризации 16 кГц
channel_mode downmix downmix | first | split
max_split_channels 2 split декодирует все каналы целиком; 2 — пара телефонных плеч
max_decoded_bytes 0 max_duration × rate × 4 × max_split_channels

vad — детектор речи

Параметр По умолчанию Комментарий
enabled true
model silero-vad-v5
threshold 0.5 Порог вероятности речи
min_silence_ms 300 Короче — не считается паузой
min_speech_ms 250 Короче — не считается речью
max_speech_sec 20 Без верхней границы монолог станет одним огромным сегментом

asr — распознавание

Параметр По умолчанию Комментарий
models_dir /var/lib/nanoasr/models
default_model gigaam-v3-ctc-punct-ru Русская пунктуация и регистр приходят из самой модели
max_resident_models 0 clamp(max_model_rss_mb / 1500, 1..6)
max_model_rss_mb 0 clamp(RAM / 2, 1024..16384)
inference_slots 0 → число CPU (GOMAXPROCS)
num_threads 0 clamp(CPU / 2, 1..8), на один экземпляр модели
idle_ttl 15m Через сколько простоя модель выгружается из пула
acquire_timeout 30s Ожидание свободного слота инференса
batch.max_size 8 Сегментов в батче
batch.max_seconds 60 Суммарная длительность батча
variants.max 0 Сколько дополнительных копий модели под пер-запросные настройки; 0 — настройки запроса игнорируются с предупреждением
variants.allow_hotwords false Требует variants.max > 0

registry — реестр моделей

Параметр По умолчанию Комментарий
allow_download true Скачивание весов по запросу
catalog_url "" Пусто → встроенный каталог
mirrors [] Зеркала для загрузки
download_concurrency 2 Параллельных загрузок
strict_license false true → отказывать некоммерческим весам

jobs — очередь

Параметр По умолчанию Комментарий
queue_size 100 Мест в очереди
max_concurrent 0 clamp(CPU / num_threads, 1..8); при channel_mode: split делится на число каналов
max_queued_bytes 4294967296 4 ГиБ аудио на диске; не меньше max_upload_bytes, превышение → 429 с Retry-After
max_processing_time 30m Предел на одну задачу
history_ttl 720h 30 суток метаданных и транскриптов
webhook_secret "" Подпись X-NanoASR-Signature; пусто → без подписи и предупреждение в лог
webhook_allow_private false Разрешает webhook на приватные адреса; само требует loopback

postproc — постобработка

Параметр По умолчанию Комментарий
punctuation.enabled false Нужно только моделям без пунктуации в словаре
punctuation.model "" Модель из каталога вида punctuation
itn.enabled false Числа, даты, время, валюта, телефоны, проценты
itn.locale ru
hotwords.enabled false Требует asr.variants.max > 0
hotwords.default_score 1.5 Вес, когда клиент не указал свой

diarization — разделение по говорящим

Параметр По умолчанию Комментарий
enabled false nanoasr init включает (если не -no-diarize)
segmentation_model pyannote-segmentation-3
embedding_model campplus-sv-zh-en Измерено: 2.9% DER при известном числе говорящих против 40.3% у voxceleb-модели
clustering.num_clusters 0 0 → кластеризовать по порогу. Известное число говорящих сильнее любого порога
clustering.threshold 0.85 Выше — охотнее объединяет. У sherpa-onnx 0.5, что дробит диалог двоих на 36 «говорящих»
min_duration_on 0.3 Короче — реплика отбрасывается
min_duration_off 0.5 Короче — соседние реплики склеиваются

storage / log

Параметр По умолчанию Комментарий
storage.db_path /var/lib/nanoasr/nanoasr.db База задач
storage.temp_dir "" <системный temp>/nanoasr-spool. Аудио живёт здесь только до завершения задачи, настройки «хранить дольше» нет
log.level info debug | info | warn | error
log.format json json | text