没有 boto3 中的 LanguageCode,Aws Transribe 无法 start_transcription_job

Aws Transribe unable to start_transcription_job without LanguageCode in boto3

我在 S3 中有一个音频文件。

我不知道音频文件的语言。所以我需要使用 IdentifyLanguage 作为 start_transcription_job().

LanguageCode 将是空白的,因为我不知道音频文件的语言。

环境

正在使用 Python 3.8 运行时, boto3 版本 1.16.5 , botocore 版本:1.19.5, 没有 Lambda 层。

这是我的转录作业代码:

mediaFileUri = 's3://'+ bucket_name+'/'+prefixKey

transcribe_client = boto3.client('transcribe')

response = transcribe_client.start_transcription_job(
    TranscriptionJobName="abc",
    IdentifyLanguage=True,
    Media={
        'MediaFileUri':mediaFileUri
    },
)

然后我得到这个错误:

{
  "errorMessage": "Parameter validation failed:\nMissing required parameter in input: \"LanguageCode\"\nUnknown parameter in input: \"IdentifyLanguage\", must be one of: TranscriptionJobName, LanguageCode, MediaSampleRateHertz, MediaFormat, Media, OutputBucketName, OutputEncryptionKMSKeyId, Settings, ModelSettings, JobExecutionSettings, ContentRedaction",
  "errorType": "ParamValidationError",
  "stackTrace": [
    "  File \"/var/task/app.py\", line 27, in TranscribeSoundToWordHandler\n    response = response = transcribe_client.start_transcription_job(\n",
    "  File \"/var/runtime/botocore/client.py\", line 316, in _api_call\n    return self._make_api_call(operation_name, kwargs)\n",
    "  File \"/var/runtime/botocore/client.py\", line 607, in _make_api_call\n    request_dict = self._convert_to_request_dict(\n",
    "  File \"/var/runtime/botocore/client.py\", line 655, in _convert_to_request_dict\n    request_dict = self._serializer.serialize_to_request(\n",
    "  File \"/var/runtime/botocore/validate.py\", line 297, in serialize_to_request\n    raise ParamValidationError(report=report.generate_report())\n"
  ]
}

有了这个错误,意味着我必须指定 LanguageCode 并且 IdentifyLanguage 是一个无效参数。

100% 确定音频文件存在于 S3 中。但是没有 LanguageCode 它不起作用,并且 IdentifyLanguage 参数是未知参数

我使用 SAM 应用程序使用此命令在本地进行测试:

sam local invoke MyHandler -e lambda\TheDirectory\event.json

cdk deploy 也检查了 Aws Lambda 控制台,对其进行了相同的测试 events.json,但仍然出现相同的错误

我认为这是 Lambda 执行环境,我没有使用任何 Lambda 层。

我从 Aws Transcribe 看这个文档:

https://docs.aws.amazon.com/transcribe/latest/dg/API_StartTranscriptionJob.html

boto3 的文档:

https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/transcribe.html#TranscribeService.Client.start_transcription_job

明确说明 LanguageCode 不是必需的,IdentifyLanguage 是有效参数。

所以我错过了什么?对此有什么想法吗?我该怎么办?

更新:

一直在网上找,问了几个人,我觉得应该先建函数容器,让SAM把boto3打包到容器里。

所以我做的是,cdk synth一个模板文件:

cdk synth --no-staging > template.yaml

然后:

sam build --use-container
sam local invoke MyHandler78A95900 -e lambda\TheDirectory\event.json

但是,我仍然得到同样的错误,但是 post 堆栈跟踪也是如此

