Пример использования API v2 потокового распознавания
Пример показывает, как с помощью SpeechKit API v2 в режиме реального времени распознать речь в формате LPCM.
В примере заданы следующие параметры:
- язык — русский;
- формат аудиопотока — LPCM с частотой дискретизации 8000 Гц;
- фильтр ненормативной лексики — True;
- фильтр промежуточных результатов — True;
- остальные параметры оставлены по умолчанию.
Для работы с API нужны пакеты grpcio-tools
для Python и grpc
для Node.js.
Аутентификация происходит от имени аккаунта на Яндексе или федеративного аккаунта с помощью IAM-токена. Если вы используете сервисный аккаунт, передавать идентификатор каталога в заголовке запроса не нужно. Подробнее об аутентификации в API SpeechKit.
Чтобы реализовать примеры в этом разделе:
-
Склонируйте репозиторий Yandex Cloud API
:git clone https://github.com/yandex-cloud/cloudapi
-
Скачайте пример
аудиофайла для распознавания. -
Создайте клиентское приложение:
Python 3Node.js-
Установите пакет
grpcio-tools
с помощью менеджера пакетов pip :pip install grpcio-tools
-
Перейдите в папку с репозиторием 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
и файлы зависимостей. -
Создайте файл в корне папки
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)
Где:
language_code
— язык, для которого будет выполнено распознавание.profanity_filter
— фильтр ненормативной лексики.model
— языковая модель.partial_results
— фильтр промежуточных результатов распознавания.audio_encoding
— формат аудиопотока.sample_rate_hertz
— частота дискретизации аудиопотока.
-
Задайте идентификатор каталога:
export FOLDER_ID=<идентификатор_каталога>
-
Задайте IAM-токен:
export IAM_TOKEN=<IAM-токен>
-
Выполните созданный файл:
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
-
Перейдите в папку с репозиторием 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); });
Где:
languageCode
— язык, для которого будет выполнено распознавание.pprofanityFilter
— фильтр ненормативной лексики.model
— языковая модель.partialResults
— фильтр промежуточных результатов распознавания.audioEncoding
— формат аудиопотока.sampleRateHertz
— частота дискретизации аудиопотока.
-
Задайте идентификатор каталога:
export FOLDER_ID=<идентификатор_каталога>
-
Задайте IAM-токен:
export IAM_TOKEN=<IAM-токен>
-
Выполните созданный файл:
node index.js speech.pcm
Где
speech.pcm
— имя аудиофайла для распознавания.Результат:
Start chunk: alternative: привет мир Is final: true
-