Skip to main content

Gloss-Based Pipeline for Spoken to Signed Language Translation

a text-to-gloss-to-pose-to-video pipeline for spoken to signed language translation.

Visualization of our pipeline

Install

pip install spoken-to-signed

Then, to download a lexicon, run:

download_lexicon \
  --name <signsuisse> \
  --directory <path_to_directory>

Usage

For language codes, we use the IANA Language Subtag Registry. Our pipeline provides multiple scripts.

To quickly demo it using a dummy lexicon, either open it in Colab:

Open In Colab

or run it locally with some installation steps first:

git clone https://github.com/ZurichNLP/spoken-to-signed-translation
cd spoken-to-signed-translation

pip install .

text_to_gloss_to_pose \
  --text "Kleine Kinder essen Pizza in Zürich." \
  --glosser "simple" \
  --lexicon "assets/dummy_lexicon" \
  --spoken-language "de" \
  --signed-language "sgg" \
  --pose "quick_test.pose"

Text-to-Gloss Translation

This script translates input text into gloss notation.

text_to_gloss \
  --text <input_text> \
  --glosser <simple|spacylemma|rules|nmt> \
  --spoken-language <de|fr|it> \
  --signed-language <sgg|ssr|slf>

Text-to-Gloss-to-Pose Translation

This script translates input text into gloss notation, then converts the glosses into a pose file.

text_to_gloss_to_pose \
  --text <input_text> \
  --glosser <simple|spacylemma|rules|nmt> \
  --lexicon <path_to_directory> \
  --spoken-language <de|fr|it> \
  --signed-language <sgg|ssr|slf> \
  --pose <output_pose_file_path>.pose

Words missing from the lexicon are fingerspelled letter-by-letter by default; pass --disable-fingerspelling to skip them instead.

Add --coverage-info to print how each token was matched, color-coded in the terminal (green: lexicon, yellow: language backup, orange: fingerspelling, red: unmatched), or --coverage-stats <file.json> to save the same per-token information as JSON.

Text-to-Gloss-to-Pose-to-Video Translation

This script translates input text into gloss notation, converts the glosses into a pose file, and then transforms the pose file into a video.

Note: Video generation requires the pose-to-video package with pix2pix and upscaler:

pip install 'pose-to-video[pix2pix,simple_upscaler] @ git+https://github.com/sign-language-processing/pose-to-video'
text_to_gloss_to_pose_to_video \
  --text <input_text> \
  --glosser <simple|spacylemma|rules|nmt> \
  --lexicon <path_to_directory> \
  --spoken-language <de|fr|it> \
  --signed-language <sgg|ssr|slf> \
  --video <output_video_file_path>.mp4

HTTP service

pip install '.[server]'
MODEL_VERSION=local hypercorn spoken_to_signed.server:app --bind 0.0.0.0:8080

POST /tokens-to-gloss accepts atomic words/spans with POS and optional morphology:

{
  "spoken_language": "en",
  "signed_language": "ase",
  "tokens": [
    {"word": "What", "gloss": "what", "pos": "PRON"},
    {"word": "is", "gloss": "be", "pos": "AUX"},
    {"word": "your", "gloss": "your", "pos": "PRON"},
    {"word": "name", "gloss": "name", "pos": "NOUN"},
    {"word": "?", "gloss": "?", "pos": "PUNCT"}
  ]
}

Returns sentences containing the original objects in your name what ? order, plus indexes: [[2, 3, 0, 4]]. All annotations pass through unchanged; no merging in the caller. glosser is rules (default, English → ASL) or simple (identity). morphology is a list of spaCy feature dictionaries, one per source token in a span. These are mechanical rules, not fluent ASL. Unknown words remain for downstream fingerspelling; punctuation remains for sentence boundaries. TODO: batch API.

For model-based reordering, install .[server,gpt], set OPENAI_API_KEY at runtime, and send "glosser": "gpt". This uses gpt-5.6-luna with reasoning disabled (override model with OPENAI_MODEL); only rules-approved omissions are allowed. Rules/simple need no API key.

POST /senses-to-gloss accepts senses (the WSD document with tokens, synsets, and entities) plus the same language/glosser fields. It groups multiword spans before glossing and returns the same response. Indexes refer to grouped candidates; each candidate carries its original start_token/end_token, exact-span senses and entities, and source annotations for later lookup/fallback. Unknown words survive. Overlapping spans prefer the widest meaning (earlier on ties); constituent senses are never treated as senses of the whole phrase. No dictionary lookup happens here.

