Узнайте, как использовать Amazon Transcribe и AWS Lambda для создания приложения для преобразования аудио в текст, написанного на Go.

В этом сообщении блога вы узнаете, как создать бессерверное решение для преобразования речи в текст с использованием Amazon Transcribe, AWS Lambda и языка программирования Go. Аудиофайлы, загруженные в Amazon Simple Storage Service (S3), активируют функцию Lambda, которая отправит асинхронное задание в Amazon Transcribe (используя AWS Go SDK), который, в свою очередь, сохранит результат в другой корзине S3.

Вы будете использовать язык программирования Go для бизнес-логики (благодаря библиотеке aws-lambda-go), а также компонент инфраструктуры (привязки Go для AWS CDK) для развертывания решения.

Код доступен на GitHub

Введение

Amazon Transcribe — это сервис, использующий модели машинного обучения для автоматического преобразования речи в текст. Он предлагает различные функции, которые могут повысить точность расшифрованного текста, такие как настройка языка, фильтрация контента, многоканальный анализ звука и разделение речи отдельных говорящих. Amazon Transcribe можно использовать как автономный сервис транскрипции или для добавления возможностей преобразования речи в текст в любое приложение. Вы можете расшифровывать медиафайлы в режиме реального времени (потоковая передача) или расшифровывать медиафайлы, находящиеся в корзине Amazon S3 (пакетно).

Amazon Transcribe можно использовать в различных случаях, в том числе:

  • Обслуживание и поддержка клиентов: расшифровывайте звонки, чаты и электронные письма службы поддержки, что позволяет компаниям анализировать отзывы клиентов, выявлять проблемы и улучшать качество обслуживания клиентов.
  • Образование и исследования. Расшифровывайте лекции, семинары и исследовательские интервью, позволяя исследователям и преподавателям создавать доступные для поиска расшифровки текстов.
  • Доступность. Добавляйте скрытые субтитры для прямых трансляций, вебинаров и других мероприятий, делая контент доступным для зрителей.
  • Медиа и развлечения: расшифровывайте подкасты, интервью и другой аудиоконтент, позволяя медиа-компаниям создавать доступные для поиска расшифровки текстов.

Давайте изучим Amazon Transcribe с помощью практического руководства.

Предпосылки

Прежде чем продолжить, убедитесь, что у вас установлено следующее:

Клонируйте проект и перейдите в нужный каталог:

git clone https://github.com/abhirockzz/ai-ml-golang-transcribe-speech-to-text
cd ai-ml-golang-transcribe-speech-to-text

Используйте AWS CDK для развертывания решения

Комплект AWS Cloud Development Kit (AWS CDK) — это платформа, позволяющая определить вашу облачную инфраструктуру как код в одном из поддерживаемых программ и предоставить ее через AWS CloudFormation.

Чтобы начать развертывание, просто вызовите cdk deploy и немного подождите. Вы увидите список ресурсов, которые будут созданы, и вам нужно будет предоставить подтверждение, чтобы продолжить.

cd cdk

cdk deploy

# output

Bundling asset LambdaTranscribeAudioToTextGolangStack/audio-to-text-function/Code/Stage...

✨  Synthesis time: 4.42s

//.... omitted

Do you wish to deploy these changes (y/n)? y

Введите y, чтобы начать создание ресурсов AWS, необходимых для приложения.

Если вы хотите увидеть шаблон AWS CloudFormation, который будет использоваться за кулисами, запустите cdk synth и проверьте папку cdk.out.

Вы можете отслеживать процесс создания стека в терминале или перейти в консоль AWS: CloudFormation > Stacks > LambdaTranscribeAudioToTextGolangStack.

После завершения создания стека у вас должно быть:

  • Две корзины S3 — Исходная корзина для загрузки аудиофайлов и целевая корзина для хранения расшифрованных текстовых файлов.
  • Функция Lambda для преобразования аудио в текст с помощью Amazon Transcribe.
  • …. наряду с несколькими другими компонентами (такими как роли IAM и т. д.)

Вы также увидите следующий вывод в терминале (имена ресурсов в вашем случае будут отличаться). В данном случае это имена корзин S3, созданных CDK:

