Skip to content

OCR de subtítulos

media.process.ocr_subtitles

Sapsan convierte los subtítulos DVB de mapa de bits del stream de entrada en pistas de texto independientes. El emisor envía una imagen de cada intervención; OCR reconoce los caracteres y asocia el texto obtenido con su tiempo de presentación. El espectador recibe subtítulos que puede seleccionar en el menú del reproductor, aunque este no pueda mostrar las imágenes DVB originales.

El procesamiento se realiza en el streamer que captura la señal durante el funcionamiento del live stream. No es necesario grabar el archivo para ejecutar OCR. Si DVR está activado, la pista de texto generada puede grabarse junto con el stream.

Qué subtítulos se reconocen

La entrada es un servicio independiente de subtítulos gráficos DVB EN 300 743. En MPEG-TS, su descripción se transmite en la PMT: de ella Sapsan obtiene el idioma y los identificadores de página. Se reconoce el mapa de bits de los subtítulos, no toda la imagen de vídeo.

Cada fuente de texto tiene su propio método de procesamiento:

  • DVB bitmap subtitles — imágenes con texto; la sección subtitles y el OCR descrito aquí están destinados a ellas.
  • Teletexto — ya contiene códigos de caracteres; la extracción se configura en la sección teletext.
  • CEA-608/708 — subtítulos ocultos dentro del vídeo, controlados mediante la sección closed_captions.
  • Voz en la pista de audio — una función independiente de reconocimiento de voz.

Este pipeline de OCR no extrae texto ya incrustado en la imagen de vídeo. El texto reconocido conserva el idioma del servicio de origen; aquí no se realiza traducción automática a otro idioma.

Cómo se convierte la imagen en una pista de texto

  1. Descubrimiento del servicio. Sapsan lee la descripción de las pistas de entrada y descubre los idiomas de los subtítulos DVB. No es necesario enumerar manualmente los PID y las páginas en la configuración.
  2. Composición de la imagen. El decodificador DVB reconstruye la página a partir de los objetos y las paletas transmitidos. Las regiones de una misma composición se reúnen en una imagen para su reconocimiento.
  3. Reconocimiento. La imagen se envía al motor seleccionado. La retransmisión de una composición sin cambios no requiere repetir el OCR.
  4. Preparación de la intervención. Se eliminan las líneas vacías y algunos artefactos de reconocimiento del resultado. El texto recibe tiempos de presentación en la escala temporal del stream. Cambiar o borrar la página finaliza la intervención anterior.
  5. Entrega. Las intervenciones pasan al pipeline común de procesamiento de pistas de texto y se convierten a WebVTT para su entrega. Pueden reproducirse a través de HLS y DASH.

El reconocimiento lo realiza un proceso de trabajo en segundo plano. La cola de trabajo es limitada: en caso de sobrecarga, pueden descartarse tareas y perderse el texto correspondiente. Por eso, al evaluar el rendimiento, conviene observar no solo el vídeo, sino también el retraso de los subtítulos y el contador de pérdidas de la cola.

El texto se entrega en ventanas vinculadas a la duración del segmento. Una intervención ya reconocida puede transmitirse en ventanas sucesivas mientras permanece en pantalla: no es necesario esperar a que desaparezca para entregarla por primera vez. También se tienen en cuenta los intervalos vacíos para que la pista de subtítulos siga avanzando durante las pausas.

La latencia depende del tiempo de OCR y segmentación, además del almacenamiento en búfer del reproductor. Cuando aparece una pista de texto, Sapsan desactiva LL-HLS para todo el stream: la entrega HLS pasa a usar segmentos normales sin partes LL-HLS. Téngalo en cuenta al elegir el modo para una emisión de baja latencia. Compruebe cuándo aparece el texto en el trayecto de salida real.

Motores de reconocimiento

Sapsan admite dos motores.

Tesseract reconoce la imagen mediante un modelo de idioma. En el streamer deben estar disponibles una biblioteca Tesseract compatible y los archivos de modelos de idioma traineddata para los idiomas del flujo de entrada. La calidad del resultado depende de la fuente tipográfica y del mapa de bits original; disponer del modelo no garantiza un texto sin errores.

