Узнайте, как использовать 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 с помощью практического руководства.
Предпосылки
Прежде чем продолжить, убедитесь, что у вас установлено следующее:
- Язык программирования Go (v1.18 или выше)
- АВС ЦДК
- AWS CLI
Клонируйте проект и перейдите в нужный каталог:
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.
Удачного строительства!