[ERROR] ParamValidationError: Parameter validation failed:
Missing required parameter in input: "LanguageCode"
Unknown parameter in input: "IdentifyLanguage", must be one of: TranscriptionJobName, LanguageCode, MediaSampleRateHertz, MediaFormat, Media, OutputBucketName, OutputEncryptionKMSKeyId, Settings, JobExecutionSettings, ContentRedaction
Traceback (most recent call last):
  File "/var/task/app.py", line 27, in TranscribeSoundToWordHandler
    response = response = transcribe_client.start_transcription_job(
  File "/var/runtime/botocore/client.py", line 316, in _api_call
    return self._make_api_call(operation_name, kwargs)
  File "/var/runtime/botocore/client.py", line 607, in _make_api_call
    request_dict = self._convert_to_request_dict(
  File "/var/runtime/botocore/client.py", line 655, in _convert_to_request_dict
    request_dict = self._serializer.serialize_to_request(
  File "/var/runtime/botocore/validate.py", line 297, in serialize_to_request
    raise ParamValidationError(report=report.generate_report())

真的不知道我做错了什么。我也报告了一个 github issue here,但似乎无法重现该问题。

主要Question/Problem:

无法start_transription_job

  1. 没有LanguageCode

  2. IdentifyLanguage=True

这可能是什么原因造成的,我该如何解决这个问题(不知道音频文件的语言,我想在没有给出语言代码的情况下识别音频文件的语言)?

检查您是否使用最新的boto3版本。

boto3.__version__  
'1.16.5'

我试过了,很有效。

import boto3

transcribe = boto3.client('transcribe')
response = transcribe.start_transcription_job(TranscriptionJobName='Test-20201-27',IdentifyLanguage=True,Media={'MediaFileUri':'s3://BucketName/DemoData/Object.mp4'})

print(response)
{
    "TranscriptionJob": {
        "TranscriptionJobName": "Test-20201-27",
        "TranscriptionJobStatus": "IN_PROGRESS",
        "Media": {
            "MediaFileUri": "s3://BucketName/DemoData/Object.mp4"
        },
        "StartTime": "datetime.datetime(2020, 10, 27, 15, 41, 2, 599000, tzinfo=tzlocal())",
        "CreationTime": "datetime.datetime(2020, 10, 27, 15, 41, 2, 565000, tzinfo=tzlocal())",
        "IdentifyLanguage": "True"
    },
    "ResponseMetadata": {
        "RequestId": "9e4f94a4-20e4-4ca0-9c6e-e21a8934084b",
        "HTTPStatusCode": 200,
        "HTTPHeaders": {
            "content-type": "application/x-amz-json-1.1",
            "date": "Tue, 27 Oct 2020 14:41:02 GMT",
            "x-amzn-requestid": "9e4f94a4-20e4-4ca0-9c6e-e21a8934084b",
            "content-length": "268",
            "connection": "keep-alive"
        },
        "RetryAttempts": 0
    }
}

最后我注意到这是因为我打包的 lambda 函数由于某种原因没有被上传。这是我在得到几个人的帮助后解决的方法。

首先修改定义我的 lambda 函数的 CDK 堆栈:

from aws_cdk import (
    aws_lambda as lambda_,
    core
)

from aws_cdk.aws_lambda_python import PythonFunction

class MyCdkStack(core.Stack):

    def __init__(self, scope: core.Construct, id: str, **kwargs) -> None:
        super().__init__(scope, id, **kwargs)

        # define lambda 
        my_lambda = PythonFunction(
            self, 'MyHandler',
            entry='lambda/MyHandler',
            index='app.py',
            runtime=lambda_.Runtime.PYTHON_3_8,
            handler='MyHandler', 
            timeout=core.Duration.seconds(10)
        )

这将使用 aws-lambda-python module ,它将处理将所有必需的模块安装到 docker.

接下来cdk合成模板文件

cdk synth --no-staging > template.yaml 

此时,它会将 PythonFunction 中定义的 entry 路径中的所有内容捆绑在一起,并在 entry 中安装 requirements.txt 中定义的所有必要依赖项路径。

接下来,构建 docker 容器

$ sam build --use-container

确保 template.yaml 文件在根目录中。这将构建一个 docker 容器,工件将在我的根目录中的 .aws-sam/build 目录中构建。

最后一步,使用sam调用函数:

sam local invoke MyHandler78A95900 -e path\to\event.json

现在终于成功调用start_transcription_job,正如我上面的问题所述,没有任何错误。

结论:

  1. 一开始我只有pip install boto3,这只会 在我的本地系统中安装 boto3
  2. 然后,我 sam local invoke 第一次构建容器时 sam build --use-container
  3. 最后,我终于有了 sam build,但在那一点上,我没有 将 requirements.txt 中定义的内容捆绑到 .aws-sam/build,因此需要使用aws-lambda-python module 如上所述。