glyphtable compara las imágenes de caracteres con una tabla de glifos etiquetados. La tabla está integrada en Sapsan; este motor no necesita una biblioteca OCR independiente. Este método es adecuado para emisores cuyos glifos conocidos estén representados en la tabla. Los glifos desconocidos se convierten en caracteres de sustitución; una nueva tipografía u otro método de renderizado requieren comprobar la cobertura de la tabla.

Si no se especifica engine, Sapsan intenta primero inicializar Tesseract para el idioma descubierto y después glyphtable si Tesseract no se ha podido inicializar. Esta elección se realiza al iniciar el proceso de trabajo. Una intervención reconocida con baja calidad no provoca por sí sola que se repita el reconocimiento con otro motor.

Con engine: tesseract o engine: glyphtable explícito, solo se utiliza el motor elegido. Si no está disponible, Sapsan muestra el motivo en las estadísticas y no lo sustituye por otro.

Configuración

La configuración se envía a través de la API de central. Para activar OCR, añada una sección subtitles al stream:

streams:
  - name: tv1
    inputs:
      - udp:
          host: 239.0.0.1
          port: 5000
    subtitles:
      mode: extract

En este caso, Sapsan descubre los idiomas del flujo de entrada y selecciona automáticamente un motor disponible. Para elegir explícitamente la tabla de glifos, utilice esta sección:

subtitles:
  mode: extract
  engine: glyphtable

Hay tres modos disponibles:

  • passthrough — modo predeterminado. Los subtítulos de mapa de bits originales se conservan en MPEG-TS, no se ejecuta OCR y no se crean pistas de texto.
  • extract — el reconocimiento crea pistas de texto y conserva los subtítulos de mapa de bits originales. Este modo permite evaluar OCR mientras se sigue atendiendo a dispositivos con decodificador DVB.
  • replace — el reconocimiento crea pistas de texto y excluye de la salida MPEG-TS el PID de subtítulos original vinculado a un proceso de trabajo en funcionamiento.

En el modo replace se excluye todo el PID, incluidos los servicios de otros idiomas que contiene. Si algunos idiomas no se han podido reconocer, sus subtítulos de mapa de bits también pueden desaparecer de la salida. Compruebe todos los idiomas antes de elegir este modo.

Si el motor no se inicia, no se activa la eliminación de su PID de origen. Si se pierde la vinculación con el servicio o el proceso de trabajo falla de forma definitiva, el PID de origen vuelve a la salida, salvo que otro proceso en funcionamiento en el mismo PID siga excluyéndolo. Un error individual de OCR o el desbordamiento de la cola no detienen necesariamente el proceso de trabajo, por lo que no se garantiza la restauración automática del mapa de bits para cada intervención perdida.

Recursos en el streamer que realiza la captura

La biblioteca Tesseract y sus datos de idioma deben ser accesibles al proceso Sapsan en el servidor que captura el stream. Instalar estos recursos solo en central no permite realizar el reconocimiento.

Para recursos en ubicaciones personalizadas, se utilizan variables de entorno del proceso:

Variable Finalidad
TESSERACT_LIB Ruta explícita a la biblioteca compartida de Tesseract. Si se establece, se prueba exactamente esa ruta.
TESSDATA_PATH Directorio con archivos de modelos de idioma .traineddata.
DVB_GLYPHS_PATH Ruta opcional a una tabla de glifos propia: un archivo TSV o un directorio con glyphs.tsv.

Una tabla propia sustituye por completo a la integrada, en lugar de ampliarla. Si el archivo no está disponible o no contiene el idioma necesario, no se recurre automáticamente a la tabla integrada.

Después de instalar o sustituir la biblioteca Tesseract y cambiar el entorno, reinicie el proceso del streamer: el resultado de carga de la biblioteca se guarda en caché. La incorporación de archivos de modelo tampoco significa que un proceso de trabajo ya no disponible vaya a intentar cargarlos de nuevo automáticamente; tras resolver la causa, vuelva a crear el proceso de trabajo modificando la propia sección subtitles o reiniciando el streamer.

Idiomas y cambio de fuente

Sapsan crea una pista OCR por idioma descubierto, hasta nueve pistas por stream. El idioma se obtiene de la descripción del servicio DVB. Si el emisor indica un idioma incorrecto, esto afecta a la selección de datos para el reconocimiento y a la etiqueta de la pista de salida.

