Aws Transribe не может start_transcription_job без LanguageCode в boto3

У меня есть аудиофайл в S3.

Я не знаю языка аудиофайла. Поэтому мне нужно использовать IdentifyLanguage вместо start_transcription_job().

LanguageCode будет пустым, поскольку я не знаю языка аудиофайла.

Окружающая среда

Используется среда выполнения Python 3.8, версия boto3 1.16.5, версия ботокора: 1.19.5, без Lambda Layer.

Вот мой код для работы по расшифровке:

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 Console, тестировал то же events.json, но все равно получаю ту же ошибку

Я думаю, что это среда Lambda Execution, я не использовал какой-либо Lambda Layer.

Я просматриваю эти документы от 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 является допустимым параметром.

Так что я упускаю? Есть идеи по этому поводу? Что я должен делать?

Обновление:

Я продолжаю искать и спросил пару человек в Интернете, я думаю, что я должен создать функциональный контейнер 1st, чтобы позволить 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

Какая возможная причина вызывает это, и как я могу решить эту проблему (я не знаю язык аудиофайла, я хочу определить язык аудиофайла без указания кода языка)?


person ken    schedule 27.10.2020    source источник


Ответы (2)


Проверьте, используете ли вы последнюю версию 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
    }
}
person Prakash    schedule 27.10.2020
comment
Привет, сэр, только что проверил, что версия Version: 1.16.5 такая же ... и я действительно звоню start_transription_job, как и вы. Но я все равно получаю сообщение об ошибке выше. - person ken; 27.10.2020
comment
Попробуйте включить boto3 в файл requirements.txt, а затем запустите sam build --use-container , а затем sam local invoke -e events/event.json - person Prakash; 30.10.2020

В конце концов, я замечаю, что это связано с тем, что моя упакованная лямбда-функция по какой-то причине не загружается. Вот как я решил это после того, как мне помогли несколько человек.

Сначала измените стек 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.PYTHONentry8,
            handler='MyHandler', 
            timeout=core.Duration.seconds(10)
        )

Будет использоваться aws-lambda-python module, он выполнит установку всех необходимых модулей в докер.

Затем cdk синтезирует файл шаблона

cdk synth --no-staging > template.yaml 

На этом этапе он объединит все компоненты внутри entry пути, который определен в PythonFunction, и установит все необходимые зависимости, определенные в requirements.txt, внутри этого entry пути.

Затем создайте контейнер докера

$ sam build --use-container

Убедитесь, что файл template.yaml находится в корневом каталоге. Это создаст контейнер докера, и артефакт будет построен внутри каталога .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 без сборки контейнера 1-го по sam build --use-container
  3. Наконец, у меня наконец sam build, но в тот момент я не связал то, что определено внутри requirements.txt, в .aws-sam/build, поэтому нужно использовать aws-lambda-python module, как указано выше.
person ken    schedule 30.10.2020