tennis3d

Shot Labeler
no clip loaded

New here? Labeling is a 4-step loop

  1. Load a video (the “Video” picker, top-left). Its fps is auto-detected from the video — just confirm it in the Clip metadata panel below.
  2. Scrub to the contact frame — the exact frame the racket meets the ball. Drag the time bar under the video to move fast, jump ±1s with ⇧←/⇧→, then fine-tune with / (±1) and ,/. (±5).
  3. Press Enter to mark a shot at that frame.
  4. Tag it with one key each: player 14, stroke q w e r …, spin 70, outcome u i o p … (see the cheatsheet →).
Repeat for every shot, then Export JSON and save it into labeling/labels/. Your work autosaves locally as you go. This box disappears once you load a video.
frame 0 / 0 time 0.000s speed 1.00×

Label this shot

Voice

Off
Heard
Enable Voice mode, then mark or select a shot.
Interpreted
Source
Local
Voice mode is off. Enable it, mark or select a shot, then hold V.
Microphone and AI privacy

Desktop Chrome is recommended. Each hold stops after eight seconds. Chrome may process microphone audio; tennis3d never stores audio or transcripts. When enabled, AI fallback sends unresolved transcript alternatives, the selected English locale, and whether a stroke is required—never audio, video, clip identifiers, frames, or label values. OpenAI's default abuse-monitoring logs may retain the sent text and metadata for up to 30 days. Privacy details.

Recent shots

0 shots
Tab / Shift+Tab to select
#frametimeplayerstrokespinoutcome