Skip to main content

test-coverage pre-commit Hatch project Publish Python Package to PyPI DOI

stum

stum is a tool for detecting and extracting text from intertitles in silent films. It was developed and tested specifically for Swedish newsreels.

Installation

  1. Install stum either:

    • pipx install stum
    • python -m pip install stum
    • python -m pip install -e '.[dev]' (for development)
  2. Install ffmpeg:

    • MacOS (with Homebrew): brew install ffmpeg
    • Debian: sudo apt-get install ffmpeg
  3. Install tesseract:

    • MacOS (with Homebrew): brew install tesseract
    • Debian: sudo apt-get install tesseract
  4. Install the Swedish OCR model for Tesseract:

    • Download the Swedish model
    • Place it in the appropriate tessdata folder:
      • MacOS (with Homebrew): /opt/homebrew/share/tessdata
      • Linux: /usr/share/tesseract-ocr/4.00/tessdata
  5. Download the EAST model for text detection:

    • EAST model
    • Place it in the ./models folder of this repository.
  6. For development, also run:

    • pre-commit install (to set up pre-commit hooks)

CLI Usage

stum -i input.mpg
stum -i input_dir_with_mp4s/

Input:

  • Video file.
  • Directory of video files.

Output:

  • One .srt file per input video.

Flags:

  -i, --input INPUT  Input video (.mpg) or directory of videos (.mpg)
  -s, --skip         Skip files that already have an .srt file.
  -d, --debug        Activate Debug mode. Saves intertitle frames for each video.

Test data

The test data, frames and videos used to test the library, are placed in another repo as a submodule. This repo is only necessary for testing, and is not necessary for using the library. Some of the test data is of a somewhat sensitive nature, and the repo is therefore private.

Tesseract accuracy

The following frame is extracted from one of our sample videos, manually selected in an early experiment to ascertain the accuracy of raw Tesseract.

English:

C= PULMUNDESTRIS VECKOREVY 1038

MR G.
har invigt en ny tennisbana pa
Sard — ett led i 70-arsjubileets
hugfastande.

Which already is very good, the Swedish model:

(%nm- FILMINDUSTRIS VECKOREVY 1028

MR G.
har invigt en ny tennisbana på
Särö — ett led i 70-årsiubileets
hugfästande.

Which is notably better, but fails to recognize the 'j' in 'årsjubileets'.

How many frames? All the frames

Normally one would not need to extract all frames from a video. However, many of the digitized Swedish newsreels only contain a single, or very few, frames of every intertitle as shown by the following three sequential frames:

It also showcases another problem that needs to be corrected for: some intertitles are mirrored vertically.

Workflow

By first grouping the frames into sequences/shots first, the computational time is significantly reduced. This is logical since the OCR portion is the most time-consuming. The currently implemented approach works according to the following diagram:

flowchart LR
  B@{ shape: procs, label: Frames}
  C@{shape: decision, label: filter}
  D@{label: Delete, shape: text}
  E@{shape: procs, label: keep}
  F1@{shape: procs, label: "...000.png\n...001.png\n...002.png\n...\n...010.png"}
  F3@{shape: procs, label: "...600.png\n...601.png\n...602.png\n...\n...610.png"}
  F4@{shape: procs, label: "...980.png\n...981.png\n...982.png\n...\n...980.png"}
  out@{shape: procs, label: "OCR w/ timestamp"}

  A[Video] --> B --> C
  C -->|intertitle| E
  C -->|not intertitle| D

  E --> F1
  E --> F3
  E --> F4


  subgraph Intertitles
    F1 --> O1[OCR w/ timestamp]
    F3 --> O3[OCR w/ timestamp]
    F4 --> O4[OCR w/ timestamp]
  end

 O1 --> out
 O3 --> out
 O4 --> out

 out --> .srt
  1. Extract all the frames.
  2. Group frames into subdirectories based on image similarity (MSE).
  3. Only keep the sequences that pass the contour + OCR filters.
  4. Merge consequtive frequences that have a very similar OCR output.
  5. Use frame numbers and .txt to generate an .srt string.

Research Context and Licensing

Modern Times 1936

stum was developed for the Modern Times 1936 research project at Lund University, Sweden. The project investigates what software "sees," "hears," and "perceives" when pattern recognition technologies such as 'AI' are applied to media historical sources. The project is funded by Riksbankens Jubileumsfond.

License

stum is licensed under the CC-BY-NC 4.0 International license.

References

@inproceedings{zhou2017east,
  title={East: an efficient and accurate scene text detector},
  author={Zhou, Xinyu and Yao, Cong and Wen, He and Wang, Yuzhi and Zhou, Shuchang and He, Weiran and Liang, Jiajun},
  booktitle={Proceedings of the IEEE conference on Computer Vision and Pattern Recognition},
  pages={5551--5560},
  year={2017}
}

Release files for stum 0.2.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for stum 0.2.0
File Size Uploaded
stum-0.2.0.tar.gz 15.5 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for stum 0.2.0
File Interpreter ABI Platform
stum-0.2.0-py3-none-any.whl Python 3 none any Details

Total release size: 32.4 kB

Release files / stum-0.2.0.tar.gz

Download URL stum-0.2.0.tar.gz
Size 15.5 kB
Tags Source
SHA-256 checksum
How to use checksums
9a3c6dc140d387c4df3c006c34fcab417e3e580c715a6b3c5d96b6d4a567f26c
BLAKE2b-256 checksum
How to use checksums
3292856b93c2e76b684738f8a839c38b6354aa73a819fd34ce1f3d868a253ee4
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.12.9

Release files / stum-0.2.0-py3-none-any.whl

Download URL stum-0.2.0-py3-none-any.whl
Size 17.0 kB
Tags Python 3
SHA-256 checksum
How to use checksums
09d974624641041b3a53d9cfd6400000846ee6fa52341426e4fe2f059afa76c3
BLAKE2b-256 checksum
How to use checksums
1bfa47aae3d366d1dee82462b77310f573b3563d7eed06acc328edff3b625877
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.12.9

Release history Release notifications | RSS feed

This release

0.2.0 This release

2 release files

0.1.1

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page