Project Info
This project did not submit a demo video on Devpost.
Inspiration
On February 12, 2023, the Super Bowl Halftime Show featuring Rihanna delivered a record 113 million viewers. But it wasn't her performance that captured the attention of most — it was her ASL interpreter. Justine Miles made the performance accessible to the Deaf and hard-of-hearing community, and in doing so went viral, exposing millions of hearing viewers to the expressiveness of American Sign Language for the first time. That moment crystallized something for us: ASL interpretation of music shouldn't be a once-a-year spectacle reserved for the biggest stages. Every song, for every person, should be able to sign. Senya was born from the idea that the gap between a song and its ASL performance could be closed by software, making music a shared experience rather than a divided one.
What it does
Senya transforms any song into a synchronized ASL music video. You give it lyrics (or just an audio file) and the original song, and it returns a complete video of a signer performing the lyrics in American Sign Language, timed to the music, with karaoke-style captions burned in. Under the hood it transcribes the lyrics with timestamps, translates English into ASL gloss, fetches real ASL signing clips for each sign, stretches them to match the song's pacing, stitches them into one continuous performance, overlays the original music, and adds synced captions, producing a shareable video that makes any track accessible and engaging for the Deaf and hard-of-hearing community.
How we built it
Senya is a seven-stage Python pipeline. Stage 1 uses OpenAI Whisper (or a text parser) to turn lyrics into timed words. Stage 2 uses Anthropic's Claude (claude-sonnet-4-6) to translate English into ASL gloss, since ASL has its own grammar and word order rather than a one-to-one mapping from English. Stage 3 resolves each gloss token to a real signing clip by fetching GIFs on demand from Lifeprint (Dr. Bill Vicars' ASL University), converting them to MP4 with Pillow and OpenCV while preserving each frame's native timing, and caching the resulting CDN URLs so no sign is ever fetched twice. Stages 4 through 7 run entirely on Pika's REST API: generate_reference_video takes the stitched clips and overlays them onto the Pika avatar to give a realistic concert-feel, edit_speed adjusts clip timing at the phrase level, edit_concat stitches clips together (batched to respect the 24-clip limit), edit_audio_mix overlays the original song, and add_captions burns in synced karaoke lyrics. The final output is a single Pika CDN URL.
Challenges we ran into
The biggest challenge was getting Pika to sign accurately at all. Our first approach was to fine-tune a model on MLASL, a dictionary of English words mapped to ASL videos that is widely used in research. That quickly proved unworkable: Pika is closed source, so we had no access to the model weights and no way to fine-tune. We pivoted to Pika's generate-reference-video tool, using Lifeprint's videos as the reference. Because Lifeprint features a consistent signer against a consistent background, Pika was able to reproduce the signs accurately and place that signing within a concert-style environment, which was exactly the result we were after. From there, the focus shifted to stitching the generated clips into one continuous performance. We made strong progress getting portions of the song working, and refined our approach to timing and tempo to keep the signing synchronized to the music across the track.
Accomplishments we're proud of
We're proud that Senya uses real ASL rather than synthetic avatars or approximations that the Deaf community has long criticized. We built an on-demand architecture that requires no multi-gigabyte dataset download: each sign is fetched the first time it's needed and cached forever after, so the system gets faster the more you use it. And we got an end-to-end pipeline working across two AI APIs and a video editing API, turning a raw song into a captioned, music-synced ASL performance with a single command.
What we learned
We learned that ASL is a full language with its own grammar, not a signed transcription of English — which is why the gloss translation step matters so much and why naive word-for-word mapping fails. We got hands-on with the realities of programmatic video editing: frame timing, aspect ratios, concat limits, and audio mixing each carry constraints that shape the whole architecture. And we learned that accessibility engineering is full of trade-offs between sign authenticity and coverage, musical timing and sign readability, where the right answer is usually a thoughtful fallback rather than a perfect solution.
What's next
Next we want to move from stitched real-sign clips toward smoother transitions between signs, since signing is continuous rather than a sequence of discrete words. We'd like to expand sign coverage beyond Lifeprint by integrating additional datasets (like How2Sign) to shrink the fingerspelling fallback rate. We're also interested in capturing ASL's non-manual markers, which are facial expression and body movement carry grammatical and emotional meaning that static clip-stitching loses. Longer term: real-time signing for live performances, support for sign languages beyond ASL, and a community feedback loop so Deaf signers can help improve translation quality.
This repository has no readme, or GitHub could not be reached.
Analysis
View
Metric
- 2
- 2
- 1
Figures cover GitHub contributors during the hackathon window. A co-authored commit counts in full for each author, so per-member totals add up to more than the whole-team figures.
Technology
- AnthropicIn code
- CSSIn code
- FastAPIIn code
- HTMLIn code
- JavaScriptIn code
- PythonIn code
6 of 6 appear in the indexed code.
AI coding agents
- Claude CodeCommits
Detected from committed agent config files and commit authorship. Absence of a signal is not proof an agent was unused.
Codebase size
Source size
934 KB
Source files
59
Counts recognized source files only; vendored directories, binaries and lockfiles are excluded, so this is smaller than the repository on disk.
Repository
Deeksha-Vaidyanathan/senya
206 files · 71.4 MB · @ d04ce13
Structure
Interface
14 files · 7%Screens, components and styles rendered to the user.
Application logic
10 files · 5%Domain rules, services and shared utilities.
Supporting
Layers are inferred from where files sit in the tree, not from reading the code. A project that names its directories unconventionally will read oddly here — open the file browser to check anything the diagram implies.
Languages
- Markdown88%
- HTML8%
- Python3%
- CSS1%
- JavaScript0%
Share of indexed source by file size. Binary and vendored files are excluded.
Dependencies
backend/requirements.txt
pypi · 4- fastapi
- python-dotenv
- python-multipart
- uvicorn[standard]
scripts/requirements.txt
pypi · 4- anthropic
- beautifulsoup4
- python-dotenv
- requests
Declared in the repository’s manifests at the indexed commit. A declared package is not proof it is used, and runtime dependencies are listed first.
Feature verification
Dictionary coverage stats endpointVerified
(implied supporting infra for 'on-demand architecture... gets faster the more you use it')
Claimed on Devposthigh confidencebackend/main.py:56— GET /dictionary/stats returns total/generated/verified counts from dictionary.stats().backend/dictionary.py:35— stats() computes coverage counts from the loaded index.
Fuzzy/stem matching for gloss tokens against sign dictionaryVerified
(implied implementation detail supporting 'fetches real ASL signing clips for each sign')
Claimed on Devposthigh confidencebackend/pipeline.py:18— _fuzzy_local_lookup() does exact match then strips common suffixes (ing, ed, es, s, er, ly) to find a dictionary entry.
Local ffmpeg-based clip stitching and picture-in-picture overlay (actual implementation, not Pika edit APIs)Verified
(implied by 'stitches them into one continuous performance' / 'overlays the original music') - actual implementation uses local ffmpeg instead of Pika's edit endpoints for the final assembly
Claimed on Devposthigh confidencebackend/local_ffmpeg.py:52— concat() normalizes and concatenates local clip files with the bundled ffmpeg binary.backend/local_ffmpeg.py:73— pip_overlay() overlays the signing clip onto the base video using ffmpeg filter_complex, mapping the base video's own audio track (0:a?), not a separately mixed original song track.backend/pipeline.py:91— process_video() calls local_ffmpeg.concat() and local_ffmpeg.pip_overlay(), confirming the live pipeline bypasses Pika's edit_concat/edit_pip/edit_audio_mix entirely.
Web UI for URL or file upload, showing transcript/gloss/coverage and downloadable output videoVerified
(implied by 'a shareable video' / 'you give it lyrics or audio file and the original song')
Claimed on Devposthigh confidencefrontend/app.js:34— Submit handler posts to /process or /process/upload depending on tab, then showResult() renders transcript, gloss, sign coverage, and a downloadable output video.backend/main.py:60— FastAPI endpoints /process and /process/upload wire the UI actions to process_video().
Claude (claude-sonnet-4-6) English to ASL gloss translationCode-supported
Stage 2 uses Anthropic's Claude (claude-sonnet-4-6) to translate English into ASL gloss
Claimed on Devpostmedium confidencebackend/gloss.py:24— _claude_gloss() shells out to the local `claude` CLI to produce gloss tokens; it does not call the Anthropic API directly nor specify a claude-sonnet-4-6 model, and falls back to a simple rule-based stripper (_rule_based) on failure.
Karaoke-style captions burned in via Pika add_captionsCode-supported
add_captions burns in synced karaoke lyrics
Claimed on Devpostmedium confidencebackend/pika_client.py:29— add_captions() calls Pika's add_captions tool with a style parameter and is invoked in pipeline.py, but there is no karaoke-style (word-by-word highlighted) caption logic, just a generic style string.
On-demand fetching of real ASL clips from Lifeprint with CDN caching so no sign is fetched twiceCode-supported
Stage 3 resolves each gloss token to a real signing clip by fetching GIFs on demand from Lifeprint, converting them to MP4 with Pillow/OpenCV, and caching CDN URLs so no sign is ever fetched twice
Claimed on Devpostmedium confidencescripts/download_signs.py:1— Scrapes lifeprint.com for word GIF/MP4 signs into dictionary/source, but the file's own docstring says 'Run BEFORE the hackathon' i.e. an offline pre-fetch script, not on-demand runtime fetching as claimed.backend/dictionary.py:11— Runtime dictionary.load() only reads a pre-built local index.json and local_lookup() serves files already present in dictionary/source; there is no runtime network fetch, Pillow/OpenCV conversion, or CDN caching logic anywhere in backend/.
Pika edit_concat stitching clips with 24-clip batch limit handlingCode-supported
edit_concat stitches clips together (batched to respect the 24-clip limit)
Claimed on Devpostlow confidencebackend/pika_client.py:67— edit_concat() exists and calls the Pika MCP tool, but there is no batching logic for a 24-clip limit anywhere, and the live pipeline (backend/pipeline.py) does not call it at all, using local_ffmpeg.concat() instead.
Pika generate_reference_video to place signs on a concert-style avatarCode-supported
generate_reference_video takes the stitched clips and overlays them onto the Pika avatar to give a realistic concert-feel
Claimed on Devpostmedium confidencescripts/generate_dict.py:58— generate_sign_clip() calls Pika's generate_reference_video tool per word during offline dictionary-building, but this happens once per dictionary word ahead of time, not per-song at pipeline runtime; the live backend pipeline never calls it.
Song to synchronized ASL video pipeline (transcript, gloss, sign clips, stitched video)Code-supported
Senya transforms any song into a synchronized ASL music video, from lyrics/audio to a stitched video of a signer performing ASL timed to the music
Claimed on Devposthigh confidencebackend/pipeline.py:32— process_video() runs transcript -> gloss -> clip lookup -> concat -> overlay pipeline end to end, but it is a general video captioning/signing overlay tool, not specifically a music/song pipeline (no audio-stretch-to-tempo or song-specific handling).
Transcription via Pika transcribe_audio / manual transcript overrideCode-supported
You give it lyrics (or just an audio file) ... it transcribes the lyrics with timestamps
Claimed on Devposthigh confidencebackend/pipeline.py:46— Transcript is obtained via pika.add_captions() (a Pika MCP tool call), or a manual transcript_override; no word-level timestamps are captured or used anywhere in the pipeline.backend/pika_client.py:29— add_captions() returns {url, transcript} with no per-word timing data.
Pika edit_audio_mix to overlay original song audioClaimed only
edit_audio_mix overlays the original song
Claimed on Devposthigh confidencePika edit_speed for phrase-level clip timing adjustmentClaimed only
edit_speed adjusts clip timing at the phrase level
Claimed on Devposthigh confidencePillow/OpenCV GIF-to-MP4 conversion preserving native frame timingClaimed only
converting them to MP4 with Pillow and OpenCV while preserving each frame's native timing
Claimed on Devposthigh confidenceWhisper-based lyric transcription with timestampsClaimed only
Stage 1 uses OpenAI Whisper (or a text parser) to turn lyrics into timed words
Claimed on Devposthigh confidenceFine-tuning attempt on MLASL dataset (abandoned approach)Blocked
Our first approach was to fine-tune a model on MLASL... that proved unworkable since Pika is closed source
Claimed on Devposthigh confidence
An AI agent derived these features from the project’s Devpost page and readme, then searched the code for each one. Verified features are backed by cited code; claimed-only features had no supporting code, which is not by itself proof a feature is missing.
Export this project's context (description, README, evidence, key source files) to chat with an AI agent elsewhere.