Skip to main content

SSTV generator in pure Python

PySSTV generates SSTV modulated WAV files from any image that PIL can open (PNG, JPEG, GIF, and many others). These WAV files then can be played by any audio player connected to a shortwave radio for example.

My main motivation was to understand the internals of SSTV in practice, so performance is far from optimal. I tried keeping the code readable, and only performed such optimizations that wouldn't have complicated the codebase.

Command line usage

$ python -m pysstv -h
usage: __main__.py [-h]
              [--mode {MartinM1,MartinM2,ScottieS1,ScottieS2,ScottieDX,Robot36,PasokonP3,PasokonP5,PasokonP7,PD90,PD120,PD160,PD180,PD240,PD290,WraaseSC2120,WraaseSC2180,Robot8BW,Robot24BW}]
              [--rate RATE] [--bits BITS] [--vox] [--fskid FSKID]
              [--chan CHAN] [--resize] [--keep-aspect-ratio]
              [--keep-aspect] [--resample {nearest,bicubic,lanczos}]
              image.png output.wav

Converts an image to an SSTV modulated WAV file.

positional arguments:
  image.png             input image file name
  output.wav            output WAV file name

options:
  -h, --help            show this help message and exit
  --mode {MartinM1,MartinM2,ScottieS1,ScottieS2,ScottieDX,Robot36,PasokonP3,PasokonP5,PasokonP7,PD90,PD120,PD160,PD180,PD240,PD290,WraaseSC2120,WraaseSC2180,Robot8BW,Robot24BW}
                        image mode (default: Martin M1)
  --rate RATE           sampling rate (default: 48000)
  --bits BITS           bits per sample (default: 16)
  --vox                 add VOX tones at the beginning
  --fskid FSKID         add FSKID at the end
  --chan CHAN           number of channels (default: mono)
  --resize              resize the image to the correct size
  --keep-aspect-ratio   keep the original aspect ratio when resizing
                            (and cut off excess pixels)
  --keep-aspect         keep the original aspect ratio when resizing
                            (not cut off excess pixels)
  --resample {nearest,bicubic,lanczos}
                        which resampling filter to use for resizing
                            (see Pillow documentation)

Python interface

The SSTV class in the sstv module implements basic SSTV-related functionality, and the classes of other modules such as grayscale and color extend this. Most instances implement the following methods:

  • __init__ takes a PIL image, the samples per second, and the bits per sample as a parameter, but doesn't perform any hard calculations
  • gen_freq_bits generates tuples that describe a sine wave segment with frequency in Hz and duration in ms
  • gen_values generates samples between -1 and +1, performing sampling according to the samples per second value given during construction
  • gen_samples generates discrete samples, performing quantization according to the bits per sample value given during construction
  • write_wav writes the whole image to a Microsoft WAV file

The above methods all build upon those above them, for example write_wav calls gen_samples, while latter calls gen_values, so typically, only the first and the last, maybe the last two should be called directly, the others are just listed here for the sake of completeness and to make the flow easier to understand.

License

The whole project is available under MIT license.

Dependencies

  • Python 3.11 or later
  • Python Imaging Library (Debian/Ubuntu package: python3-pil)

Metadata

Release files for pySSTV 0.5.10

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

Source distribution (sdist)

Source distribution for pySSTV 0.5.10
File Size Uploaded Provenance
pysstv-0.5.10.tar.gz 16.4 kB Without provenance Details

Built distribution (wheel)

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

Total release size: 37.6 kB

Release files / pysstv-0.5.10.tar.gz

Download URL pysstv-0.5.10.tar.gz
Size 16.4 kB
Tags Source
SHA-256 checksum
How to use checksums
3e3467cf11a3fd066cecdb35b7dc881048d45b9668bcadba7093a87afd90b26a
BLAKE2b-256 checksum
How to use checksums
9d5ecba08a598c27b6f7025711b1c6adb535826d8bb2cfde6f8a456ac0cc641f
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.13.5 {"installer":{"name":"uv","version":"0.13.5","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

Release files / pysstv-0.5.10-py3-none-any.whl

Download URL pysstv-0.5.10-py3-none-any.whl
Size 21.1 kB
Tags Python 3
SHA-256 checksum
How to use checksums
b78bdb9ce3bf8ec7d09c827ef0324e3824e3a181b8ada82749b485efd04a2b94
BLAKE2b-256 checksum
How to use checksums
4f4bf6bf05c2b64509ba4e7525b4f2c4c89f5a6011ac3133a43dd38063ac8815
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.13.5 {"installer":{"name":"uv","version":"0.13.5","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

Security for pySSTV 0.5.10

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Release history Release notifications | RSS feed

This release

0.5.10 This release

2 release files No provenance

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