✅  LambdaTranscribeAudioToTextGolangStack

✨  Deployment time: 98.61s

Outputs:
LambdaTranscribeAudioToTextGolangStack.audiofilesourcebucketname = lambdatranscribeaudiotot-audiofilesourcebucket05f-182vj224hnpfl
LambdaTranscribeAudioToTextGolangStack.transcribejobbucketname = lambdatranscribeaudiotot-transcribejoboutputbucke-1gi0bu6r1d1jn
.....

Теперь вы можете попробовать комплексное решение!

Преобразуйте речь в текст!

Чтобы попробовать решение, вы можете использовать собственный аудиофайл в формате mp3. Мне очень нравится слушать подкаст Go Time. В демонстрационных целях я просто использую один из его эпизодов и загружаю (файл MP3) в исходную корзину S3 с помощью интерфейса командной строки S3.

export SOURCE_BUCKET=<enter source S3 bucket name - check the CDK output>

curl -sL https://cdn.changelog.com/uploads/gotime/267/go-time-267.mp3 | aws s3 cp - s3://$SOURCE_BUCKET/go-time-267.mp3

# verify that the file was uploaded
aws s3 ls s3://$SOURCE_BUCKET

Это вызовет задание пакетной расшифровки — вы можете проверить статус задания в консоли AWS: Amazon Transcribe > Jobs. После завершения вы должны увидеть новый файл (в выходной корзине S3) с тем же именем, что и у загруженного вами аудиофайла, но с расширением .txt — это выходной файл, сгенерированный Amazon Transcribe.

Загрузите и откройте выходной файл.

export TARGET_BUCKET=<enter target S3 bucket name - check the CDK output>

# list contents of the target bucket
aws s3 ls s3://$TARGET_BUCKET

# download the output file
aws s3 cp s3://$TARGET_BUCKET/go-time-267.txt .

Интересно, что у него есть полезная нагрузка JSON, которая выглядит так:

{
    "jobName": "job-go-time-267",
    "accountId": "1234566789",
    "results": {
        "transcripts": [
            {
                "transcript": "<transcribed text output...>"
            }
        ]
    },
    "status": "COMPLETED"
}

Вы можете использовать свойство transcript для извлечения фактического текста.

Не забывайте убирать

Когда вы закончите, чтобы удалить все службы, просто используйте:

cdk destroy

#output prompt (choose 'y' to continue)

Are you sure you want to delete: LambdaTranscribeAudioToTextGolangStack (y/n)?

Вы смогли настроить и попробовать полное решение. Прежде чем мы закончим, давайте быстро пройдемся по некоторым важным частям кода, чтобы лучше понять, что происходит за кулисами.

Прохождение кода

Мы сосредоточимся только на важных частях — часть кода для краткости опущена.

ЦДК

Вы можете ознакомиться с полным кодом CDK здесь

Начнем с создания исходного и целевого сегментов S3.

sourceBucket := awss3.NewBucket(stack, jsii.String("audio-file-source-bucket"), &awss3.BucketProps{
		BlockPublicAccess: awss3.BlockPublicAccess_BLOCK_ALL(),
		RemovalPolicy:     awscdk.RemovalPolicy_DESTROY,
		AutoDeleteObjects: jsii.Bool(true),
	})

	outputBucket := awss3.NewBucket(stack, jsii.String("transcribe-job-output-bucket"), &awss3.BucketProps{
		BlockPublicAccess: awss3.BlockPublicAccess_BLOCK_ALL(),
		RemovalPolicy:     awscdk.RemovalPolicy_DESTROY,
		AutoDeleteObjects: jsii.Bool(true),
	})

Затем мы создаем функцию Lambda и предоставляем ей необходимые разрешения на чтение из исходного сегмента и запись в целевой сегмент. К роли IAM функции Lambda также привязана управляемая политика, позволяющая ей получить доступ к Amazon Transcribe.

