1

我有一个音频文件S3

我不知道音频文件的语言。所以我需要使用IdentifyLanguagefor 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"
  ]
}

有了这个错误,意味着我必须指定LanguageCodeandIdentifyLanguage是一个无效的参数。

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

但是,我仍然得到同样的错误,但也发布了堆栈跟踪

[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 问题,但似乎无法重现该问题。

主要问题/问题:

无法start_transription_job

  1. 没有LanguageCode

  2. IdentifyLanguage=True

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

4

2 回答 2

1

检查您是否使用最新的 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
    }
}
于 2020-10-27T14:45:25.580 回答
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 模块,它将处理将所有必需的模块安装到 docker 中。

接下来,cdk 合成一个模板文件

cdk synth --no-staging > template.yaml 

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

接下来,构建 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 模块。
于 2020-10-30T00:49:20.553 回答