Примеры использования API потокового распознавания
Чтобы попробовать примеры в этом разделе:
- Склонируйте репозиторий Yandex Cloud API:
git clone https://github.com/yandex-cloud/cloudapi
- Узнайте идентификатор каталога, к которому у вашего аккаунта есть доступ.
- Для аутентификации в примерах используется IAM-токен (о других способах аутентификации). Получите IAM-токен:
- Инструкция для аккаунта на Яндексе.
- Инструкция для сервисного аккаунта.
- Скачайте пример аудиофайла для распознавания. Аудиофайл имеет формат LPCM с частотой дискретизации 8000.
После этого приступите к созданию клиентского приложения.
-
Установите пакет
grpcio-tools
с помощью менеджера пакетов pip:pip install grpcio-tools
-
Перейдите в директорию с репозиторием 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
и файлы зависимостей. -
Создайте файл в корне директории
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)
-
Задайте идентификатор каталога и 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
-
Перейдите в директорию с репозиторием Yandex Cloud API, создайте директорию
src
и сгенерируйте в ней файл зависимостейpackage.json
:cd cloudapi mkdir src cd src npm init
-
Установите необходимые пакеты с помощью npm:
npm install grpc @grpc/proto-loader google-proto-files --save
-
Скачайте публичный сертификат gRPC из официального репозитория и сохраните его в корне директории
src
. -
Создайте файл в корне директории
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); });
-
Задайте идентификатор каталога и IAM-токен, которые используются в скрипте, и выполните созданный файл. В аргументе укажите путь к аудиофайлу, который необходимо распознать:
export FOLDER_ID=<идентификатор каталога> export IAM_TOKEN=<IAM-токен> node index.js speech.pcm Start chunk: alternative: привет мир Is final: true