Пример реализации gRPC-сервера на Rust.
Сервер предназначен для транскрибации аудио (перевода речи в текст), и детекции голосовой активности без использования внешних Speech API.
В проекте используются:
- Tokio асинхронная среда выполнения.
- Tonic для реализации gRPC.
- Prost для реализации Protocol Buffers.
- Vosk открытая модель для распознавания речи.
- Silero открытая модель для детекции голосовой активности.
- Opt биндинг для ONNX runtime.
- ...
По необходимости можно поменять модель (Vosk) на любую из доступного списка.
Для этого достаточно её скачать, и положить в директорию ./model
. Так же не забыть указать путь в config.yaml
.
По умолчанию используется портативная vosk-model-small-ru-0.22
.
Так же в config.yaml
можно установить значение для полей:
vosk.model_path
- путь до модели (Vosk).vosk.pause_threshold
- длительность пауз для разделения речи на фразы. По дефолту 500ms.vad.model_path
- путь до модели (Silero)vad.sessions_num
- количество сессий.
Конфигурация передаваемая в запросе содержит поля:
sample_rate
- определяет частоту дискретизации распознаваемого аудиофайла. Рекомендуется передавать на распознавание аудио с частотой 16000(Гц).split_into_phrases
отвечает за включение/отключение разбивки транскрибированного текста на фразы (на основе значения изpause_threshold
).max_alternatives
- максимальное количество альтернатив. Если выставить параметр отличным от нуля, то будет возвращен наиболее правдоподобный результат из данного количества альтернатив.audio_type
- формат аудиофайла. На данном этапе доступно распознавание аудио форматовWAV_PCM_S16LE
,RAW_PCM_S16LE
,RAW_PCM_S16BE
.
При использовании собственного аудиофайла убедитесь, что он имеет правильный формат - PCM 16khz 16bit mono.
В противном случае, если у вас установлен ffmpeg
, вы можете использовать его, для конвертации.
Для отправки запроса на сервер возьмите transcribe.proto
(из директории ./grpc_server/proto
), и используйте в своем клиенте.
Проверить работоспособность можно например через Postman.
Cтруктура запроса для rpc Transcribation:
{
"config": {
"sample_rate": 16000,
"max_alternatives": 0,
"split_into_phrases": true,
"audio_type": "WAV_PCM_S16LE"
},
"content": "audio in base64 format"
}
В результате распознавания сервер вернёт JSON вида:
{
"phrases": [
{
"words": [
{
"word": "hello",
"startMs": 60,
"endMs": 480
},
{
"word": "world",
"startMs": 540,
"endMs": 715
}
],
"text": "hello world"
},
{
"words": [
{
"word": "you",
"startMs": 1224,
"endMs": 1450
},
{
"word": "are",
"startMs": 1590,
"endMs": 1710
},
{
"word": "beautiful",
"startMs": 1810,
"endMs": 2143
}
],
"text": "you are beautiful"
}
],
"text": "hello world you are beautiful"
}
Cтруктура запроса для rpc Vad:
{
"config": {
"sample_rate": 16000,
"audio_type": "WAV_PCM_S16LE"
},
"content": "audio in base64 format"
}
В результате распознавания сервер вернёт JSON вида:
{
"intervals": [
{
"start_s": 0.068,
"end_s": 0.715
},
{
"start_s": 1.224,
"end_s": 2.143
}
]
}
- Для установки
Rust
на unix подобные системы (MacOS, Linux, ...) - запускаем в терминале команду. По окончании загрузки вы получите последнюю стабильную версию Rust для вашей платформы, а так же последнюю версию Cargo.
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
- Для проверки выполните следующую команду в терминале.
cargo --version
- Открываем проект, и запускаем команды.
Проверяет код на возможность компиляции (без запуска).
cargo check
Сборка + запуск проекта
cargo run
UDP: Если вдруг у вас Windows, посмотрите Инструкцию тут
- Скорее всего вам понадобится установка Vosk.
В простом варианте достаточно выполнить следующую команду.
pip3 install vosk
- А так же может потребоваться установка ONNX runtime.
brew install onnxruntime