Skip to content

Latest commit

 

History

History
164 lines (138 loc) · 6.43 KB

README.md

File metadata and controls

164 lines (138 loc) · 6.43 KB

Описание

Пример реализации gRPC-сервера на Rust.

Сервер предназначен для транскрибации аудио (перевода речи в текст), и детекции голосовой активности без использования внешних Speech API.

В проекте используются:

  1. Tokio асинхронная среда выполнения.
  2. Tonic для реализации gRPC.
  3. Prost для реализации Protocol Buffers.
  4. Vosk открытая модель для распознавания речи.
  5. Silero открытая модель для детекции голосовой активности.
  6. Opt биндинг для ONNX runtime.
  7. ...

По необходимости можно поменять модель (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
    }
  ]
}

Локальный запуск

  1. Для установки Rust на unix подобные системы (MacOS, Linux, ...) - запускаем в терминале команду. По окончании загрузки вы получите последнюю стабильную версию Rust для вашей платформы, а так же последнюю версию Cargo.
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
  1. Для проверки выполните следующую команду в терминале.
cargo --version
  1. Открываем проект, и запускаем команды.

Проверяет код на возможность компиляции (без запуска).

cargo check

Сборка + запуск проекта

cargo run

UDP: Если вдруг у вас Windows, посмотрите Инструкцию тут

  1. Скорее всего вам понадобится установка Vosk.

В простом варианте достаточно выполнить следующую команду.

pip3 install vosk
  1. А так же может потребоваться установка ONNX runtime.
brew install onnxruntime