POST /gloss-to-pose accepts already ordered tokens and the same language fields, returning binary application/pose. It uses the existing lookup and concatenation, excluding pos: "PUNCT". Optional: fingerspelling=true, anonymize=false, source (PostgreSQL video-ID prefix). Configure LEXICON_PATH for CSV or DATABASE_URL for PostgreSQL (takes precedence); without either, pose requests return 503. For PostgreSQL, install .[server,postgres,gcs] and use a read-only role. The optional SQLPoseLookup backend migrates the old models captions-table lookup and reads gs://sign-mt-poses; it is not dictionary-api synset lookup. Glosser/health requests need no database. See /docs for the full API schema.

docker build --build-arg MODEL_VERSION=local -t spoken-to-signed .
docker run --rm -p 8080:8080 spoken-to-signed

Releases publish ghcr.io/sign-language-processing/spoken-to-signed-translation:<tag>. The image includes PostgreSQL/GCS/GPT dependencies. PORT defaults to 8080; Hypercorn supports HTTP/1.1 and HTTP/2 (h2c). Configure HTTP/2 upstream in the gateway too. /health returns version; successful API responses include X-Model-Tag, set by MODEL_VERSION (baked into release images), with a suffix identifying the configured GPT model and base URL. Deploy internally; auth and caching belong to the gateway. Caller routing and the old caption-maintenance job still need migrating before retiring the function in models.

Methodology

The pipeline consists of three main components:

  1. Text-to-Gloss Translation

    Transforms the input (spoken language) text into a sequence of glosses.

  1. Gloss-to-Pose Conversion
  • Lookup: Uses a lexicon of signed languages to convert the sequence of glosses into a sequence of poses.
  • Pose Concatenation: The poses are then cropped, concatenated, and smoothed, creating a pose representation for the input sentence.
  1. Pose-to-Video Generation

    Transforms the processed pose video back into a synthesized video using an image translation model.

Supported Languages

Language IANA Code Glossers Supported Lexicon Data Source
Swiss German Sign Language sgg simple, spacylemma, rules, nmt SignSuisse (de)
Swiss French Sign Language ssr simple, spacylemma SignSuisse (fr)
Swiss Italian Sign Language slf simple, spacylemma SignSuisse (it)
German Sign Language gsg simple, spacylemma, nmt WordNet (Coming Soon)
British Sign Language bfi simple, spacylemma, nmt WordNet (Coming Soon)

Online Playgrounds

We have two available:

  • sign.mt is a web interface of a translation system.
  • research.sign.mt is an overview of sign language processing literature.

Citation

If you find this work useful, please cite our paper:

@inproceedings{moryossef2023baseline,
  title={An Open-Source Gloss-Based Baseline for Spoken to Signed Language Translation},
  author={Moryossef, Amit and M{\"u}ller, Mathias and G{\"o}hring, Anne and Jiang, Zifan and Goldberg, Yoav and Ebling, Sarah},
  booktitle={2nd International Workshop on Automatic Translation for Signed and Spoken Languages (AT4SSL)},
  year={2023},
  month={June},
  url={https://github.com/ZurichNLP/spoken-to-signed-translation},
  note={Available at: \url{https://arxiv.org/abs/2305.17714}}
}

Metadata

Release files for spoken-to-signed 0.1.1

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

Source distribution (sdist)

Source distribution for spoken-to-signed 0.1.1
File Size Uploaded
spoken_to_signed-0.1.1.tar.gz 95.9 MB Details

Built distribution (wheel)

Table of built distributions (wheels) for spoken-to-signed 0.1.1
File Interpreter ABI Platform
spoken_to_signed-0.1.1-py3-none-any.whl Python 3 none any Details

Total release size: 191.9 MB

Release files / spoken_to_signed-0.1.1.tar.gz

Download URL spoken_to_signed-0.1.1.tar.gz
Size 95.9 MB
Tags Source
SHA-256 checksum
How to use checksums
d98e621da1d0c66e0b854ca49ff662c47314ac3b7a49f90307c60031c4cc28ca
BLAKE2b-256 checksum
How to use checksums
7c036313116c31930e0972abedf89299db707368da4639780e2a06e3d7649b15
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

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.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 18, 2026.

Transparency log

Release files / spoken_to_signed-0.1.1-py3-none-any.whl

Download URL spoken_to_signed-0.1.1-py3-none-any.whl
Size 95.9 MB
Tags Python 3
SHA-256 checksum
How to use checksums
8edd253fc2f6f6dd614140b5b335510f998b92ca08bb33a6951e53fae0b397b9
BLAKE2b-256 checksum
How to use checksums
bb06033299fa5f0fa807001c7d63e1309412c1a6e53f3759ee78b623ec744062
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

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.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 18, 2026.

Transparency log

Release history Release notifications | RSS feed

0.3.3

2 release files

0.3.2

2 release files

0.3.1

2 release files

0.3.0

2 release files

0.2.2

2 release files

0.2.1

2 release files

0.2.0

2 release files

This release

0.1.1 This release

2 release files

0.1.0

2 release files

0.0.4

2 release files

0.0.3

2 release files

0.0.2

2 release files

0.0.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