【问题标题】:AWS transcribe- Bad request: error detected at at 'transcriptionJobName' failed to satisfy constraint:AWS transcribe- 错误请求:在“transcriptionJobName”处检测到错误未能满足约束:
【发布时间】:2022-05-20 03:32:30
【问题描述】:

您好,我将转录作业调用到 AWS lambda 函数,但我找不到任何创建的作业角色,我在云监视日志中看到了这个错误。谁能帮我解决这个问题,我遇到了 3 天的麻烦,但我找不到任何解决方案。

这是错误信息

'use strict';
var aws = require('aws-sdk');
var s3 = new aws.S3();
var transcribeservice = new aws.TranscribeService();

exports.handler = (event, context, callback) => {
    console.log('Received event:', JSON.stringify(event, null, 2));
    var bucket = event.Records[0].s3.bucket.name;
    var key = event.Records[0].s3.object.key;    
    var newKey = key.split('.')[0];
    var str = newKey.lastIndexOf("/");
    newKey = newKey.substring(str+1);
    
    var inputaudiolocation = "https://s3.amazonaws.com/search-video/inputaudio/";
    var mp3URL = inputaudiolocation+newKey+".mp3";
    var outputbucket = "search-video";
    var params = {
        LanguageCode: "en-US", /* required */
        Media: { /* required */
          MediaFileUri: mp3URL
        },
        MediaFormat: "mp3", /* required */
        TranscriptionJobName: newKey, /* required */
        MediaSampleRateHertz: 44100,
        OutputBucketName: outputbucket
      };
      transcribeservice.startTranscriptionJob(params, function(err, data){
      if (err){
       console.log('Received event:Error = ',err);
      } else {
       console.log('Received event:Success = ',data);
      }
     });
};
'''
Thanks in Advance !!!

【问题讨论】:

    标签: json aws-lambda amazon-cloudwatch amazon-transcribe


    【解决方案1】:

    鉴于它已经过去了 10 个月,我猜你可能已经继续处理这个问题了。无论如何,日志图像有转录作业失败的原因:由于其名称与所需的正则表达式(regex)不匹配。

    TranscriptionJobName parameter description in AWS Transcribe API Reference 中所述,它必须匹配^[0-9a-zA-Z._-]+ 正则表达式模式。

    我天真地解决该问题的建议是删除所有不允许的字符。在params 声明之前但在最后一个newKey 赋值之后,您可以包括:

    天真的建议

    newKey = newKey.replace(/[^0-9a-zA-Z._-]/g, '')
    

    这应该足以解决您的问题。该代码的解释在下面的另一个建议中进行了描述。

    但是,如果我们重新访问TranscriptionJobName 参数文档,则需要注意一些注意事项。

    TranscriptionJobName

    您为转录作业选择的唯一名称。您指定的名称也用作转录输出文件的默认名称。如果您想为转录输出指定不同的名称,请使用OutputKey 参数。

    此名称区分大小写,不能包含空格,并且在 AWS 账户中必须是唯一的。如果您尝试创建与现有作业同名的新作业,您会得到一个 @ 987654335@错误。

    类型:字符串

    长度限制:最小长度为 1。最大长度为 200。

    模式:^[0-9a-zA-Z._-]+

    必填:是

    考虑到唯一性约束、最大长度约束和正则表达式模式约束,建议将所有这些都考虑在内

    更好的建议

    const nowAsISOString = (new Date()).toISOString();
    newKey = (nowAsISOString+newKey).replace(/[^0-9a-zA-Z._-]/g, '').slice(0, 200);
    

    它考虑了使用Date.prototype.toISOString() 设置作业名称时的时间戳。 nowAsISOString 将存储一个字符串值,例如2011-10-05T14:48:00.000Z

    注意nowAsISOString 将包含TranscriptionJobName 参数的无效字符。但这一事实本身不会成为问题,因为完整的字符串(时间戳加上先前选择的名称 - nowAsISOString+newKey)将根据模式将其无效字符替换为空字符串 (.replace(/[^0-9a-zA-Z._-]/g, ''))。

    ^[] 组中的第一个字符时,表示否定:它将匹配组中未涵盖的所有内容。

    The MDN JavaScript Regular Expressions Groups and ranges page有更详细的解释:

    字符[^xyz] [^a-c]

    含义: 否定或补充字符类。也就是说,它匹配任何未包含在括号中的内容。您可以使用连字符指定字符范围,但如果连字符出现在方括号中的第一个或最后一个字符,则它被视为文字连字符,作为普通字符包含在字符类中。例如,[^abc] 与 [^a-c] 相同。它们最初匹配“bacon”中的“o”和“chop”中的“h”。 注意: ^ 字符也可能表示beginning of input

    replace 函数匹配一个模式并将其替换为替换。在建议的情况下,它将多次匹配不允许使用空字符串的所有内容(g 参数)。有关replace 函数的更多详细信息,请访问MDN's String.prototype.replace() page

    考虑到上述解释,它将删除与TranscriptionJobName 的预期模式不匹配的所有字符。重新访问字符串时间戳示例,它将从 2011-10-05T14:48:00.000Z 替换为 2011-10-05T144800.000Z

    最后一部分.slice(0, 200) 会将字符串截断为最多包含 200 个字符。有关slice 函数的更多详细信息,请访问MDN's String.prototype.slice() page

    根据更好的建议,您将有一个 TranscriptionJobName 参数:

    • 由于名称定义时间戳而唯一
    • 将删除无效字符(OP 初始问题),并且
    • 在允许的字符数内有一个字符串。

    【讨论】:

      猜你喜欢
      • 2016-09-10
      • 2016-02-27
      • 1970-01-01
      • 2021-11-23
      • 2020-09-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多