Викрам Васвани, консультант разработчиков
Этот учебник был первоначально опубликован на сайте https://docs.rev.ai/resources/tutorials/save-transcripts-mongodb-webhooks/ 12 июля 2022 года.
Введение
Webhooks обеспечивают простой и эффективный способ обработки событий, которые происходят асинхронно за пределами приложения. Обычно они устанавливаются в качестве конечных точек URL, которые вызываются приложениями верхнего уровня при определенных событиях. Они принимают входящие HTTP-запросы и, в свою очередь, запускают специфические для приложения процессы, такие как генерация уведомления или обновление записи состояния.
Асинхронный API Rev AI для преобразования речи в текст использует веб-крючки для уведомления приложений о завершении задания транскрипции. После получения такого уведомления приложению обычно необходимо получить расшифровку и «что-то» с ней сделать. Это «что-то» может включать сохранение расшифровки в базе данных, предоставление пользователю возможности редактировать и исправлять ее или обработку другим способом.
В этом руководстве показано, как реализовать веб-крючок в приложении Node.js для одного из таких случаев использования. В нем вы найдете информацию (и код), необходимую для создания веб-крючка, который по завершении задания сможет запросить полную стенограмму у Rev AI и сохранить ее во внешней базе данных MongoDB для дальнейшей обработки.
Предположения
В данном руководстве предполагается, что:
- У вас есть учетная запись Rev AI и токен доступа. Если нет, зарегистрируйте бесплатную учетную запись и сгенерируйте маркер доступа.
- У вас есть правильно настроенная среда разработки Node.js с Node.js v16.x или v17.x. Если нет, скачайте и установите Node.js для вашей операционной системы.
- Вы немного знакомы с фреймворком Express. Если нет, ознакомьтесь с основами на примере этого приложения.
- У вас есть права на запись в базу данных MongoDB. Если нет, загрузите и установите MongoDB для вашей операционной системы и настройте контроль доступа, или разверните MongoDB в облаке и настройте базу данных, пользователя и роль с правами на запись.
- Ваш веб-крючок будет доступен по общедоступному URL. Если нет, или если вы предпочитаете разрабатывать и тестировать локально, скачайте и установите
ngrok
, чтобы создать временный публичный URL для вашего webhook. - У вас есть аудиофайл для расшифровки. Если нет, используйте этот пример аудиофайла от Rev AI.
Шаг 1: Установите необходимые пакеты
В этом руководстве будут использоваться:
- Rev AI Node SDK для отправки запросов на транскрибацию в Rev AI Asynchronous Speech-to-Text API;
- Драйвер MongoDB Node.js для сохранения данных в MongoDB;
- Express Web framework и промежуточное ПО body-parser для получения и анализа запросов webhook.
Начните с установки необходимых пакетов:
npm i revai-node-sdk mongodb express body-parser
Шаг 2: Создайте обработчик веб-крючка
URL webhook указывается как часть параметров задания, передаваемых Rev AI API. По завершении задания Rev AI API отправит HTTP POST запрос, содержащий JSON-кодированную информацию о выполненном задании, на URL webhook. Вот пример одного из таких POST-запросов:
{
job: {
id: 'Qctu6UgJvTjZ',
created_on: '2022-04-08T15:01:35.999Z',
completed_on: '2022-04-08T15:02:05.403Z',
name: 'FTC_Sample_1.mp3',
callback_url: 'https://a177-49-36-111-113.ngrok.io/hook',
media_url: 'https://www.rev.ai/FTC_Sample_1.mp3',
status: 'transcribed',
duration_seconds: 107,
type: 'async',
language: 'en'
}
}
Следующий пример демонстрирует, как реализовать обработчик webhook, который получает и анализирует HTTP POST-сообщение от Rev AI API, а затем делает последующий запрос к API для получения полной расшифровки. Затем обработчик сохраняет полученные данные в коллекции базы данных MongoDB в виде документа JSON.
Чтобы использовать этот пример, вы должны заменить <MONGODB_CONNECTION_URI>
на URI подключения к вашей базе данных MongoDB, а место <REVAI_ACCESS_TOKEN>
на токен доступа вашей учетной записи Rev AI.
const { RevAiApiClient } = require('revai-node-sdk');
const { MongoClient } = require('mongodb');
const bodyParser = require('body-parser');
const express = require('express');
// MongoDB connection string
const mongodbUri = '<MONGODB_CONNECTION_URI>';
// Rev AI access token
const revAiToken = '<REVAI_ACCESS_TOKEN>';
// create Express application
const app = express();
app.use(bodyParser.json());
// create Mongo client
const mongo = new MongoClient(mongodbUri);
mongo.connect();
const db = mongo.db('mydb');
const transcripts = db.collection('transcripts')
// create Rev AI API client
const revAiClient = new RevAiApiClient(revAiToken);
// handle requests to webhook endpoint
app.post('/hook', async req => {
const job = req.body.job;
console.log(`Received status for job id ${job.id}: ${job.status}`);
if (job.status === 'transcribed') {
// request transcript
const transcript = await revAiClient.getTranscriptObject(job.id);
console.log(`Received transcript for job id ${job.id}`);
// create MongoDB document
const doc = {
job_id: job.id,
created_on: job.created_on,
language: job.language,
status: job.status,
transcript
}
// save document to MongoDB
try {
const result = await collection.insertOne(doc);
console.log(`Saved transcript with document id: ${result.insertedId}`);
} catch (e) {
console.error(e);
}
}
});
// start application on port 3000
app.listen(3000, () => {
console.log('Webhook listening');
})
Сохраните этот листинг кода как index.js
и рассмотрите его подробнее:
- Этот листинг кода начинается с импорта необходимых пакетов и учетных данных и создания клиента MongoDB и клиента Rev AI API.
- Он пытается подключиться к службе базы данных MongoDB с помощью метода
connect()
клиента MongoDB и выбирает базу данных и коллекцию для использования. - Он запускает приложение Express на порту 3000 и ожидает входящих POST-запросов к URL-маршруту
/hook
. - Когда приложение получает POST-запрос по адресу
/hook
, оно анализирует тело входящего JSON-сообщения и проверяет заданиеid
иstatus
. - Если
status
являетсяtranscribed
, он использует методgetTranscriptObject()
клиента API для получения полной расшифровки в виде документа JSON. - Он подготавливает документ MongoDB для хранения транскрипта. Этот документ также включает другие параметры задания, такие как дата и время, язык и статус.
- Затем он использует метод
insertOne()
для вставки подготовленного документа в коллекцию и выводит уникальный идентификатор документа MongoDB на консоль. - Ошибки, если таковые имеются, в процессе подключения к MongoDB и вставки данных, отправляются в консоль.
Шаг 3: Протестируйте веб-крючок
Чтобы увидеть веб-крючок в действии, сначала убедитесь, что вы заменили заполнители, как описано в предыдущем шаге, а затем запустите приложение с помощью команды ниже.
node index.js
Далее отправьте аудиофайл на расшифровку в Rev AI и включите в запрос параметр callback_url
. Этот параметр указывает URL веб-крючка, который API Rev AI должен вызвать по завершении задания.
Вот пример отправки аудиофайла с помощью веб-крючка с использованием curl
.
curl -X POST "https://api.rev.ai/speechtotext/v1/jobs"
-H "Authorization: Bearer <REVAI_ACCESS_TOKEN>"
-H "Content-Type: application/json"
-d '{"media_url":"<URL>","callback_url":"http://<WEBHOOK-HOST>/hook"}'
Если вы предпочитаете отправлять аудиофайл с помощью Rev AI Node SDK, используйте этот скрипт:
const { RevAiApiClient } = require('revai-node-sdk');
const revAiToken = '<REVAI_ACCESS_TOKEN>';
const webhookUrl = 'http://<WEBHOOK-HOST>/hook';
const fileUrl = '<URL>';
// define job options
const jobOptions = {
callback_url: webhookUrl,
};
// create Rev AI API client
const revAiClient = new RevAiApiClient(revAiToken);
// submit job
job = await revAiClient.submitJobUrl(fileUrl, jobOptions);
В обоих случаях замените место <REVAI_ACCESS_TOKEN>
на ваш токен доступа к Rev AI, а место <URL>
на прямой URL вашего аудиофайла. Кроме того, замените заполнитель <WEBHOOK-HOST>
следующим образом:
- Если вы разрабатываете и тестируете в публичном облаке, ваше приложение Express обычно будет доступно на публичном домене или IP-адресе. В этом случае замените заполнитель
<WEBHOOK-HOST>
на правильное доменное имя или IP-адрес, включая номер порта3000
, если требуется. - Если вы разрабатываете и тестируете локально, ваше приложение Express не будет доступно публично, поэтому вы должны настроить публичный URL переадресации с помощью такого инструмента, как
ngrok
. Получите этот URL с помощью командыngrok http 3000
и замените место<WEBHOOK-HOST>
на временный URL пересылки, созданныйngrok
.
Как только задание будет обработано, Rev AI API отправит POST-запрос на URL webhook. Затем веб-крючок запросит полную расшифровку и сохранит ее в базе данных MongoDB в виде документа JSON, как объяснялось в предыдущем разделе.
Вот пример вывода, создаваемого обработчиком веб-крючка:
Webhook listening
Received status for job id Qctu6UgJvTjZ: transcribed
Received transcript for job id Qctu6UgJvTjZ
Saved transcript with document id: 62504e6fcc32c9387208c875
Вы можете получить стенограмму для просмотра или дальнейшей обработки, подключившись к базе данных MongoDB и получив документ по его уникальному идентификатору. Ниже показан пример выполнения этого действия с помощью mongosh
:
test> use mydb
mydb> db.transcripts.find( { '_id':ObjectId('62504e6fcc32c9387208c875') } )
[
{
_id: ObjectId("62504e6fcc32c9387208c875"),
job_id: 'Qctu6UgJvTjZ',
created_on: '2022-04-08T15:01:35.999Z',
language: 'en',
status: 'transcribed',
transcript: {
monologues: [
{
speaker: 0,
elements: [
{
type: 'text',
value: 'Hi',
ts: 0.26,
end_ts: 0.48,
confidence: 0.99
},
{ type: 'punct', value: ',' },
{
...
}
]
}
]
}
}
]
Если веб-крючок работает не так, как ожидалось, вы можете протестировать и проверить ответ веб-крючка.
Следующие шаги
Подробнее об использовании веб-крючков для асинхронной обработки можно узнать по следующим ссылкам:
- Документация: Асинхронная отправка заданий Speech-To-Text API и веб-крючки
- Учебное пособие: Начало работы с веб-крючками Rev AI API
- Учебное пособие: Использование Webhooks для запуска уведомлений о заданиях по электронной почте с помощью Node.js, SendGrid и Express
- Документация: Использование
ngrok
- Документация: MongoDB
- Документация: Драйвер MongoDB Node.js