Автоматическая загрузка данных в Yandex SpeechSense с помощью Yandex Workflows
Примечание
Workflows находится на стадии Preview. Чтобы получить доступ, отправьте заявку
Вы можете настроить автоматическую загрузку файлов с диалогами и их метаданными из бакета Object Storage в пространство SpeechSense. Поддерживаемые форматы:
MP3
,WAV
,OggOpus
— для аудиозаписей;JSON
— для переписки из чата.
На схеме:
- Триггер для Object Storage отслеживает появление новых JSON-файлов с метаданными в выделенной папке бакета или любой из ее подпапок.
- Когда в папке появляются новые файлы, триггер вызывает функцию
workflow-call
, которая запускает рабочий процесс Workflows. - Рабочий процесс получает содержимое JSON-файлов с метаданными и проверяет их синтаксис с помощью функции
verify-file
. - Рабочий процесс получает параметры подключения SpeechSense из секрета Yandex Lockbox.
- Путь к аудиозаписи или текстовому файлу, а также их метаданные передаются в функцию загрузки
speechsense-upload
. - Функция
speechsense-upload
загружает файлы и их метаданные в пространство SpeechSense. - Во время выполнения рабочий процесс обращается к БД с метаданными:
- Логируются ошибки синтаксиса в файлах с метаданными.
- Логируются ошибки синтаксиса записей в файлах с метаданными.
- Проводится проверка на дубликаты: перед вызовом функции
speechsense-upload
проверяется, загружен ли уже файл в это пространство SpeechSense. - Логируются ошибки функции
speechsense-upload
. - При успешной загрузке файла логируются его метаданные и уникальный идентификатор в пространстве SpeechSense.
- Сервис WebSQL позволяет получить доступ к БД с метаданными. Для просмотра используется один пользователь БД, а для загрузки файлов — другой.
Настроить автоматическую загрузку данных можно сразу для нескольких подключений SpeechSense.
Чтобы автоматизировать загрузку данных в SpeechSense:
- Подготовьте облако к работе.
- Создайте инфраструктуру для загрузки файлов.
- Создайте секрет Yandex Lockbox.
- Создайте модель данных в кластере Managed Service for PostgreSQL.
- Создайте в бакете Object Storage папки для хранения файлов и их метаданных.
- Подготовьте метаданные.
- Загрузите файлы в бакет Object Storage.
- Проверьте результат.
Если созданные ресурсы вам больше не нужны, удалите их.
Подготовьте облако к работе
Зарегистрируйтесь в Yandex Cloud и создайте платежный аккаунт:
- Перейдите в консоль управления
, затем войдите в Yandex Cloud или зарегистрируйтесь. - На странице Yandex Cloud Billing
убедитесь, что у вас подключен платежный аккаунт, и он находится в статусеACTIVE
илиTRIAL_ACTIVE
. Если платежного аккаунта нет, создайте его и привяжите к нему облако.
Если у вас есть активный платежный аккаунт, вы можете создать или выбрать каталог, в котором будет работать ваша инфраструктура, на странице облака
Подробнее об облаках и каталогах.
Необходимые платные ресурсы
В стоимость ресурсов входят:
- плата за хранение данных в бакете и операции с ними (см. тарифы Yandex Object Storage);
- плата за использование кластера (см. тарифы Yandex Managed Service for PostgreSQL);
- плата за вызовы функций (см. тарифы Yandex Cloud Functions);
- плата за хранение секрета и запросы к нему (см. тарифы Yandex Lockbox).
Создайте сервисные аккаунты
Создайте два сервисных аккаунта:
-
deploy-sa
— от его имени будет создаваться инфраструктура. -
speechsense-sa
— от его имени будут вызываться функции и запускаться рабочий процесс.
- В консоли управления
выберите нужный каталог. - В списке сервисов выберите Identity and Access Management.
- Нажмите кнопку Создать сервисный аккаунт.
- Введите имя сервисного аккаунта:
deploy-sa
. - Нажмите кнопку
Добавить роль и выберите роли: functions.admin, storage.editor, iam.editor, mdb.admin,serverless.workflows.admin
. - Нажмите кнопку Создать.
- Повторите предыдущие шаги и создайте сервисный аккаунт
speechsense-sa
c ролями storage.viewer, functions.functionInvoker, functions.mdbProxiesUser, lockbox.payloadViewer,serverless.workflows.executor
.
Если у вас еще нет интерфейса командной строки Yandex Cloud, установите и инициализируйте его.
По умолчанию используется каталог, указанный в профиле CLI. Вы можете указать другой каталог с помощью параметра --folder-name
или --folder-id
.
-
Создайте сервисный аккаунт
deploy-sa
:yc iam service-account create deploy-sa
Результат:
id: nfersamh4sjq******** folder_id: b1gc1t4cb638******** created_at: "2023-09-21T10:36:29.726397755Z" name: deploy-sa
Сохраните идентификатор сервисного аккаунта
deploy-sa
(id
) и каталога, в котором его создали (folder_id
).Подробнее о команде
yc iam service-account create
читайте в справочнике CLI. -
Назначьте сервисному аккаунту
deploy-sa
роли functions.admin, storage.editor, iam.editor, mdb.admin,serverless.workflows.admin
на каталог, указав сохраненные ранее идентификаторы каталога и сервисного аккаунта:yc resource-manager folder add-access-binding <идентификатор_каталога> \ --role <роль> \ --subject serviceAccount:<идентификатор_сервисного_аккаунта>
Команда принимает только одну роль за раз.
Подробнее о команде
yc resource-manager folder add-access-binding
читайте в справочнике CLI.Если вы будете создавать секрет Yandex Lockbox через Yandex Cloud CLI от имени сервисного аккаунта
deploy-sa
, также назначьте ему роль lockbox.editor. -
Повторите предыдущие шаги и создайте сервисный аккаунт
speechsense-sa
c ролями storage.viewer, functions.functionInvoker, functions.mdbProxiesUser, lockbox.payloadViewer,serverless.workflows.executor
.
Чтобы создать сервисный аккаунт, воспользуйтесь методом create для ресурса ServiceAccount или вызовом gRPC API ServiceAccountService.Create.
Чтобы назначить сервисному аккаунту deploy-sa
роли functions.admin, storage.editor, iam.editor, mdb.admin и serverless.workflows.admin
, воспользуйтесь методом setAccessBindings для ресурса ServiceAccount или вызовом gRPC API ServiceAccountService.SetAccessBindings.
Таким же способом назначьте сервисному аккаунту speechsense-sa
роли storage.viewer, functions.functionInvoker, functions.mdbProxiesUser, lockbox.payloadViewer, serverless.workflows.executor
.
Создайте API-ключ для сервисного аккаунта
Создайте API-ключ для сервисного аккаунта speechsense-sa
.
-
В консоли управления
перейдите в каталог, в котором находится сервисный аккаунт. -
В списке сервисов выберите Identity and Access Management.
-
На панели слева выберите
Сервисные аккаунты. -
Выберите сервисный аккаунт
speechsense-sa
. -
На панели сверху нажмите кнопку
Создать новый ключ и выберите пункт Создать API-ключ. -
Нажмите кнопку Создать.
-
Сохраните идентификатор и секретный ключ.
Внимание
После закрытия диалога значение ключа будет недоступно.
Создайте API-ключ для сервисного аккаунта speechsense-sa
и запишите ответ в файл api_key.yaml
:
yc iam api-key create \
--service-account-name speechsense-sa \
> api_key.yaml
В результате вы получите файл api_key.yaml
, который содержит значение API-ключа в поле secret
:
api_key:
id: ajeke74kbp5b********
service_account_id: ajepg0mjt06s********
created_at: "2019-04-09T08:41:27Z"
secret: AQVN1HHJReSrfo9jU3aopsXrJyfq_UHs********
Создайте API-ключ с помощью метода REST API create для ресурса ApiKey:
export SERVICEACCOUNT_ID=<идентификатор_сервисного_аккаунта>
export IAM_TOKEN=<токен>
curl \
--request POST \
--header "Content-Type: application/json" \
--header "Authorization: Bearer $IAM_TOKEN" \
--data "{ \"serviceAccountId\": \"$SERVICEACCOUNT_ID\" }" \
https://iam.api.cloud.yandex.net/iam/v1/apiKeys
Где:
SERVICEACCOUNT_ID
— идентификатор сервисного аккаунта.IAM_TOKEN
— IAM-токен.
Также API-ключ можно создать с помощью вызова gRPC API ApiKeyService.Create.
Создайте пространство
- Откройте главную страницу
SpeechSense. - Нажмите кнопку Создать пространство.
- Введите название пространства.
- Нажмите кнопку Создать.
Добавьте сервисный аккаунт в пространство
Добавьте сервисный аккаунт speechsense-sa
в пространство SpeechSense.
- Откройте главную страницу
SpeechSense. - Перейдите в новое пространство.
- Нажмите кнопку
Добавить участника → Добавить из организации. - Cкопируйте идентификатор созданного ранее сервисного аккаунта
speechsense-sa
и вставьте в строку поиска. - Выберите сервисный аккаунт
speechsense-sa
и укажите роль Data editor. Эта роль позволит сервисному аккаунтуspeechsense-sa
загружать данные в SpeechSense. - Нажмите кнопку Добавить.
Создайте подключение
В зависимости от типа файлов, которые будут загружаться в SpeechSense, создайте подключение для аудио или для чата.
Создайте подключение для аудио
-
Откройте главную страницу
SpeechSense. -
Перейдите в нужное пространство.
-
В правом верхнем углу нажмите Еще →
Создать подключение. -
Укажите название подключения.
-
Выберите тип данных Двухканальное аудио.
-
В блоках Оператор, Клиент:
- Укажите каналы, в которых записаны голос оператора и голос клиента.
- Укажите для оператора и клиента ключи из файла метаданных. Этот файл содержит информацию о звонке, полученную из CRM-систем, АТС или других источников.
По умолчанию в подключение добавлены ключи с именем и идентификатором оператора и клиента. В поле Название в системе введите название, под которым ключ будет отображаться в SpeechSense.
Чтобы указать дополнительные метаданные для оператора и клиента, нажмите кнопку Добавить ключ.
-
В блоке Общие метаданные укажите не связанные с оператором и клиентом ключи из файла метаданных.
По умолчанию в подключение добавлены ключи с датой, направлением звонка и языком диалога. В поле Название в системе введите название, под которым ключ будет отображаться в SpeechSense.
Чтобы указать дополнительные метаданные, нажмите кнопку Добавить ключ.
-
Нажмите кнопку Создать подключение.
Создайте подключение для чата
-
Откройте главную страницу
SpeechSense. -
Перейдите в нужное пространство.
-
В правом верхнем углу нажмите Еще →
Создать подключение. -
Укажите название подключения.
-
Выберите тип данных Чат.
-
В блоках Оператор, Клиент, Бот укажите ключи из файла метаданных. Этот файл содержит информацию о диалоге, полученную из чатов, CRM-систем или других источников.
По умолчанию в подключение добавлены ключи с именем и идентификатором оператора, клиента и бота. В поле Название в системе введите название, под которым ключ будет отображаться в SpeechSense.
Чтобы указать дополнительные метаданные для оператора, клиента и бота, нажмите кнопку Добавить ключ.
-
В блоке Общие метаданные укажите не связанные с оператором, клиентом и ботом ключи из файла метаданных.
По умолчанию в подключение добавлены ключи с датой, направлением и языком диалога. В поле Название в системе введите название, под которым ключ будет отображаться в SpeechSense.
Чтобы указать дополнительные метаданные, нажмите кнопку Добавить ключ.
-
Нажмите кнопку Создать подключение.
Создайте проект
- Откройте главную страницу
SpeechSense. - Перейдите в нужное пространство.
- Нажмите кнопку
Создать проект. - Введите имя проекта.
- В блоке Подключение нажмите Добавить подключение и выберите подключение, созданное ранее.
- Нажмите кнопку Создать проект.
Создайте инфраструктуру
-
Склонируйте репозиторий yc-serverless-speechsense-workflows
:git clone https://github.com/yandex-cloud-examples/yc-serverless-speechsense-workflows.git
В репозитории находится скрипт, который создаст в облаке инфраструктуру, необходимую для загрузки файлов в SpeechSense:
- бакет Object Storage;
- кластер Managed Service for PostgreSQL;
- функции Cloud Functions;
- триггер для вызова функции Cloud Functions;
- рабочий процесс Workflows;
- подключения к базе данных кластера Managed Service for PostgreSQL.
-
Для успешной работы скрипта настройте аутентификацию Yandex Cloud CLI от имени сервисного аккаунта
deploy-sa
:Yandex Cloud CLI-
Создайте авторизованный ключ для сервисного аккаунта
deploy-sa
и запишите его в файл:yc iam key create --output <путь_к_файлу_ключа> --service-account-name deploy-sa
Где
--output
— путь к файлу для записи авторизованного ключа в формате JSON.Результат:
id: aje4lue48687******** service_account_id: ajeb9l33h6m******** created_at: "2024-08-01T11:58:52.313177213Z" key_algorithm: RSA_2048
Подробнее о команде
yc iam key create
см. в справочнике CLI. -
Создайте профиль, который будет использоваться для выполнения операций от имени сервисного аккаунта
deploy-sa
:yc config profile create <имя_профиля>
-
Укажите в конфигурации профиля авторизованный ключ сервисного аккаунта
deploy-sa
:yc config set service-account-key <путь_к_файлу_ключа>
-
-
Перейдите в папку с репозиторием и запустите скрипт:
Bashcd deploy && bash deploy.sh
В командной строке введите идентификатор каталога, имя сервисного аккаунта
speechsense-sa
, от которого будут вызываться функции и запускаться рабочий процесс, и имя бакета.Примерное время выполнения скрипта — 10-15 минут.
Создайте секрет
-
В консоли управления
выберите каталог, в котором хотите создать секрет. -
В списке сервисов выберите Lockbox.
-
Нажмите кнопку Создать секрет.
-
В поле Имя укажите имя секрета:
speechsense-secret
. -
В блоке Данные секрета:
-
Выберите тип секрета Пользовательский.
-
Добавьте API-ключ сервисного аккаунта:
- В поле Ключ укажите:
speechsense_api_key
. - В поле Значение укажите значение созданного ранее API-ключа сервисного аккаунта
speechsense-sa
.
- В поле Ключ укажите:
-
Нажмите кнопку Добавить ключ/значение и добавьте идентификатор подключения SpeechSense:
- В поле Ключ укажите:
speechsense_connection_id
. - В поле Значение укажите идентификатор подключения, созданного ранее.
- В поле Ключ укажите:
-
Нажмите кнопку Добавить ключ/значение и добавьте формат файлов с диалогами, которые будут загружены в SpeechSense:
- В поле Ключ укажите:
speechsense_file_format
. - В поле Значение укажите формат файла. Допустимые значения:
mp3
,wav
,ogg
,text
.
- В поле Ключ укажите:
-
-
Нажмите кнопку Создать.
Чтобы создать секрет, выполните команду:
yc lockbox secret create --name speechsense-secret \
--payload "[{'key': 'speechsense_api_key', 'text_value': '<API-ключ>'},{'key': 'speechsense_connection_id', 'text_value': '<идентификатор_подключения>'}, {'key': 'speechsense_file_format', 'text_value': '<формат_файлов>'}]"
Результат:
id: e6q2ad0j9b55********
folder_id: b1gktjk2rg49********
created_at: "2021-11-08T19:23:00.383Z"
name: speechsense-secret
status: ACTIVE
current_version:
id: g6q4fn3b6okj********
secret_id: e6e2ei4u9b55********
created_at: "2023-03-21T19:23:00.383Z"
status: ACTIVE
payload_entry_keys:
- speechsense_api_key
- speechsense_connection_id
- speechsense_file_format
Чтобы создать секрет, воспользуйтесь методом REST API create для ресурса Secret или вызовом gRPC API SecretService.Create.
Создайте модель данных
-
В папке с репозиторием откройте файл
pg_metadata.sql
. -
В блоке, отвечающем за вставку данных в таблицу
public.source_system
, укажите значения параметров:insert into public.source_system(source_system_id, lockbox_secret_id, source_system_desc) values ('<идентификатор_источника>', '<идентификатор_секрета>', '<описание_источника>');
Где:
source_system_id
— идентификатор источника данных, который будет использоваться в метаданных. Укажите любое уникальное строковое значение. Например:000001
.lockbox_secret_id
— идентификатор секрета Yandex Lockbox, созданного ранее. Например:e6qigo0vbci2********
.source_system_desc
— описание источника данных. Например:Загрузка данных телефонии
.
-
Скопируйте содержимое файла
pg_metadata.sql
и выполните получившийся запрос c помощью сервиса WebSQL:Консоль управления- Перейдите на страницу каталога и выберите сервис Managed Service for PostgreSQL.
- Нажмите на имя кластера, созданного ранее. По умолчанию это
speechsense-upload-metadata
. - Выберите вкладку WebSQL.
- Нажмите на имя подключения, которое заканчивается на
-uploader
. - На странице сервиса WebSQL нажмите на имя БД —
uploader
. - Вставьте запрос в редактор и нажмите кнопку Выполнить.
Создайте папки для хранения файлов и их метаданных
В созданном ранее бакете Object Storage создайте две папки:
client_data
— для файлов с диалогами.client_metadata
— для файлов с метаданными.
Папки не должны быть вложены одна в другую.
Чтобы создать папку:
- В консоли управления
выберите каталог, в котором находится бакет. - В списке сервисов выберите Object Storage.
- Выберите нужный бакет.
- Нажмите Создать папку и укажите имя папки.
- Нажмите на кнопку Создать.
Чтобы создать папку, выполните команду:
yc storage s3api put-object \
--bucket <имя_бакета> \
--key <имя_папки>/
Результат:
etag: '"d41d8cd98f00b204e9800998********"'
request_id: ba96231*********
Если у вас еще нет интерфейса командной строки AWS CLI, установите и сконфигурируйте его.
Чтобы создать папку, выполните команду:
aws s3api put-object \
--endpoint-url=https://storage.yandexcloud.net \
--bucket <имя_бакета>
--key <имя_папки>/
Результат:
{
"ETag": "\"d41d8cd98f00b204e9800998********\""
}
Чтобы создать папку, воспользуйтесь методом S3 API upload.
Подготовьте метаданные
Чтобы загрузить файл в SpeechSense, подготовьте его метаданные в формате JSON
. Например:
{
"source_system_id": "000001",
"bucket_folder": "bucket://client_data",
"metadata": [
{
"id": "my_audio.ogg",
"operator_id": "42",
"operator_name": "Иван Петров",
"client_id": "327142",
"client_name": "Петр Иванов",
"date": "2024-08-30 19:32:11",
"direction_outgoing": "0",
"language": "RU",
"file_name": "my_audio.ogg"
}
]
}
Где:
-
Параметры, которые используются функцией
speechsense-upload
для загрузки файлов:-
source_system_id
— идентификатор источника данных, указанный в таблицеpublic.source_system
. -
bucket_folder
— путь к созданной ранее папке для аудиозаписей или текстовых файлов. -
file_name
— имя файла, который будет загружен.
-
-
Параметры, обязательные для передачи в SpeechSense:
-
id
— идентификатор файла, уникальный для пространства SpeechSense. -
operator_id
— идентификатор оператора. -
operator_name
— имя оператора. -
client_id
— идентификатор клиента -
client_name
— имя клиента. -
date
— дата и время звонка в форматеYYYY-MM-DD HH24:MI:SS
. -
direction_outgoing
— направление звонка.0
— для исходящего звонка,1
— для входящего. -
language
— язык диалога.RU
— для русского языка.
-
-
Дополнительные параметры для аналитики в SpeechSense:
-
cpn_region_id
— идентификатор региона. -
cpn_region_name
— название региона.
cpn_region_id
иcpn_region_name
использованы в качестве примера. Дополнительные параметры могут быть другими. -
Метаданные могут содержать одну запись или массив из нескольких записей.
Важно
Не передавайте больше 100 записей одновременно: это может привести к потере данных, так как время выполнения функции Cloud Functions ограничено таймаутом.
Если файлов для загрузки больше 100, разделите их метаданные на отдельные JSON-файлы по 100 записей.
Загрузите файлы
Загрузите файлы с диалогами в папку client_data
, а JSON-файлы с метаданными — в папку client_metadata
.
Важно
Не загружайте файлы с диалогами в папку client_metadata
или вложенные в нее папки. Появление новых файлов в папке запустит рабочий процесс, но файлы с диалогами не пройдут проверку синтаксиса, которую проходят файлы с метаданными, и процесс завершится ошибкой.
Если файлов больше 1000, не используйте для загрузки консоль управления.
Чтобы загрузить файлы:
- В консоли управления
в списке сервисов выберите Object Storage и перейдите в бакет, в который нужно загрузить файлы. - На панели слева выберите
Объекты. - Перейдите в нужную папку, нажав на ее имя.
- Оказавшись в нужной папке, на верхней панели нажмите
Загрузить. - В появившемся окне выберите необходимые файлы и нажмите Открыть.
- Консоль управления отобразит все файлы, выбранные для загрузки, и предложит для каждого из них выбрать класс хранилища. Класс хранилища по умолчанию определяется настройкой бакета.
- Нажмите Загрузить.
- Обновите страницу.
В консоли управления информация о количестве объектов в бакете и занятом месте обновляется с задержкой в несколько минут.
Чтобы загрузить файл в папку, выполните команду:
yc storage s3api put-object \
--body <путь_к_загружаемому_файлу> \
--bucket <имя_бакета> \
--key <имя_папки>/<имя_файла>
Где:
--body
— путь к файлу, который нужно загрузить.--bucket
— имя бакета.--key
— путь к файлу в папке.
Результат:
etag: '"d41d8cd98f00b204e980099********"'
request_id: 3f2705f********
Чтобы загрузить один файл, выполните команду:
aws --endpoint-url=https://storage.yandexcloud.net/ \
s3 cp <путь_к_загружаемому_файлу> s3://<имя_бакета>/<имя_папки>/<имя_файла>
Чтобы загрузить все файлы из локальной директории и вложенных в нее директорий, используйте команду:
aws --endpoint-url=https://storage.yandexcloud.net/ \
s3 cp --recursive <путь_к_директории_с_загружаемыми_файлами>/ s3://<имя_бакета>/<имя_папки>/
Результат:
upload: <имя_файла> to <путь_к_файлу_в_бакете>
Чтобы загрузить файл, воспользуйтесь методом S3 API upload.
Совет
Проверьте результат
Чтобы проверить выполнение рабочего процесса:
- В консоли управления
в списке сервисов выберите Serverless Integrations. - На панели слева выберите
Workflows. - Нажмите на имя рабочего процесса. По умолчанию это
wf-speechsense-upload
. - Перейдите на вкладку Запуски.
- Убедитесь, что рабочий процесс находится в статусе
Выполнен
.
Чтобы проверить, что файлы загрузились в SpeechSense:
-
Откройте страницу сервиса WebSQL
. -
В разделе
Подключения выберите подключениеspeechsense-upload-metadata
и БДuploader
. -
Выберите схему
public
. -
В группе Таблицы выберите таблицу:
talk
— для просмотра загруженных в SpeechSense метаданных. Если файл с диалогом загружен, в его метаданных должен быть указан идентификаторtalk_id
.errors
— для просмотра ошибок, если загрузить файлы не удалось.
Удалите ресурсы
Некоторые ресурсы платные. Чтобы за них не списывалась плата, удалите ресурсы, которые вы больше не будете использовать.
-
Удалите объекты в бакете Object Storage и сам бакет.
-
Удалите кластер Managed Service for PostgreSQL.
-
Удалите триггер для вызова функции Cloud Functions.
-
Удалите функции Cloud Functions.
-
Удалите подключениe к базе данных кластера Managed Service for PostgreSQL:
- В консоли управления
перейдите в каталог, в котором хотите удалить подключение. - Выберите сервис Cloud Functions.
- На панели слева выберите
Подключения к БД. - В строке с подключением
speechsense-upload-metadata-connection
нажмите и выберите Удалить. - В открывшемся окне нажмите Удалить.
- В консоли управления
-
Удалите рабочий процесс Workflows:
- В консоли управления
перейдите в каталог, в котором хотите удалить рабочий процесс. - Выберите сервис Serverless Integrations.
- На панели слева выберите
Workflows. - В строке с рабочим процессом
wf-speechsense-upload
нажмите и выберите Удалить. - В открывшемся окне нажмите Удалить.
- В консоли управления