没有 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
的文档:
明确说明 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
没有LanguageCode
和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
,正如我上面的问题所述,没有任何错误。
结论:
- 一开始我只有
pip install boto3
,这只会
在我的本地系统中安装 boto3
。
- 然后,我
sam local invoke
第一次构建容器时 sam build --use-container
- 最后,我终于有了
sam build
,但在那一点上,我没有
将 requirements.txt
中定义的内容捆绑到
.aws-sam/build
,因此需要使用aws-lambda-python
module 如上所述。
我在 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
的文档:
明确说明 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
没有
LanguageCode
和
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
,正如我上面的问题所述,没有任何错误。
结论:
- 一开始我只有
pip install boto3
,这只会 在我的本地系统中安装boto3
。 - 然后,我
sam local invoke
第一次构建容器时sam build --use-container
- 最后,我终于有了
sam build
,但在那一点上,我没有 将requirements.txt
中定义的内容捆绑到.aws-sam/build
,因此需要使用aws-lambda-python module 如上所述。