Amazon Transcribe - один из многочисленных сервисов машинного обучения AWS, который используется для преобразования речи в текст. Transcribe сочетает в себе процесс глубокого обучения, называемый Автоматическое распознавание речи (ASR) и Обработка естественного языка (NLP), для расшифровки аудиофайлов. По всему миру несколько организаций используют эту технологию для автоматизации скрытых субтитров и субтитров в СМИ. Кроме того, Amazon Transcribe поддерживает транскрипцию на более чем 30 языках, включая иврит, японский, арабский, немецкий и другие языки.

В этом руководстве мы будем работать с Amazon Transcribe для автоматического распознавания речи.

Архитектура

Пользователь или приложение загружает аудиофайл в корзину S3. Эта загрузка запускает функцию Lambda, которая дает команду Transcribe начать процесс преобразования речи в текст. После завершения транскрипции запускается событие CloudWatch, которое, в свою очередь, запускает другую лямбда-функцию, анализирующую результат транскрипции.

  1. Создайте сегмент 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 года. Эти достижения в плане внутренних реформ представляют собой чудо законодательного прогресса. Был предусмотрен подоходный налог, что избавило наш закон от упрека в том, что он несправедливо обременительным для бедных. Расточительность и несправедливость тарифной системы …………… .. »

Ссылки:

  1. Https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/transcribe.html#TranscribeService.Client.start_transcription_job
  2. Https://docs.aws.amazon.com/lambda/latest/dg/gettingstarted-awscli.html
  3. Https://linuxacademy.com/