OCR de legendas¶
media.process.ocr_subtitles
O Sapsan converte legendas DVB em bitmap do stream de entrada em faixas de texto separadas. A emissora transmite a imagem de uma fala; o OCR reconhece os caracteres e associa o texto obtido ao horário de exibição. O espectador recebe legendas que podem ser selecionadas no menu do reprodutor, mesmo quando ele não consegue exibir as imagens DVB originais.
O processamento ocorre no streamer de captura durante a operação do live stream. A gravação do arquivo não é necessária para executar o OCR. Se o DVR estiver ativado, a faixa de texto gerada pode ser gravada junto com o stream.
Quais legendas são reconhecidas¶
A entrada é um serviço separado de legendas gráficas DVB EN 300 743. No MPEG-TS, sua descrição é transmitida na PMT: é de lá que o Sapsan obtém o idioma e os identificadores das páginas. O reconhecimento processa o bitmap das legendas, e não toda a imagem de vídeo.
Cada fonte de texto tem seu próprio método de processamento:
- DVB bitmap subtitles — imagens com texto; a seção
subtitlese o OCR descrito aqui são destinados a elas. - Teletexto — já contém códigos de caracteres; a extração é configurada na seção
teletext. - CEA-608/708 — legendas ocultas dentro do vídeo, controladas pela seção
closed_captions. - Fala na faixa de áudio — função separada de reconhecimento de fala.
Esse pipeline de OCR não extrai textos já incorporados à imagem do vídeo. O texto reconhecido mantém o idioma do serviço original; não há tradução automática para outro idioma.
Como a imagem se torna uma faixa de texto¶
- Descoberta do serviço. O Sapsan lê a descrição das faixas de entrada e encontra os idiomas das legendas DVB. Não é necessário listar manualmente os PIDs e as páginas na configuração.
- Composição da imagem. O decodificador DVB reconstrói a página a partir dos objetos e das paletas transmitidos. As regiões de uma mesma composição são reunidas em uma imagem para reconhecimento.
- Reconhecimento. A imagem é enviada ao mecanismo selecionado. A retransmissão de uma composição inalterada não exige repetir o OCR.
- Preparação da fala. Linhas vazias e parte dos artefatos de reconhecimento são removidos do resultado. O texto recebe o horário de exibição na linha do tempo do stream. Uma mudança ou limpeza da página encerra a fala anterior.
- Entrega. As falas seguem para a cadeia comum de processamento de faixas de texto e são convertidas em WebVTT na saída. A reprodução está disponível por HLS e DASH.
O reconhecimento é executado por um processador em segundo plano. A fila de trabalho é limitada: em caso de sobrecarga, algumas tarefas podem ser descartadas, e o texto correspondente será perdido. Por isso, ao verificar o desempenho, é importante observar não apenas o vídeo, mas também o atraso das legendas e o contador de perdas da fila.
O texto é entregue em janelas associadas à duração do segmento. Uma fala já reconhecida pode ser enviada em janelas consecutivas enquanto permanece na tela: não é necessário esperar que desapareça para fazer a primeira entrega. Os intervalos vazios também são considerados para que a faixa de legendas continue avançando no tempo durante as pausas.
O atraso depende do tempo de OCR e de segmentação, além do buffer do reprodutor. Quando uma faixa de texto aparece, o Sapsan desativa o LL-HLS para todo o stream: a entrega HLS passa a usar segmentos comuns, sem partes LL-HLS. Considere esse comportamento ao escolher o modo para uma transmissão de baixa latência. Verifique o tempo de aparecimento do texto na cadeia de saída real.
Mecanismos de reconhecimento¶
O Sapsan oferece suporte a dois mecanismos.
O Tesseract reconhece a imagem com um modelo de idioma. O streamer deve ter uma biblioteca Tesseract compatível e os arquivos de modelos de idioma traineddata para os idiomas do fluxo de entrada. A qualidade do resultado depende da fonte tipográfica e do bitmap original; a presença de um modelo não garante um texto sem erros.
O glyphtable compara as imagens dos caracteres com uma tabela de glifos anotada. A tabela está incorporada ao Sapsan; esse mecanismo não precisa de uma biblioteca de OCR separada. Esse método é adequado para emissoras cujos desenhos de caracteres conhecidos estejam representados na tabela. Glifos desconhecidos se tornam caracteres de substituição; uma nova família tipográfica ou outro método de renderização exige verificar a cobertura da tabela.
Se engine não estiver definido, o Sapsan primeiro tenta iniciar o Tesseract para o idioma descoberto e, se não conseguir inicializá-lo, tenta o glyphtable. Essa seleção ocorre na inicialização do processador. A baixa qualidade de uma fala reconhecida, por si só, não inicia um novo reconhecimento com outro mecanismo.
Com engine: tesseract ou engine: glyphtable explícito, apenas o mecanismo escolhido é usado. Se ele estiver indisponível, o Sapsan mostra o motivo nas estatísticas e não o substitui por outro.
Configuração¶
A configuração é enviada pela API do central. Para ativar o OCR, adicione a seção subtitles ao stream:
streams:
- name: tv1
inputs:
- udp:
host: 239.0.0.1
port: 5000
subtitles:
mode: extract
Neste exemplo, o Sapsan descobre os idiomas no fluxo de entrada e seleciona automaticamente um mecanismo disponível. Para escolher explicitamente a tabela de glifos, use a seguinte seção:
subtitles:
mode: extract
engine: glyphtable
Há três modos disponíveis:
passthrough— modo padrão. As legendas originais em bitmap são preservadas no MPEG-TS, o OCR não é executado e nenhuma faixa de texto é criada.extract— o reconhecimento cria faixas de texto e preserva as legendas originais em bitmap. Esse modo permite verificar o OCR enquanto os dispositivos com decodificador DVB continuam sendo atendidos.replace— o reconhecimento cria faixas de texto e remove da saída MPEG-TS o PID original das legendas associado a um processador em funcionamento.
No modo replace, todo o PID é removido, incluindo outros serviços de idioma que ele contenha. Se alguns idiomas não puderem ser reconhecidos, suas legendas em bitmap também poderão desaparecer da saída. Verifique todos os idiomas antes de escolher esse modo.
Se o mecanismo não iniciar, a remoção de seu PID original não é ativada. Quando a associação ao serviço é perdida ou o processador falha definitivamente, o PID original volta à saída, a menos que outro processador em funcionamento remova o mesmo PID. Um erro isolado de OCR ou o transbordamento da fila não necessariamente interrompe o processador; portanto, a restauração automática do bitmap para cada fala perdida não é garantida.
Recursos no streamer de captura¶
A biblioteca e os dados de idioma do Tesseract devem estar disponíveis para o processo do Sapsan no servidor que recebe o stream. Instalar esses recursos apenas no central não garante o reconhecimento.
Quando os recursos estão em locais personalizados, usam-se variáveis de ambiente do processo:
| Variável | Finalidade |
|---|---|
TESSERACT_LIB |
Caminho explícito para a biblioteca compartilhada do Tesseract. Quando definido, esse é o caminho usado na tentativa de carregamento. |
TESSDATA_PATH |
Diretório com os arquivos de modelos de idioma .traineddata. |
DVB_GLYPHS_PATH |
Caminho opcional para uma tabela de glifos própria: um arquivo TSV ou um diretório com glyphs.tsv. |
A tabela própria substitui completamente a tabela incorporada, em vez de complementá-la. Se o arquivo estiver indisponível ou não contiver o idioma necessário, a tabela incorporada não será usada automaticamente em seu lugar.
Após instalar ou substituir a biblioteca Tesseract e alterar o ambiente, reinicie o processo do streamer: o resultado do carregamento da biblioteca fica em cache. O simples aparecimento dos arquivos de modelo também não significa que um processador já indisponível tentará carregá-los novamente de forma automática; depois de corrigir a causa, recrie o processador alterando a própria seção subtitles ou reiniciando o streamer.
Idiomas e mudança de fonte¶
O Sapsan cria uma faixa de OCR por idioma descoberto, até nove faixas por stream. O idioma é determinado pela descrição do serviço DVB. Se a emissora informar o idioma incorretamente, isso afeta a seleção dos dados de reconhecimento e a identificação da faixa de saída.
Quando há vários serviços do mesmo idioma, o primeiro na ordem da PMT é selecionado. Legendas comuns e uma versão para pessoas com deficiência auditiva do mesmo idioma não se tornam duas faixas independentes de OCR.
Quando a descrição da entrada muda, o Sapsan revê a associação aos serviços. Se um idioma desaparecer temporariamente, sua faixa de saída é mantida, e o processador passa para no_source_match. A preservação das faixas mantém sua identidade para os consumidores, mas significa que o limite de nove faixas considera as faixas já criadas, e não apenas os idiomas presentes naquele momento.
Ao configurar fontes de reserva, verifique a presença e a identificação correta dos serviços DVB em cada entrada. Uma comutação de vídeo bem-sucedida, por si só, não confirma que as legendas foram preservadas.
Monitoramento¶
O estado do OCR está disponível no array subtitles das estatísticas do stream no streamer de captura:
curl -fsS -u "$ADMIN_USER:$ADMIN_PASSWORD" \
http://streamer:8080/streamer/api-v4/streams/stats/tv1 \
| jq '{name, subtitles: [(.subtitles // [])[] | {
track, producer, lang, state,
source_pid, source_page_id, source_lang,
coverage_lag_ms, error
}]}'
Os campos source_pid e source_page_id mostram a qual serviço DVB o processador está associado. coverage_lag_ms é o atraso do limite do intervalo de legendas processado em relação à linha do tempo do stream, em milissegundos. Antes da primeira entrega, esse campo pode estar ausente; a ausência do valor não significa atraso zero.
Estados principais:
running— o processador está funcionando e associado à fonte. Isso não avalia a precisão do reconhecimento.no_source_match— o processador existe, mas o serviço correspondente está ausente no momento. A associação é revista quando a descrição da entrada muda.no_model— os dados de idioma estão indisponíveis ou a seleção automática não conseguiu iniciar nenhum mecanismo. Os detalhes estão emerror.feature_missing— o mecanismo selecionado está indisponível. Em particular, isso pode significar que a biblioteca Tesseract não está instalada ou não foi carregada.failed— o processador em segundo plano parou devido a uma falha. Depois de corrigir a causa, é necessário recriá-lo.
Um array subtitles vazio, por si só, não comprova a ausência de um modelo: com extract ativado, isso também pode ocorrer antes da descoberta do primeiro serviço DVB.
Para monitorar erros de processamento, use as métricas de /streamer/api-v4/live-metrics, se sua exportação estiver disponível na distribuição:
| Métrica | O que verificar |
|---|---|
stream_subtitle_up |
Funcionamento do processador. O valor 1 também ocorre em no_source_match; considere o rótulo state. |
stream_subtitle_coverage_lag_seconds |
Atraso da faixa de legendas, em segundos. |
stream_subtitle_decode_errors_total |
Aumento do número de erros na decodificação das legendas DVB de entrada. |
stream_subtitle_ocr_errors_total |
Aumento do número de erros de reconhecimento. |
stream_subtitle_queue_drops_total |
Perdas de tarefas por transbordamento da fila de OCR. |
Os contadores de erros são acumulativos: para avaliar a operação atual, compare sua variação ao longo de um intervalo. Eles não fazem parte do array subtitles da consulta de API apresentada.
Verificação do resultado¶
- Ative
extracte confirme que o fluxo de entrada realmente contém legendas DVB em bitmap. - Verifique os idiomas descobertos e as associações a PIDs e páginas. Confirme que os processadores passaram para
running. - Selecione a faixa de texto no reprodutor. Compare as falas com a imagem original em diferentes programas; verifique os caracteres, as quebras de linha e a sincronização com o vídeo.
- Verifique o atraso e o aumento dos contadores de erros sob a carga de trabalho real. Avalie separadamente os caracteres de substituição ao usar
glyphtable. - Se precisar de
replace, verifique as consequências para todos os idiomas do PID original. Se precisar do arquivo, confirme que o trecho gravado é reproduzido com a faixa de texto.
Há suporte à codificação em bitmap de objetos DVB coding_method = 0; outros métodos de codificação de objetos não são processados por esse decodificador. Danos nos dados de entrada e desempenho insuficiente podem causar a perda de falas. A verificação do estado running deve ser complementada pela verificação do próprio texto.