【问题标题】:AWS transcribe using PHP API: Throttling Exception: Rate exceededAWS 使用 PHP API 转录:限制异常:超出速率
【发布时间】:2019-04-03 02:09:18
【问题描述】:

尝试使用 AWS SDK PHP API 转录存储在我可以访问的 S3 存储桶中的音频文件,如下所示,给了我一个限制异常:超出速率。

我已阅读文档十几次,但找不到一个简单的工作示例来说明如何使用 AWS transcribe 及其 PHP API 成功转录文件。

date_default_timezone_set('America/New_York');
try 
{
    require '/var/www/html/aws/sdk/aws-autoloader.php';
} 
catch (Exception $e) 
{
    echo 'Caught exception: ',  $e->getMessage(), "\n";
}
use Aws\TranscribeService\TranscribeServiceClient;

$client = new Aws\TranscribeService\TranscribeServiceClient([
    'version'       => 'latest',
    'region'        => 'us-east-1',
    'credentials'   => [
                    'key'           => 'xxxx',
                    'secret'        => 'yyyy',
                    'curl.options'  => array(CURLOPT_VERBOSE => true)
                    ]
        ]);
$job_name = "tjob".date("mdyhisa");
$job_uri = "https://s3.amazonaws.com/....mp3";          

$result = $client->startTranscriptionJob([
    'LanguageCode' => 'en-US', 
    'Media' => [ 
    'MediaFileUri' => "$job_uri",
    ],
    'MediaFormat' => 'mp3', 

    'TranscriptionJobName' => "$job_name", 
]);
/* removing this loop and the sleep() below would retrieve some structured response, 
but of course the operation status is IN_PROGRESS */
while(true)
{
    /* added to discover if holding a few seconds would work: it doesn't
       and gives back a 504 Gateway Timeout */
    sleep(rand(3,5));
    /* -- */
    $result = $client->getTranscriptionJob(['TranscriptionJobName' => "$job_name"]);
    if ( ($result['TranscriptionJob']['TranscriptionJobStatus']=='COMPLETED') || ($result['TranscriptionJob']['TranscriptionJobStatus']=='FAILED'))
    {
        break;  
    }
}
var_dump($result);

所以问题是:如何获得转录输出?

顺便说一句,我不需要这个异步...我的小项目等待它处理并返回就可以了。

【问题讨论】:

    标签: php amazon-web-services aws-transcribe


    【解决方案1】:

    您的代码可能运行良好,但您的 while(true) 循环调用 API 的次数过多,因此出现 throttling exception: rate exceeded 错误。

    我建议您在每次调用 getTranscriptionJob 之间延迟 5 秒。我发现一项工作可能需要大约 60 秒才能完成,因此您无需连续调用它。

    【讨论】:

    • 我确实尝试过,但我得到了 504 网关超时错误
    • 您在哪一行收到此错误?您是说在通话之间引入延迟会导致 504 错误吗?这似乎很奇怪!
    • 正确:添加 sleep() 会引发 504 错误(没有进一步的调试打印),没有 sleep() 我会超出速率。
    • 如果删除 while() 循环,我会收到结构化响应,但它的状态当然是 IN_PROGRESS 所以肯定是 sleep() 导致了 504 错误
    • 可能是这样,因为 Transcribe 需要很长时间才能完成(例如 60 秒以上),因此您的 Web 服务器将其视为“页面超时”。在这种情况下,您需要重新构建您的应用程序,使其不会坐等 Transcribe 完成,而是提交作业,然后尝试获取结果(无需循环和等待)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-10
    • 2018-08-27
    • 2019-05-23
    • 2011-12-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多