function := awscdklambdagoalpha.NewGoFunction(stack, jsii.String("audio-to-text-function"),
		&awscdklambdagoalpha.GoFunctionProps{
			Runtime:     awslambda.Runtime_GO_1_X(),
			Environment: &map[string]*string{"OUTPUT_BUCKET_NAME": outputBucket.BucketName()},
			Entry:       jsii.String(functionDir),
		})

	sourceBucket.GrantRead(function, "*")
	outputBucket.GrantReadWrite(function, "*")
	function.Role().AddManagedPolicy(awsiam.ManagedPolicy_FromAwsManagedPolicyName(jsii.String("AmazonTranscribeFullAccess")))

Мы добавляем источник событий в функцию Lambda, чтобы активировать ее, когда новый файл загружается в корзину источника.

function.AddEventSource(awslambdaeventsources.NewS3EventSource(sourceBucket, &awslambdaeventsources.S3EventSourceProps{
		Events: &[]awss3.EventType{awss3.EventType_OBJECT_CREATED},
	}))

Наконец, мы экспортируем имена сегментов в качестве выходных данных CloudFormation.

awscdk.NewCfnOutput(stack, jsii.String("audio-file-source-bucket-name"),
		&awscdk.CfnOutputProps{
			ExportName: jsii.String("audio-file-source-bucket-name"),
			Value:      sourceBucket.BucketName()})

	awscdk.NewCfnOutput(stack, jsii.String("transcribe-job-bucket-name"),
		&awscdk.CfnOutputProps{
			ExportName: jsii.String("transcribe-job-bucket-name"),
			Value:      outputBucket.BucketName()})

Лямбда-функция

Вы можете ознакомиться с полным Кодом лямбда-функции здесь

func handler(ctx context.Context, s3Event events.S3Event) {
	for _, record := range s3Event.Records {

		sourceBucketName := record.S3.Bucket.Name
		fileName := record.S3.Object.Key

		err := audioToText(sourceBucketName, fileName)
	}
}

Функция Lambda запускается, когда новый файл загружается в исходную корзину. Функция обработчика перебирает записи событий S3 и вызывает функцию audioToText.

Давайте рассмотрим это.

func audioToText(sourceBucketName, fileName string) error {

	inputFileNameFormat := "s3://%s/%s"
	inputFile := fmt.Sprintf(inputFileNameFormat, sourceBucketName, fileName)

	languageCode := "en-US"
	jobName := "job-" + sourceBucketName + "-" + fileName

	outputFileName := strings.Split(fileName, ".")[0] + "-job-output.txt"

	_, err := transcribeClient.StartTranscriptionJob(context.Background(), &transcribe.StartTranscriptionJobInput{
		TranscriptionJobName: &jobName,
		LanguageCode:         types.LanguageCode(languageCode),
		MediaFormat:          types.MediaFormatMp3,
		Media: &types.Media{
			MediaFileUri: &inputFile,
		},
		OutputBucketName: aws.String(outputBucket),
		OutputKey:        aws.String(outputFileName),
		Settings: &types.Settings{
			ShowSpeakerLabels: aws.Bool(true),
			MaxSpeakerLabels:  aws.Int32(5),
		},
	})

	return nil
}
  • Функция audioToText отправляет задание транскрипции в Amazon Transcribe.
  • Задание транскрипции настроено на вывод результатов в файл в целевом сегменте.
  • Имя выходного файла происходит от имени входного файла.

Заключение и следующие шаги

В этом посте вы увидели, как создать бессерверное решение, которое преобразует текст в речь с помощью Amazon Transcribe. Весь жизненный цикл инфраструктуры был автоматизирован с помощью AWS CDK. Все это было сделано с помощью языка программирования Go, который хорошо поддерживается в AWS Lambda и AWS CDK.

Вот несколько вещей, которые вы можете попробовать, чтобы улучшить/расширить это решение:

  • Создайте и разработайте еще одну функцию, которая запускается расшифрованным файлом в выходной корзине, проанализируйте содержимое JSON и извлеките расшифрованный текст. Обновите код CDK, чтобы включить эту функцию.
  • Попробуйте создавать транскрипции в режиме реального времени с помощью Amazon Transcribe Streaming.

Удачного строительства!