Пример использования API v2 потокового распознавания

Пример показывает, как с помощью SpeechKit API v2 в режиме реального времени распознать речь в формате LPCM.

В примере заданы следующие параметры:

Для работы с API нужны пакеты grpcio-tools для Python и grpc для Node.js.

Аутентификация происходит от имени аккаунта на Яндексе или федеративного аккаунта с помощью IAM-токена. Если вы используете сервисный аккаунт, передавать идентификатор каталога в заголовке запроса не нужно. Подробнее об аутентификации в API SpeechKit.

Чтобы реализовать примеры в этом разделе:

  1. Склонируйте репозиторий Yandex Cloud API:

    git clone https://github.com/yandex-cloud/cloudapi
            
  2. Скачайте пример аудиофайла для распознавания.

  3. Создайте клиентское приложение:

    1. Установите пакет grpcio-tools с помощью менеджера пакетов pip:

      pip install grpcio-tools
              
    2. Перейдите в папку с репозиторием Yandex Cloud API, создайте папку output и сгенерируйте в ней код интерфейса клиента:

      cd cloudapi
              mkdir output
              python3 -m grpc_tools.protoc -I . -I third_party/googleapis \
                --python_out=output \
                --grpc_python_out=output \
                  google/api/http.proto \
                  google/api/annotations.proto \
                  yandex/cloud/api/operation.proto \
                  google/rpc/status.proto \
                  yandex/cloud/operation/operation.proto \
                  yandex/cloud/ai/stt/v2/stt_service.proto
              

      В результате в папке output будут созданы файлы с интерфейсом клиента: stt_service_pb2.py, stt_service_pb2_grpc.py и файлы зависимостей.

    3. Создайте файл в корне папки output, например test.py, и добавьте в него следующий код:

      #coding=utf8
              import argparse
              
              import grpc
              
              import yandex.cloud.ai.stt.v2.stt_service_pb2 as stt_service_pb2
              import yandex.cloud.ai.stt.v2.stt_service_pb2_grpc as stt_service_pb2_grpc
              
              CHUNK_SIZE = 4000
              
              def gen(folder_id, audio_file_name):
                  # Задайте настройки распознавания.
                  specification = stt_service_pb2.RecognitionSpec(
                      language_code='ru-RU',
                      profanity_filter=True,
                      model='general',
                      partial_results=True,
                      audio_encoding='LINEAR16_PCM',
                      sample_rate_hertz=8000
                  )
                  streaming_config = stt_service_pb2.RecognitionConfig(specification=specification, folder_id=folder_id)
              
                  # Отправьте сообщение с настройками распознавания.
                  yield stt_service_pb2.StreamingRecognitionRequest(config=streaming_config)
              
                  # Прочитайте аудиофайл и отправьте его содержимое порциями.
                  with open(audio_file_name, 'rb') as f:
                      data = f.read(CHUNK_SIZE)
                      while data != b'':
                          yield stt_service_pb2.StreamingRecognitionRequest(audio_content=data)
                          data = f.read(CHUNK_SIZE)
              
              def run(folder_id, iam_token, audio_file_name):
                  # Установите соединение с сервером.
                  cred = grpc.ssl_channel_credentials()
                  channel = grpc.secure_channel('stt.api.cloud.yandex.net:443', cred)
                  stub = stt_service_pb2_grpc.SttServiceStub(channel)
              
                  # Отправьте данные для распознавания.
                  it = stub.StreamingRecognize(gen(folder_id, audio_file_name), metadata=(
                      ('authorization', 'Bearer %s' % iam_token),
                  ))
              
                  # Обработайте ответы сервера и выведите результат в консоль.
                  try:
                      for r in it:
                          try:
                              print('Start chunk: ')
                              for alternative in r.chunks[0].alternatives:
                                  print('alternative: ', alternative.text)
                              print('Is final: ', r.chunks[0].final)
                              print('')
                          except LookupError:
                              print('Not available chunks')
                  except grpc._channel._Rendezvous as err:
                      print('Error code %s, message: %s' % (err._state.code, err._state.details))
              
              if __name__ == '__main__':
                  parser = argparse.ArgumentParser()
                  parser.add_argument('--token', required=True, help='IAM token')
                  parser.add_argument('--folder_id', required=True, help='folder ID')
                  parser.add_argument('--path', required=True, help='audio file path')
                  args = parser.parse_args()
              
                  run(args.folder_id, args.token, args.path)
              

      Где:

    4. Задайте идентификатор каталога:

      export FOLDER_ID=<идентификатор_каталога>
              
    5. Задайте IAM-токен:

      export IAM_TOKEN=<IAM-токен>
              
    6. Выполните созданный файл:

      python3 test.py --token ${IAM_TOKEN} --folder_id ${FOLDER_ID} --path speech.pcm
              

      Где --path — путь к аудиофайлу, который необходимо распознать.

      Результат:

      Start chunk:
              alternative: привет
              Is final: False
              
              Start chunk:
              alternative: привет мир
              Is final: True
              
    1. Перейдите в папку с репозиторием Yandex Cloud API, создайте папку src и сгенерируйте в ней файл зависимостей package.json:

      cd cloudapi
              mkdir src
              cd src
              npm init
              
    2. Установите необходимые пакеты с помощью npm:

      npm install grpc @grpc/proto-loader google-proto-files --save
              
    3. Скачайте публичный сертификат gRPC из официального репозитория и сохраните его в корне папки src.

    4. Создайте файл в корне папки src, например index.js, и добавьте в него следующий код:

      const fs = require('fs');
              const grpc = require('grpc');
              const protoLoader = require('@grpc/proto-loader');
              const CHUNK_SIZE = 4000;
              
              // Получите ID каталога и IAM-токен из переменных окружения.
              const folderId = process.env.FOLDER_ID;
              const iamToken = process.env.IAM_TOKEN;
              
              // Прочитайте файл, указанный в аргументах.
              const audio = fs.readFileSync(process.argv[2]);
              
              // Задайте настройки распознавания.
              const request = {
                  config: {
                      specification: {
                          languageCode: 'ru-RU',
                          profanityFilter: true,
                          model: 'general',
                          partialResults: true,
                          audioEncoding: 'LINEAR16_PCM',
                          sampleRateHertz: '8000'
                      },
                      folderId: folderId
                  }
              };
              
              // Задайте частоту отправки аудио в миллисекундах.
              // Для формата LPCM частоту можно рассчитать по формуле: CHUNK_SIZE * 1000 / ( 2 * sampleRateHertz);
              const FREQUENCY = 250;
              
              const serviceMetadata = new grpc.Metadata();
              serviceMetadata.add('authorization', `Bearer ${iamToken}`);
              
              const packageDefinition = protoLoader.loadSync('../yandex/cloud/ai/stt/v2/stt_service.proto', {
                  includeDirs: ['node_modules/google-proto-files', '..']
              });
              const packageObject = grpc.loadPackageDefinition(packageDefinition);
              
              // Установите соединение с сервером.
              const serviceConstructor = packageObject.yandex.cloud.ai.stt.v2.SttService;
              const grpcCredentials = grpc.credentials.createSsl(fs.readFileSync('./roots.pem'));
              const service = new serviceConstructor('stt.api.cloud.yandex.net:443', grpcCredentials);
              const call = service['StreamingRecognize'](serviceMetadata);
              
              // Отправьте сообщение с настройками распознавания.
              call.write(request);
              
              // Прочитайте аудиофайл и отправьте его содержимое порциями.
              let i = 1;
              const interval = setInterval(() => {
                  if (i * CHUNK_SIZE <= audio.length) {
                      const chunk = new Uint16Array(audio.slice((i - 1) * CHUNK_SIZE, i * CHUNK_SIZE));
                      const chunkBuffer = Buffer.from(chunk);
                      call.write({audioContent: chunkBuffer});
                      i++;
                  } else {
                      call.end();
                      clearInterval(interval);
                  }
              }, FREQUENCY);
              
              // Обработайте ответы сервера и выведите результат в консоль.
              call.on('data', (response) => {
                  console.log('Start chunk: ');
                  response.chunks[0].alternatives.forEach((alternative) => {
                      console.log('alternative: ', alternative.text)
                  });
                  console.log('Is final: ', Boolean(response.chunks[0].final));
                  console.log('');
              });
              
              call.on('error', (response) => {
                  // Выведите ошибки в консоль.
                  console.log(response);
              });
              

      Где:

    5. Задайте идентификатор каталога:

      export FOLDER_ID=<идентификатор_каталога>
              
    6. Задайте IAM-токен:

      export IAM_TOKEN=<IAM-токен>
              
    7. Выполните созданный файл:

      node index.js speech.pcm
              

      Где speech.pcm — имя аудиофайла для распознавания.

      Результат:

      Start chunk:
              alternative: привет мир
              Is final: true
              

См. также