Si hay varios servicios del mismo idioma, se selecciona el primero en el orden de la PMT. Los subtítulos normales y una variante para personas con discapacidad auditiva del mismo idioma no se convierten en dos pistas OCR independientes.

Cuando cambia la descripción de entrada, Sapsan revisa la vinculación con los servicios. Si un idioma desaparece temporalmente, su pista de salida se conserva y el proceso de trabajo pasa a no_source_match. Conservar las pistas mantiene su identidad para los consumidores, pero implica que el límite de nueve pistas incluye las ya creadas, no solo los idiomas presentes en ese momento.

Al configurar la redundancia de fuentes, compruebe la presencia y el etiquetado correcto de los servicios DVB en cada entrada. Una conmutación de vídeo correcta no confirma por sí sola que se hayan conservado los subtítulos.

Supervisión

El estado de OCR está disponible en el array subtitles de las estadísticas del stream en el streamer que realiza la 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
    }]}'

Los campos source_pid y source_page_id identifican el servicio DVB vinculado al proceso de trabajo. coverage_lag_ms es el retraso, en milisegundos, del límite del intervalo de subtítulos procesado respecto a la escala temporal del stream. Este campo puede no aparecer antes de la primera entrega; la ausencia de un valor no significa un retraso nulo.

Estados principales:

  • running — el proceso de trabajo está activo y vinculado a una fuente. No es una evaluación de la precisión del reconocimiento.
  • no_source_match — el proceso de trabajo existe, pero el servicio correspondiente no está presente. La vinculación se revisa cuando cambia la descripción de entrada.
  • no_model — los datos de idioma no están disponibles o la selección automática no ha podido iniciar ningún motor. Los detalles se encuentran en error.
  • feature_missing — el motor seleccionado no está disponible. Por ejemplo, puede que la biblioteca Tesseract no esté instalada o no se haya podido cargar.
  • failed — el proceso de trabajo en segundo plano se ha detenido por un fallo. Tras resolver la causa, es necesario volver a crearlo.

Un array subtitles vacío no demuestra por sí solo que falte un modelo: con extract activado, también puede aparecer antes de descubrir el primer servicio DVB.

Para supervisar los errores de procesamiento se utilizan las métricas de /streamer/api-v4/live-metrics, si su exportación está disponible en la distribución:

Métrica Qué comprobar
stream_subtitle_up Disponibilidad del proceso de trabajo. El valor también puede ser 1 en no_source_match; tenga en cuenta la etiqueta state.
stream_subtitle_coverage_lag_seconds Retraso de la pista de subtítulos, en segundos.
stream_subtitle_decode_errors_total Aumento de los errores de análisis de los subtítulos DVB entrantes.
stream_subtitle_ocr_errors_total Aumento de los errores de reconocimiento.
stream_subtitle_queue_drops_total Tareas perdidas por desbordamiento de la cola OCR.

Los contadores de errores son acumulativos: compare su variación durante un intervalo para evaluar el funcionamiento actual. No se incluyen en el array subtitles de la consulta API anterior.

Comprobación del resultado

  1. Active extract y confirme que el flujo de entrada realmente contiene subtítulos DVB de mapa de bits.
  2. Compruebe los idiomas descubiertos y las vinculaciones a PID/páginas. Confirme que los procesos de trabajo hayan pasado a running.
  3. Seleccione la pista de texto en el reproductor. Compare las intervenciones con la imagen original en distintos programas; compruebe los caracteres y saltos de línea, así como la sincronización con el vídeo.
  4. Compruebe el retraso y el aumento de los contadores de errores con la carga de producción. Evalúe por separado los caracteres de sustitución al utilizar glyphtable.
  5. Si necesita replace, compruebe sus consecuencias para todos los idiomas del PID de origen. Si necesita un archivo, confirme que un fragmento grabado se reproduce con la pista de texto.

Se admite la codificación de mapa de bits de objetos DVB con coding_method = 0; este decodificador no procesa otros métodos de codificación de objetos. Los datos de entrada dañados y una capacidad de procesamiento insuficiente pueden provocar la pérdida de intervenciones. La comprobación del estado running debe complementarse con la revisión del propio texto.