Общая информация
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.
Утилита поддерживает различные архитектуры моделей, однако "из коробки" загружает следующий набор:
| Модель | Назначение |
|---|---|
| gigaam-v3-ctc-punct-ru | Распознавание речи |
| silero-vad-v5 | Детектор голосовой активности |
| pyannote-segmentation-3 | Модель разделения спикеров |
| campplus-sv-zh-en | Модель построения "слепков" голосов (голосовых эмбеддингов) |
Установка на 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

Доступна быстрая установка с помощью готового скрипта. Скрипт автоматически установит утилиту в 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

Настройки -> Расшифровка -> Распознаватели -> Добавить
| Настройка | Значение |
|---|---|
| Название | 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: batch — interactive пускает задачи этого ключа вперёд очереди.
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
|