AWS 转录过程完成后调用另一个 lambda
Invoke another lambda after the AWS transcribe process is completed
我有一个 lambda,它会在任何人将音频文件上传到存储桶时触发。我需要使用 AWS Transcribe 异步处理文件。我写了代码来做到这一点,但问题是它只检查一次,它不是在文件处理完成后调用处理函数。
下面是 AWS 转录的 Whosebug link,但我们必须等待响应,直到作业完成并且 lambda 函数超时 5 分钟。之后执行将停止。
// 创建一个异步客户端对象来调用 AWS Transcribe
private AmazonTranscribeAsync asyncClient = AmazonTranscribeAsyncClientBuilder.standard().build();
// 以下是调用 AWS API 并上传音频文件的方法
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");
}
}
}
这里的技巧是不等待转录完成,而是在一个lambda中调用它,然后在转录完成后触发一个单独的lambda。
AWS Transcribe 使用 CloudWatch Events 在作业完成或失败时发出通知 (https://docs.aws.amazon.com/transcribe/latest/dg/cloud-watch-events.html) which are a supported event source for lambda (https://docs.aws.amazon.com/lambda/latest/dg/invoking-lambda-function.html#supported-event-source-cloudwatch-events)
我有一个 lambda,它会在任何人将音频文件上传到存储桶时触发。我需要使用 AWS Transcribe 异步处理文件。我写了代码来做到这一点,但问题是它只检查一次,它不是在文件处理完成后调用处理函数。
下面是 AWS 转录的 Whosebug link,但我们必须等待响应,直到作业完成并且 lambda 函数超时 5 分钟。之后执行将停止。
// 创建一个异步客户端对象来调用 AWS Transcribe
private AmazonTranscribeAsync asyncClient = AmazonTranscribeAsyncClientBuilder.standard().build();
// 以下是调用 AWS API 并上传音频文件的方法
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");
}
}
}
这里的技巧是不等待转录完成,而是在一个lambda中调用它,然后在转录完成后触发一个单独的lambda。
AWS Transcribe 使用 CloudWatch Events 在作业完成或失败时发出通知 (https://docs.aws.amazon.com/transcribe/latest/dg/cloud-watch-events.html) which are a supported event source for lambda (https://docs.aws.amazon.com/lambda/latest/dg/invoking-lambda-function.html#supported-event-source-cloudwatch-events)