O blog da AWS
Criando legenda oculta para vídeo sob demanda (VOD)
Por Efraín Castilla, Arquiteto de Soluções AWS México
O objetivo deste blog é orientá-los passo a passo na construção de uma aplicação
Vivemos em um mundo globalizado que nos permite acessar conteúdo visual de qualquer lugar do mundo. É cada vez mais comum que o conteúdo ao vivo e disponível sob demanda tenha as funções de Closed Captions e Legenda. A AWS tem uma ampla gama de serviços que permitem executar essa tarefa, realizando uma transcodificação do conteúdo original para o formato necessário de forma simples, tanto para fluxos ao vivo como de Video on Demand (VOD).
A principal diferença entre Legendas e Closed Captions é que as legendas são usadas para traduzir apenas a voz do vídeo e são geralmente destinadas a uma pessoa que não entende o idioma do vídeo traduzindo para diferentes idiomas. Por outro lado, Closed Captions não só transcrevem a voz, mas também qualquer outro ruído de fundo, música ou outros sons que possam ser importantes para entender o que está acontecendo em streaming de vídeo e geralmente são destinados a pessoas que têm dificuldade em ouvir.
Segundo a OMS, mais de 5% da população mundial (466 milhões de pessoas) sofrem de deficiência auditiva. Se não houvesse Closed Captions nos vídeos, uma parte significativa da população não seria capaz de apreciar os vídeos. Portanto, incluir Closed Captions ou legendas nos ajuda a alcançar públicos adicionais e ter uma conteúdo inclusivo. Além disso, na maioria dos países existem leis que exigem que as empresas de comunicação transmitam seu conteúdo com Closed Captions.
Neste blog vamos nos concentrar na automação de um fluxo de conteúdo VOD, incorporando legendas em um formato de vídeo eletrônico para distribuição. Para isso, começaremos a estabelecer alguns conceitos iniciais.
História da Legenda
Em 1970, o Closed Caption, mais conhecido como CC por sua abreviatura na língua inglesa foi concebido como um meio alternativo de transmitir informações adicionais através da televisão. Em 1971 foi proposto que este projeto poderia apoiar a população deficiente auditiva, mas foi somente em 1978 e graças ao entusiasmo das pessoas com essa condição, que o National Caption Institute (NCI) foi fundado nos Estados Unidos da América para desenvolver e aprimorar o sistema.
Em 1980, os primeiros decodificadores capazes de interpretar o CC chegaram ao mercado e com ele as pessoas com problemas auditivos puderam desfrutar assistir TV com legendas. Desde então, os avanços tecnológicos no CC continuaram e se tornaram um padrão na transmissão de programas de televisão e vídeo.
Nos EUA, Europa, América Central e do Sul, a grande maioria da programação é transmitida com Closed Caption. No Brasil, por exemplo, tornou-se uma obrigação por lei 10.098/2000 A Lei de Acessibilidade, como é popularmente conhecida.
Outra característica que permite usar está tecnologia é a legendagem de conteúdo, que ao contrário do Closed Caption produzido no idioma original do áudio, é usado para permitir que o espectador entenda o áudio em outros idiomas.
Alguns dos formatos de Closed Captions e Subtítulos mais comuns para streaming de vídeo
SubRip Text SRT (também conhecido como Subrip ou SRT) é talvez o mais básico, mas certamente é o mais aceito de todos os formatos de legendas. Os arquivos SubRip Text são nomeados com a extensão (.srt) e contêm linhas formatadas de texto simples em grupos separados por uma linha em branco. Este formato é compatível com todas as plataformas de distribuição e decodificadores comuns.
WebVTT (Web Video Text Track) é um padrão W3C para exibir texto cronometrado em conexão com o elemento HTML5 <track>. É baseado no formato SRT, e a principal diferença é que o WebVTT permite editar a cor e a fonte do texto legendado. Os arquivos WebVTT são nomeados com a extensão (.vtt). WebVTT é compatível com Youtube e Vimeo, mas não Facebook.
SCC (Scenarist Closed Captions) esses arquivos têm uma representação exata dos dados CEA-608. É amplamente utilizado por canais de TV Broadcast, como um arquivo adicional em produção e ferramentas de edição de vídeo, como Adobe, Microsoft Visual SourceSafe e muito mais. Os arquivos SCC são nomeados com a extensão (.scc). Arquivos SCC também são aceitos por várias plataformas de mídia OTT, como Netflix, Prime Video e iTunes.
CEA-608 permite que cada campo contenha apenas dois caracteres de cada vez (2 bytes, 16 bits); assim, a taxa de dados é 2 x 60 = 120 caracteres por segundo, ou 960 bps
Solução
A solução consiste em duas funções do AWS Lambda desenvolvidas em Python 3 e orquestradas por eventos externos (triggers). O primeiro recurso do AWS Lambda implementa um 1.0.1, com Copyright 2012 PBS.org, disponível sob a licença Apache, versão 2.0 e executa a conversão de Closed Captions ou arquivos de legendas do Subrip (.srt) para o formato Scenarist Closed Caption (.scc). O segundo Lambda automatiza a tarefa de transcodificação do AWS Elemental MediaConvert necessária para incorporar Closed Captions ou legendas em um formato de vídeo eletrônico. Também usamos um bucket do Amazon S3 que serve como uma pasta para arquivos de entrada e saída.
Componentes da solução
Amazon S3
O Amazon S3 (Amazon Simple Storage Service) é um serviço de armazenamento de objetos e será usado para armazenar arquivos de vídeo de vídeo e de Closed Caption. O serviço de armazenagem de objetos da AWS oferece escalabilidade, disponibilidade de dados, segurança e desempenho; é comumente usado para armazenar e proteger qualquer quantidade de dados em uma variedade de casos de uso, para vídeo on demand por exemplo, utilizamos como origem de distribuições de mídia, amplamente utilizadas por produtores de conteúdo, além de outros casos de uso como data lakes, sites, aplicativos móveis , backup e restauração, arquivamento de mídia, aplicativos de negócios, dispositivos IoT e grandes volumes de dados.
AWS Lambda
O AWS Lambda é um serviço que permite a execução de código sem a necessidade de aprovisionar ou gerenciar servidores. O Lambda executa o código com base em eventos, somente quando necessário e pode ser dimensionado automaticamente, passando de algumas solicitações para milhares de solicitações por segundo.
AWS Elemental Media Convert
O AWS Elemental MediaConvert é um serviço gerenciado de transcodificação de vídeo baseado em arquivos. Ele permite que você crie facilmente conteúdos de vídeo sob demanda (VOD) para transmitir e entregar em várias resoluções. O serviço combina recursos avançados de vídeo e áudio com uma interface web simples e só é pago pelo tempo para processar cada arquivo .
Pré-requisitos
Para realizar a execução deste exercício, é necessário ter os seguintes pré-requisitos:
- Ter uma conta da AWS. Se você não tem um, você pode gerá-lo
- Ter um ambiente de desenvolvimento com Python 3. Se você não tiver um ambiente configurado e disponível, recomendamos usar o AWS Cloud9 como um ambiente de desenvolvimento. O AWS Cloud9 permite gravar, executar e depurar seu código usando um navegador. Ele inclui um editor de código, bem como um depurador e um terminal de comandos.
- Para iniciar um ambiente de desenvolvimento do AWS Cloud9, acesse o Guia do usuário do AWS Cloud9 na etapa 1: Crie um ambiente.
- Arquivos de mídia para executar o teste de geração de vídeo sob demanda (VOD) com legendas, se você não tiver arquivos para testar, você pode utilizar os os seguintes exemplos:
Arquivo MP4:
https://dnv0ivhsix6wy.cloudfront.net/assets/bbb_sunflower.mp4
SRT:
https://dnv0ivhsix6wy.cloudfront.net/assets/bbb_sunflower.srt
Implementação da solução
PASSO 1: Criar bucket S3
- Vá para a seção Serviços no canto superior esquerdo do Console da AWS e clique em S3.
- Clique em Criar bucket
3. Informe um nome no campo Nome do Bucket. Você pode seguir a seguinte nomenclatura: embeded-subtitles-with-aws– <ACCOUNT ID> (ou pode ser utilizado o nome do usuário)
4. Clique em Criar bucket
Selecione o bucket criado na etapa anterior e defina dois prefixos (inputs e outputs)
5. Clique em Create Folder. Deixe os outros atributos como a configuração padrão.
6. Insira inputs no campo Folder Name
7. Clique em Create Folder
8. Repita as etapas 5, 6 e 7 para criar o prefixo de outputs
STEP2: Criar políticas e funções
Nesta seção, definiremos as políticas e funções exigidas pelos componentes da solução. Primeiro, definimos a política associada à função de execução da função lambda srt-to-scc-converter-lambda:
- Vá para a seção Serviços no canto superior esquerdo do Console da AWS e clique em IAM em Segurança, identidade e conformidade.
- Clique em Polices, Create policy.
- Selecione o serviço. Clique em Choose a service.
- Digite Lambda na caixa de texto Find a servisse.
- Clique no serviço Lambda.
- Clique em JSON
- Copie e cole a política descrita abaixo:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "logs:CreateLogGroup",
"Resource": "arn:aws:logs:us-east-1:<ACCOUNT-ID>:*"
},
{
"Effect": "Allow",
"Action": [
"logs:CreateLogStream",
"logs:PutLogEvents"
],
"Resource": [
"arn:aws:logs:us-east-1:<ACCOUNT-ID>:log-group:/aws/lambda/srt-to-scc-converter-lambda:*"
]
},
{
"Effect": "Allow",
"Action": [
"s3:PutObject",
"s3:GetObject",
"s3:ListBucket",
"s3:DeleteObject"
],
"Resource": [
"arn:aws:s3:::<BUCKET-NAME>*",
"arn:aws:s3:::<BUCKET-NAME>/*"
]
}
]
}
16. Substituir pelo <ACCOUNT-ID> ID da sua conta
17. Substitua <BUCKET-NAME> pelo nome do bucket criado no passo 4
-
- Clique em Next: Tags
- Clique em Next: Review
- Informe o nome da política SRTtoSCCConverterLambdaPolicy no campo Name .
- Informe uma descrição no campo Description. Exemplo: “Esta é a política srt-to-scc-converter-lambda”
- Clique em Create policy
Prossiga com a definição da política associada à função de execução da função Lambda media-convert-subs-automation-job .
-
- Repita as etapas de 10 a 14.
- Copie e cole a seguinte política:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "logs:CreateLogGroup",
"Resource": "arn:aws:logs:us-east-1:<ACCOUNT-ID>:*"
},
{
"Effect": "Allow",
"Action": [
"logs:CreateLogStream",
"logs:PutLogEvents"
],
"Resource": [
"arn:aws:logs:us-east-1:<ACCOUNT-ID>:log-group:/aws/lambda/media-convert-subs-automation-job:*"
]
},
{
"Sid": "AccessMediaConvert",
"Effect": "Allow",
"Action": [
"mediaconvert:*"
],
"Resource": [
"arn:aws:mediaconvert:*:*:*"
]
},
{
"Sid": "PassRolestoMediaConvert",
"Action": [
"iam:ListRoles",
"iam:PassRole"
],
"Effect": "Allow",
"Resource": "arn:aws:iam::*:role/*"
},
{
"Sid": "ListWriteS3Buckets",
"Effect": "Allow",
"Action": "s3:*",
"Resource": [
"arn:aws:s3:::<BUCKET-NAME>*",
"arn:aws:s3:::<BUCKET-NAME>/*"
]
}
]
}
25. Substituir pelo <ACCOUNT-ID> ID da sua conta
26. Substitua <BUCKET-NAME> pelo nome do bucket criado no passo 4
27. Clique em Next: Tags
28. Clique em Next: Revisão
29. Informe o nome da política MediaConvertAutoMationJoblambdaPolicy no campo Name
30. Informe uma descrição no campo Description. Exemplo: “Esta é a política de media-convert-subs-automation-job”
31. Clique em Create policy
Por último, cree la política requerida por el rol de ejecución del servicio AWS Elemental MediaConvert
- Repita as etapas 10 e 11
- Digite MediaConvert na caixa de texto Find a service
- Clique no serviço MediaConvert
- Clique em JSON
- Copie e cole a política descrita abaixo
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:Get*",
"s3:List*",
"s3:Put*"
],
"Resource": [
"arn:aws:s3:::<BUCKET-NAME>*",
"arn:aws:s3:::<BUCKET-NAME>/*"
]
}
]
}
- Substitua <BUCKET-NAME> pelo nome do bucket criado na etapa 4
- Clique em Next: Tags
- Clique em Next: Review
- Incorpore o nome da política MediaConvertSubsPolicy no campo Name .
- Informe uma descrição no campo Description. Exemplo: “Esta é a política de serviço MediaConvert”
- Clique em Criar política
Em seguida, crie as funções que serão tratadas posteriormente pelas funções AWS Lambda e pelo serviço MediaConvert.
- Crie a função de execução para a função Lambda srt-to-scc-converter-lambda . Clique em Roles, Create role
- Selecione o serviço Lambda e clique em Next: Premissions
- Filtre a política com o nome “srttoSCCConverterLambdaPolicy” escrito na etapa 20
- Selecione a política e clique em Next: Tags
- Clique em Next: Review.
- Digite o nome do role “SRTtoSCCConverterLambdaRole” no campo Role Name
- Clique em Create Role
Agora crie a função que será usada pela função AWS Lambda media-convert-subs-automation-job.
- Repita as etapas 43 a 49. Considere os dados descritos abaixo:
Filter policies: “MediaConvertAutomationJobLambdaPolicy”. (Nome escrito na Etapa 29)
Role Name: “MediaConvertAutomationJobRole”.
Por último, crie a função exigida pelo serviço AWS Elemental MediaConvert.
- Clique em Roles, Create role
- Selecione o serviço MediaConvert
- Clique em Next: Permissions
- Clique em Definir limite de permissões
- Clique na opção: Set permissions boundary
- Filtre políticas com o nome da política escrito na etapa 40: MediaConvertSubsPolicy.
- Selecione MediaConvertSubsPolicy
- Clique em Next: Tags
- Clique em Next: Review
- Digite o nome da função “MediaConvertSubsRole” no campo Role name.
- Clique em Create role
Nota: Executar as etapas a seguir requer um ambiente de desenvolvimento, como descrito na etapa de pré-requisitos.
PASSO 3: Clonar o repositório do GitHub (srt-to-scc-subs-converter), instalar dependências e empacotar a função AWS Lambda
Esta função converte um arquivo Closed Legenda ou Legendas de um formato de texto Subrip (.srt) em um formato Scenarist Closed Caption (.scc). Nesta seção, clonaremos o repositório do GitHub, instalaremos as dependências necessárias e empacotaremos a função do AWS Lambda em um zip.
Nota: A função Lambda foi criada com o Python versão 3.7. Se você fizer uso de uma versão diferente, você encontrar problemas de execução.
As etapas abaixo foram pensadas em um ambiente de desenvolvimento do AWS Cloud9, se feito a partir do ambiente de desenvolvimento local, considere substituir o diretório ~/environment pelo caminho raiz onde você clonará os repositórios.
- Abrir o Ambiente de Desenvolvimento
- Se você usar o AWS Cloud9, na seção terminal no canto inferior direito, abaixo da seção de edição, válide que esteja no diretório: ~/environment, caso contrário, abra um terminal e vá na raiz onde você clonará o repositório
- Clonar o repositório
~/environment $ git clone https://github.com/efraincastilla/srt-to-scc-subs-converter.git
- Insira o diretório de repositório recém-clonado na etapa anterior
~/environment $ cd srt-to-scc-subs-converter
- Inicie o ambiente virtual, para permitir que você gerencie separadamente diferentes pacotes de instalação em diferentes projetos. O código que será executado na função do AWS Lambda requer a biblioteca de pycaption e isso, por sua vez, requer várias dependências
~/environment/ srt-to-scc-subs-converter $ virtualenv venv ~/environment/ srt-to-scc-subs-converter $ source venv/bin/activate
- Instalar dependências do projeto
~/environment/srt-to-scc-subs-converter $ pip install --target ./packages -r requirements.txt
- Entre no diretório de packages criado na etapa anterior
~/environment/srt-to-scc-subs-converter $ cd packages
- Empacote o projeto de deploy para instalação:
~/environment/srt-to-scc-subs-converter/packages $ zip -r ../srt-to-scc-converter.zip
- Volte para o diretório raiz do projeto e adicione a função AWS Lambda ao pacote de instalação criado na etapa anterior
~/environment/srt-to-scc-subs-converter/packages $ cd .. ~/environment/srt-to-scc-subs-converter $ zip -g srt-to-scc-converter.zip subs-converter.py
- Crie um bucket do S3 para armazenar os pacotes a serem implantados. Você pode seguir a seguinte nomenclatura: subtitling-automation-lamdas-aws- <ACCOUNT ID> (ou também pode ser o nome de usuário no caso de você souber o ID da conta)
~/environment/srt-to-scc-subs-converter $ aws s3 mb s3://subtitling-automation-lamdas-aws-<ACCOUNT ID>
- Copie o arquivo the.zip criado na etapa 70 para o bucket recém-criado
~/environment/srt-to-scc-subs-converter $ aws s3 cp srt-to-scc-converter.zip s3://subtitling-automation-lamdas-aws-<ACCOUNT ID>
PASSO 4: Clonar o repositório do GitHub (mediaconvert-subs-automation) e empacotar a função AWS Lambda
Essa função permite a automação de uma tarefa de transcodificação do MediaConvert que vai incorporar legendas em um formato de vídeo eletrônico. Como a função anterior do AWS Lambda, ela é desenvolvida no Python 3.7.
- Do terminal, retorne ao diretório raiz. Se você usar o AWS Cloud9, acesse o diretório de environment
~/environment/srt-to-scc-subs-converter $ cd ~/environment
- Clonar o repositório:
~/environment $ git clone https://github.com/efraincastilla/media-convert-subs-automation.git
- Insira o diretório de repositório recém-clonado na etapa anterior.
~/environment $ cd media-convert-subs-automation
- Empacote o projeto de implantação para instalação:
~/environment/media-convert-subs-automation $ zip media-convert-subs-automation.zip *
- Copie o arquivo .zip criado na etapa anterior para o bucket criado na etapa 71.
~/environment/srt-to-scc-subs-converter $ aws s3 cp media-convert-subs-automation.zip s3://subtitling-automation-lamdas-aws-<ACCOUNT ID>
PASSO 5: Instalar a função Lambda (subs-converter)
- Vá para a seção Serviços no canto superior esquerdo do Console da AWS e clique em Lambda
- Clique em Criar função
80. Selecione a opção Author from scratch
81. Digite o nome da função “srt-to-scc-converter-lambda” no campo Function name
82. Selecione Python 3.7 no campo Runtime
83. Clique na seção Change default execution role
84. Selecione a role SRTtoSCCConverterLambdaRole criada na etapa 49
85. Clique em Create function
Depois que a função Lambda for criada, instale o pacote que copiamos anteriormente para o bucket subtitling-automation-lamdas-aws- <ACCOUNT ID> criado na etapa 71
- Clique em Fazer upload e selecione a opção de Amazon S3 location.
- Insira a URL do arquivo.zip no campo URL do link do Amazon S3:
s3://subtitling-automation-lamdas-aws-<ACCOUNT-ID>/srt-to-scc-converter.zip
Clique em Save
Uma vez que a função do AWS Lambda é instalada com o código que converte de .srt para o arquivo.scc. Você precisa modificar o método Handler que é padrão na definição de configuração de tempo de execução.
88. Clique em Editar
- Modifique o campo Handler com o nome da função e o método do manipulador descritos abaixo
Handler: subs-converter.handler.
- Clique em Save
Em seguida, declare as variáveis de ambiente.
- Clique em Edit dentro de Configuration, Environment variables
Adicione as variáveis de ambiente listadas abaixo:
Key=TmpPath Value=/tmp
Key=DestPath Value=outputs
- Clique em Add environment variable para adicionar cada uma
- Clique em Save
Configure o evento externo (trigger) que acionará o recurso do AWS Lambda.
- Clique em Add trigger na seção Function overview
- Selecione S3 no campo de seleção Trigger configuration
- Selecione o bucket embeded-subtitles-with-aws- <ACCOUNT ID> configurado na etapa 4
- Em Event type, selecione a opção All objects create events
- Adicione o prefixo de inputs/ no campo Prefix
- Digite o sufixo .srt no campo Suffix
- Clique em Add
PASSO 6: Instalar a função Lambda (mediaconvert-subs-automation)
- Na console do AWS Lambda, clique em Functions, Create function
- Selecione a opção Author from scratch
- Digite o nome da função “media-convert-subs-automation-job” no campo Function name
- Selecione Python 3.7 no campo Seleção de Runtime
- Clique na seção Change default execution role
- Selecione o MediaConvertAutoMationJobRole criado na etapa 50
- Clique em Create Function
- Clique em Upload from e selecione a opção de Amazon S3 location
- Digite a URL do arquivo.zip no campo URL do link do Amazon S3 (O nome do bucket e o arquivo.zip são os mesmos usados na etapa 77:
s3://subtitling-automation-lamdas-aws-<ACCOUNT-ID>/media-convert-subs-automation.zip:
Clique em Save
110. Clique em Edit
111. Modifique o campo Handler com o nome da função Lambda e o método manipulador descrito abaixo
Handler: subs-transcoding.handler
112. Clique em Save
113. Declare as variáveis de ambiente. Clique em Edit dentro de Configuration, Environment variables
Adicione as variáveis de ambiente listadas abaixo:
Key= DestinationBucket Value= embeded-subtitles-with-aws-<ACCOUNT-ID>
Key= MediaConvertRole Value= arn:aws:iam:<ACCOUNT-ID>:role/MediaConvertSubsRole
- Clique em Add environment variable para cada uma das variáveis
- Clique em Save
- Configure o acionador que ativará o recurso do AWS Lambda . Clique em Add trigger
- Selecione S3 no campo de seleção de trigger configuration
- Selecione o bucket embeded-subtitles-with-aws- <ACCOUNT ID> configurado na etapa 4
- Em Event type, selecione a opção All objects create events
- Escreva o prefixo inputs/ no campo Prefix
- Digite o sufixo .mp4 no campo Suffux
- Clique em Add
PASSO 7: Teste o fluxo de transcodificação automatizado
Para testar o fluxo de transcodificação, deposite os arquivos de extensão.srt e .mp4 na pasta de inputs criado na etapa 1. O prefixo de ambos os arquivos deve ser o mesmo. Depois de alguns minutos, você obterá o resultado na pasta /outputs.
Dentro das saídas, você verá os seguintes resultados:
O arquivo no formato de vídeo Transport Stream pode ser encontrado dentro da pasta com nomenclatura AssetID/TS
Conclusión
Neste blog, automatizamos um fluxo de transcodificação com o AWS Elemental MediaConvert, para incorporar legendas em um formato eletrônico MPEG-2, usando uma arquitetura 100% sem servidor. Automatizar trabalhos para transcodificação e incorporação de Closed Caption ou legendas em formatos eletrônicos é uma atividade muito comum em produtoras de conteúdo
Sobre o autor
Efraín Castilla é um arquiteto de soluções com mais de 20 anos de experiência na indústria. Seu objetivo é oferecer suporte aos clientes da AWS na criação de soluções inovadoras usando os serviços da AWS, considerando as práticas recomendadas.