Yandex Cloud
  • Сервисы
  • Решения
  • Почему Yandex Cloud
  • Сообщество
  • Тарифы
  • Документация
  • Связаться с нами
Подключиться
Language / Region
© 2022 ООО «Яндекс.Облако»
Yandex SpeechKit
  • Начало работы
  • Распознавание речи
    • О технологии
    • Потоковое распознавание
    • Распознавание аудиофайлов
      • Синхронное распознавание
      • Асинхронное распознавание
    • Форматы аудио
    • Модели распознавания
    • Расширение модели распознавания речи
    • Загрузка данных для дообучения модели
    • Справочник API
      • Аутентификация в API
      • API v2
        • API потокового распознавания
        • Примеры использования API потокового распознавания
        • API синхронного распознавания
        • Примеры использования API синхронного распознавания
        • API асинхронного распознавания
        • Распознавание речи в формате LPCM
        • Распознавание речи в формате OggOpus
      • API v3 gRPC (англ.)
        • Overview
        • Recognizer
  • Синтез речи
    • О технологии
    • Список голосов
    • Настройка генерации речи
    • SpeechKit Brand Voice
      • О технологии SpeechKit Brand Voice
      • Формат входных данных Brand Voice Adaptive
      • Загрузка данных для Brand Voice
    • Справочник API
      • Аутентификация в API
      • API v1
        • Описание метода API
        • Использование SSML
        • Список поддерживаемых фонем в SSML
      • API v3 gRPC (англ.)
        • Overview
        • Synthesizer
  • SpeechKit Hybrid
    • О технологии
    • Системные требования
    • Синтез речи
    • Распознавание речи
    • Мониторинг
    • Справочники API gRPC (англ.)
      • Аутентификация в API
      • Синтез речи
        • Overview
        • Synthesizer
      • Потоковое распознавание
        • Overview
        • Recognizer
  • Интеграция телефонии
  • Использование API
    • Аутентификация в API
    • Формат ответа
    • Диагностика ошибок
  • Квоты и лимиты
  • Управление доступом
  • Правила тарификации
  • Релизы
    • Релизы распознавания
    • Релизы синтеза
    • Архив релизов
  • Публичные материалы
  • Вопросы и ответы
  1. Распознавание речи
  2. Справочник API
  3. API v2
  4. Примеры использования API потокового распознавания

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

Статья создана
Yandex Cloud

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

    1. Склонируйте репозиторий Yandex Cloud API:
      git clone https://github.com/yandex-cloud/cloudapi
      
    2. Узнайте идентификатор каталога, к которому у вашего аккаунта есть доступ.
    3. Для аутентификации в примерах используется IAM-токен (о других способах аутентификации). Получите IAM-токен:
      • Инструкция для аккаунта на Яндексе.
      • Инструкция для сервисного аккаунта.
    4. Скачайте пример аудиофайла для распознавания. Аудиофайл имеет формат LPCM с частотой дискретизации 8000.

    После этого приступите к созданию клиентского приложения.

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

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

      cd cloudapi
      mkdir output
      python -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. Задайте идентификатор каталога и IAM-токен и выполните созданный файл. В аргументе path укажите путь к аудиофайлу, который необходимо распознать:

      export FOLDER_ID=<идентификатор каталога>
      export IAM_TOKEN=<IAM-токен>
      python test.py --token ${IAM_TOKEN} --folder_id ${FOLDER_ID} --path speech.pcm
      
      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. Задайте идентификатор каталога и IAM-токен, которые используются в скрипте, и выполните созданный файл. В аргументе укажите путь к аудиофайлу, который необходимо распознать:

      export FOLDER_ID=<идентификатор каталога>
      export IAM_TOKEN=<IAM-токен>
      node index.js speech.pcm
      
      Start chunk:
      alternative:  привет мир
      Is final:  true
      

    Была ли статья полезна?

    Language / Region
    © 2022 ООО «Яндекс.Облако»