Вызвать еще одну лямбду после завершения процесса записи AWS - PullRequest
0 голосов
/ 30 октября 2018

У меня есть лямбда, которая срабатывает, когда кто-нибудь загружает аудиофайл в корзину. Мне нужно обработать файл, используя AWS Transcribe в асинхронном режиме. Я написал код, чтобы сделать это, но проблема в том, что его проверка выполняется только один раз, это не вызов функции-обработчика после завершения обработки файла.

Ниже приведена ссылка stackoverflow для транскрипции AWS, но нам нужно дождаться ответа до тех пор, пока задание не будет завершено, и у лямбда-функции будет тайм-аут в течение 5 минут. После этого исполнение будет остановлено.

// чтобы создать асинхронный клиентский объект для вызова AWS Transcribe

private AmazonTranscribeAsync asyncClient = AmazonTranscribeAsyncClientBuilder.standard().build();

// ниже приведен метод, который вызывает API-интерфейс AWS с загруженным аудиофайлом

private void startText(String guid, String bucket) {
    String jobName = UUID.randomUUID().toString();
    StartTranscriptionJobRequest request = new StartTranscriptionJobRequest();
    request.withLanguageCode(LanguageCode.EnUS);

    Settings channel_settings = new Settings();
    channel_settings.setChannelIdentification(true);
    channel_settings.withChannelIdentification(true);

    Media media = new Media();
    media.setMediaFileUri(s3.getUrl(bucket, guid).toString());
    request.withMedia(media);
    request.setTranscriptionJobName(jobName);
    request.withMediaFormat(getFileFormat(guid));
    request.withSettings(channel_settings);
    asyncClient.startTranscriptionJobAsync(request, new AsyncTranscriptionJobHandler());
}

// метод асинхронного обработчика

private class AsyncTranscriptionJobHandler implements AsyncHandler<StartTranscriptionJobRequest, StartTranscriptionJobResult>
{
    public void onError(Exception e) {
        System.out.println(e.getMessage());
        System.exit(1);
    }

    @Override
    public void onSuccess(StartTranscriptionJobRequest request, StartTranscriptionJobResult result) {
        logger.log(result.getTranscriptionJob().getTranscriptionJobName());
        TranscriptionJob transcriptionJob = result.getTranscriptionJob(); 
        if (transcriptionJob.getTranscriptionJobStatus().equals(TranscriptionJobStatus.COMPLETED.name())) {
            logger.log("completed");
        } else if(transcriptionJob.getTranscriptionJobStatus().equals(TranscriptionJobStatus.FAILED.name())) {
            logger.log("failed");
        } else if(transcriptionJob.getTranscriptionJobStatus().equals(TranscriptionJobStatus.IN_PROGRESS.name())) {
            logger.log("processing");
        }

    }
}

1 Ответ

0 голосов
/ 31 октября 2018

Хитрость здесь в том, чтобы не ждать окончания транскрибирования, а вызвать его в одной лямбде, а затем запустить отдельную лямбду после завершения транскрипции.

AWS Transcribe использует CloudWatch Events для уведомления о завершении или сбое задания (https://docs.aws.amazon.com/transcribe/latest/dg/cloud-watch-events.html), которые являются поддерживаемым источником событий для лямбды (https://docs.aws.amazon.com/lambda/latest/dg/invoking-lambda-function.html#supported-event-source-cloudwatch-events)

)
...