You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 04:28:05