如何在Lambda中仅当转录任务完成时打印get_transcription_job响应?
解决AWS Transcribe任务完成后获取结果的问题
方案1:利用Transcribe任务完成通知(推荐)
这种异步方式彻底避免Lambda等待超时的问题,流程如下:
- 调用
start_transcription_job时,指定OutputBucketName存储转录结果,同时通过NotificationChannel配置SNS主题ARN,让Transcribe在任务完成/失败时自动推送通知。 - 创建新Lambda函数并订阅该SNS主题,收到通知后提取任务名称,调用
get_transcription_job获取完整结果并打印。
启动任务的Lambda代码示例:
import boto3 transcribe = boto3.client('transcribe') def lambda_handler(event, context): # 从S3触发事件中提取文件信息 s3_record = event['Records'][0]['s3'] media_uri = f"s3://{s3_record['bucket']['name']}/{s3_record['object']['key']}" transcribe.start_transcription_job( TranscriptionJobName=f"transcribe-job-{context.aws_request_id}", Media={'MediaFileUri': media_uri}, MediaFormat='mp3', # 根据实际文件格式调整 LanguageCode='zh-CN', # 根据音频语言调整 OutputBucketName='your-result-bucket-name', NotificationChannel={ 'SNSTopicArn': 'arn:aws:sns:us-east-1:123456789012:transcribe-completion-topic', 'RoleArn': 'arn:aws:iam::123456789012:role/transcribe-notification-role' } )
处理通知的Lambda代码示例:
import boto3 import json transcribe = boto3.client('transcribe') def lambda_handler(event, context): # 解析SNS消息中的任务信息 sns_message = json.loads(event['Records'][0]['Sns']['Message']) job_name = sns_message['TranscriptionJobName'] # 获取完成的转录任务结果 job_response = transcribe.get_transcription_job(TranscriptionJobName=job_name) print(job_response)
方案2:指数退避重试(仅限短耗时任务)
如果必须在同一个Lambda内等待任务完成,用指数退避替代固定sleep,同时调整Lambda超时时间(最长支持15分钟):
- 每次检查状态后,等待时间翻倍(1s→2s→4s…),减少无效等待
- 设置最大重试次数,避免无限循环
代码示例:
import boto3 import time transcribe = boto3.client('transcribe') def lambda_handler(event, context): # 启动转录任务(省略部分代码,参考方案1) job_name = f"transcribe-job-{context.aws_request_id}" max_retries = 12 # 按需调整,最长等待时间约为4095秒(≈68分钟,超过Lambda最大超时需缩减) retry_count = 0 wait_seconds = 1 while retry_count < max_retries: job_response = transcribe.get_transcription_job(TranscriptionJobName=job_name) job_status = job_response['TranscriptionJob']['TranscriptionJobStatus'] if job_status == 'COMPLETED': print(job_response) break elif job_status == 'FAILED': print(f"任务失败原因: {job_response['TranscriptionJob']['FailureReason']}") break time.sleep(wait_seconds) wait_seconds *= 2 retry_count += 1 if retry_count >= max_retries: print("等待超时,转录任务仍未完成")
注意:此方案仅适用于转录任务耗时在Lambda超时范围内的场景,长时间任务优先用方案1。
内容的提问来源于stack exchange,提问作者user13528908
相关产品推荐
相关产品推荐

