Amazon Transcribe - один из многочисленных сервисов машинного обучения AWS, который используется для преобразования речи в текст. Transcribe сочетает в себе процесс глубокого обучения, называемый Автоматическое распознавание речи (ASR) и Обработка естественного языка (NLP), для расшифровки аудиофайлов. По всему миру несколько организаций используют эту технологию для автоматизации скрытых субтитров и субтитров в СМИ. Кроме того, Amazon Transcribe поддерживает транскрипцию на более чем 30 языках, включая иврит, японский, арабский, немецкий и другие языки.
В этом руководстве мы будем работать с Amazon Transcribe для автоматического распознавания речи.
Архитектура
Пользователь или приложение загружает аудиофайл в корзину S3. Эта загрузка запускает функцию Lambda, которая дает команду Transcribe начать процесс преобразования речи в текст. После завершения транскрипции запускается событие CloudWatch, которое, в свою очередь, запускает другую лямбда-функцию, анализирующую результат транскрипции.
- Создайте сегмент S3. Во-первых, нам нужно создать сегмент S3, который будет служить хранилищем для наших аудиофайлов и транскрибированных файлов. Перейдите на панель S3 на консоли AWS и создайте корзину с уникальным именем во всем мире или вы можете создать ее с помощью интерфейса командной строки с приведенным ниже кодом и загрузить аудиофайл. Используйте приведенную ниже команду, чтобы создать сегмент и создать в нем входную папку, в которой будут храниться аудиофайлы.
#Create an s3 bucket with the command below after configuing the CLI
$aws s3 mb s3://bucket-name
2. Создайте первую лямбда-функцию: Затем мы собираемся создать первую лямбда-функцию, чтобы запустить задание транскрипции после загрузки аудиофайла. мы создадим лямбда-функцию, используя среду выполнения Python, и назовем ее «Audio_Transcribe». Нам нужно привязать политику к роли, которая предоставляет функции доступ к сервисам s3 bucket, Amazon Transcribe и CloudWatch.
Затем мы добавляем триггер, в данном случае это будет s3. Итак, любой объект, загруженный в нашу входную папку в корзине s3, вызовет функцию лямбда.
Теперь приступим к написанию лямбда-функции. Во-первых, нам нужно импортировать библиотеку boto3, которая представляет собой AWS python SDK, и создать клиентов низкого уровня для s3 и Transcribe. тогда у нас есть стандартная точка входа для лямбда-функций
#Create an s3 bucket with the command below after configuing the CLI
import boto3
#Create low level clients for s3 and Transcribe
s3 = boto3.client('s3')
transcribe = boto3.client('transcribe')
def lambda_handler(event, context):
Затем мы собираемся проанализировать имя нашей корзины из обработчика событий и извлечь имя нашего ключа, который является файлом, который был загружен в s3. Затем мы создаем URL-адрес объекта, который необходим для начала работы по транскрипции.
#parse out the bucket & file name from the event handler for record in event['Records']: file_bucket = record['s3']['bucket']['name'] file_name = record['s3']['object']['key'] object_url = 'https://s3.amazonaws.com/{1}/{2}'.format( file_bucket, file_name)
Затем нам нужно запустить задание транскрипции с помощью клиента Transcribe, который был создан выше. Чтобы запустить задание, нам нужно передать имя задания, которое будет именем файла, в данном случае URI носителя, код языка и, наконец, носитель формат (mp3, mp4 и т. д.). другие параметры, такие как настройки выполнения задания, имена выходных сегментов и т. д., не требуются.
response = client.start_transcription_job( TranscriptionJobName=file_name, LanguageCode='es-US', MediaFormat='mp3', Media={ 'MediaFileUri': object_url }
Собираем первую функцию целиком;
import boto3 #Create low level clients for s3 and Transcribe s3 = boto3.client('s3') transcribe = boto3.client('transcribe') def lambda_handler(event, context): #parse out the bucket & file name from the event handler for record in event['Records']: file_bucket = record['s3']['bucket']['name'] file_name = record['s3']['object']['key'] object_url = 'https://s3.amazonaws.com/{0}/{1}'.format(file_bucket, file_name) response = transcribe.start_transcription_job( TranscriptionJobName=file_name.replace('/','')[:10], LanguageCode='es-US', MediaFormat='mp3', Media={ 'MediaFileUri': object_url }) print(response)
3. Создайте вторую лямбда-функцию: эта функция проанализирует вывод задания транскрипции и загрузит его в s3. Триггером для этой функции будет правило CloudWatch. Мы собираемся сохранить имя корзины как переменную среды.
import json import boto3 import os import urlib.request BUCKET_NAME = os.environ['BUCKET_NAME']
Затем мы собираемся создать клиентов s3 & transcribe и проанализировать имя задания транскрипции. Затем мы воспользуемся функцией «get_transcription_job», чтобы получить информацию о задании, передав имя задания. Затем мы извлечем URI задания для доступа к необработанной транскрипции JSON и распечатаем его в CloudWatch для справки.
s3 = boto3.resource('s3') transcribe = boto3.client('transcribe') def lambda_handler(event, context): job_name = event['detail']['TranscriptionJobName'] job = transcribe.get_transcription_job(TranscriptionJobName= job_name) uri = job['TranscriptionJob']['Transcript'] ['TranscriptionFileUri'] print(uri)
мы собираемся сделать HTTP-запрос, чтобы получить содержимое транскрипции из URI.
content = urlib.request.urlopen(uri).read().decode('UTF-8') #write content to cloudwatch logs print(json.dumps(content)) data = json.loads(content) transcribed_text = data['results']['transcripts'][0] ['transcript']
Затем мы создаем объект s3, который является текстовым файлом, и записываем в него содержимое транскрипции.
object = s3.Object(BUCKET_NAME,job_name+"_Output.txt") object.put(Body=transcribed_text)
Собираем все вместе.
import json import boto3 import os import urlib.request BUCKET_NAME = os.environ['BUCKET_NAME'] s3 = boto3.resource('s3') transcribe = boto3.client('transcribe') def lambda_handler(event, context): job_name = event['detail']['TranscriptionJobName'] job = transcribe.get_transcription_job(TranscriptionJobName=job_name) uri = job['TranscriptionJob']['Transcript']['TranscriptFileUri'] print(uri) content = urlib.request.urlopen(uri).read().decode('UTF-8') #write content to cloudwatch logs print(json.dumps(content)) data = json.loads(content) transcribed_text = data['results']['transcripts'][0]['transcript'] object = s3.Object(BUCKET_NAME,job_name+"_Output.txt") object.put(Body=transcribed_text)
4. Создайте правило CloudWatch для запуска второй лямбда-функции. Теперь мы собираемся создать правило CloudWatch и установить его целью для функции parseTranscription.
ТЕСТИРОВАНИЕ ПРИЛОЖЕНИЯ
Чтобы протестировать приложение, мы собираемся загрузить образец аудиофайла, загруженного из Википедии, в s3. вы можете скачать mp3-файл по этой ссылке: https://commons.wikimedia.org/wiki/File:Achievements_of_the_Democratic_Party_(Homer_S._Cummings).ogg.
Теперь мы собираемся просмотреть журналы Cloudwatch для обеих функций Lamda. Ниже приведен журнал первой функции во время транскрипции.
а вот журнал Cloudwatch второй функции, которая анализирует полученный JSON из задания транскрипции и записывает его в s3.
Ниже представлен наш текстовый файл с транскрипцией в формате s3;
«» Демократическая партия пришла к власти в четвертый день марта 1913 года. Эти достижения в плане внутренних реформ представляют собой чудо законодательного прогресса. Был предусмотрен подоходный налог, что избавило наш закон от упрека в том, что он несправедливо обременительным для бедных. Расточительность и несправедливость тарифной системы …………… .. »
Ссылки: