terpsi 0.0.2__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ *.ipynb linguist-documentation
@@ -0,0 +1,119 @@
1
+ .claude/handoffs/
2
+ .claude/scratch/
3
+
4
+ # Byte-compiled / optimized / DLL files
5
+ __pycache__/
6
+ *.py[cod]
7
+ *$py.class
8
+
9
+
10
+ .DS_Store
11
+ # C extensions
12
+ *.so
13
+
14
+ # TLS certificates
15
+ ## Ignore all PEM files anywhere
16
+ *.pem
17
+ ## Also ignore any certs directory
18
+ certs/
19
+
20
+ # Distribution / packaging
21
+ .Python
22
+ build/
23
+ develop-eggs/
24
+ dist/
25
+ downloads/
26
+ eggs/
27
+ .eggs/
28
+ lib/
29
+ lib64/
30
+ parts/
31
+ sdist/
32
+ var/
33
+ wheels/
34
+ *.egg-info/
35
+ .installed.cfg
36
+ *.egg
37
+ MANIFEST
38
+ _build
39
+
40
+ # PyInstaller
41
+ # Usually these files are written by a python script from a template
42
+ # before PyInstaller builds the exe, so as to inject date/other infos into it.
43
+ *.manifest
44
+ *.spec
45
+
46
+ # Installer logs
47
+ pip-log.txt
48
+ pip-delete-this-directory.txt
49
+
50
+ # Unit test / coverage reports
51
+ htmlcov/
52
+ .tox/
53
+ .coverage
54
+ .coverage.*
55
+ .cache
56
+ nosetests.xml
57
+ coverage.xml
58
+ *.cover
59
+ .hypothesis/
60
+ .pytest_cache/
61
+
62
+ # Translations
63
+ *.mo
64
+ *.pot
65
+
66
+ # Django stuff:
67
+ *.log
68
+ local_settings.py
69
+ db.sqlite3
70
+
71
+ # Flask stuff:
72
+ instance/
73
+ .webassets-cache
74
+
75
+ # Scrapy stuff:
76
+ .scrapy
77
+
78
+ # Sphinx documentation
79
+ docs/_build/
80
+
81
+ # PyBuilder
82
+ target/
83
+
84
+ # Jupyter Notebook
85
+ .ipynb_checkpoints
86
+
87
+ # pyenv
88
+ .python-version
89
+
90
+ # celery beat schedule file
91
+ celerybeat-schedule
92
+
93
+ # SageMath parsed files
94
+ *.sage.py
95
+
96
+ # Environments
97
+ .env
98
+ .venv
99
+ env/
100
+ venv/
101
+ ENV/
102
+ env.bak/
103
+ venv.bak/
104
+
105
+ # Spyder project settings
106
+ .spyderproject
107
+ .spyproject
108
+
109
+ # Rope project settings
110
+ .ropeproject
111
+
112
+ # mkdocs documentation
113
+ /site
114
+
115
+ # mypy
116
+ .mypy_cache/
117
+
118
+ # PyCharm
119
+ .idea
terpsi-0.0.2/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 thorwhalen
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
terpsi-0.0.2/PKG-INFO ADDED
@@ -0,0 +1,117 @@
1
+ Metadata-Version: 2.5
2
+ Name: terpsi
3
+ Version: 0.0.2
4
+ Summary: Dance corpora from single-dancer videos: body landmarks (no video kept), audio, subtitles, on-screen text, and movement-vs-music analysis.
5
+ Project-URL: Homepage, https://github.com/thorwhalen/terpsi
6
+ Project-URL: Repository, https://github.com/thorwhalen/terpsi
7
+ Project-URL: Documentation, https://thorwhalen.github.io/terpsi
8
+ Author: Thor Whalen
9
+ License-Expression: MIT
10
+ License-File: LICENSE
11
+ Keywords: beat,corpus,dance,landmarks,mediapipe,music,pose,thoremin
12
+ Requires-Python: >=3.10
13
+ Requires-Dist: cw
14
+ Requires-Dist: numpy
15
+ Requires-Dist: scipy
16
+ Provides-Extra: acquire
17
+ Requires-Dist: yb[download]; extra == 'acquire'
18
+ Provides-Extra: all
19
+ Requires-Dist: librosa; extra == 'all'
20
+ Requires-Dist: matplotlib; extra == 'all'
21
+ Requires-Dist: mediapipe>=0.10.30; extra == 'all'
22
+ Requires-Dist: ocracy[ocrmac]; (sys_platform == 'darwin') and extra == 'all'
23
+ Requires-Dist: ocracy[tesseract]; (sys_platform != 'darwin') and extra == 'all'
24
+ Requires-Dist: opencv-python; extra == 'all'
25
+ Requires-Dist: soundfile; extra == 'all'
26
+ Requires-Dist: yb[download]; extra == 'all'
27
+ Provides-Extra: audio
28
+ Requires-Dist: librosa; extra == 'audio'
29
+ Requires-Dist: soundfile; extra == 'audio'
30
+ Provides-Extra: dev
31
+ Requires-Dist: pytest-cov>=4.0; extra == 'dev'
32
+ Requires-Dist: pytest>=7.0; extra == 'dev'
33
+ Requires-Dist: ruff>=0.1.0; extra == 'dev'
34
+ Provides-Extra: docs
35
+ Requires-Dist: sphinx-rtd-theme>=1.0; extra == 'docs'
36
+ Requires-Dist: sphinx>=6.0; extra == 'docs'
37
+ Provides-Extra: ocr
38
+ Requires-Dist: ocracy[ocrmac]; (sys_platform == 'darwin') and extra == 'ocr'
39
+ Requires-Dist: ocracy[tesseract]; (sys_platform != 'darwin') and extra == 'ocr'
40
+ Provides-Extra: pose
41
+ Requires-Dist: mediapipe>=0.10.30; extra == 'pose'
42
+ Requires-Dist: opencv-python; extra == 'pose'
43
+ Provides-Extra: report
44
+ Requires-Dist: matplotlib; extra == 'report'
45
+ Description-Content-Type: text/markdown
46
+
47
+ # terpsi
48
+
49
+ Dance corpora from single-dancer videos: body landmarks (no video kept), audio, subtitles, on-screen text, and movement-versus-music analysis. Named for Terpsichore, the muse of dance.
50
+
51
+ ```bash
52
+ pip install "terpsi[all]" # mediapipe + opencv, librosa, an OCR backend, yb (yt-dlp); ffmpeg on PATH
53
+ terpsi ingest https://youtu.be/q_TUyxUhoEw
54
+ terpsi clips
55
+ ```
56
+
57
+ A clip goes in as a URL (YouTube, Wikimedia Commons, anything yt-dlp reads) or a local file, and comes out as a folder under `~/.local/share/terpsi/clips/<clip_id>/` holding what a dance model needs and nothing a video needs: 553 landmarks per frame (33 body + 2×21 hands + 478 face, with metric 3D world coordinates for body and hands, and 52 face blendshapes), the audio stream as the source carried it, the description and metadata, the subtitles, the text that was on screen with its timestamps, a beat grid, and a movement-versus-music report. The video is deleted once extracted.
58
+
59
+ ## Python
60
+
61
+ ```python
62
+ from terpsi import ingest, Corpus
63
+
64
+ clip_id = ingest("https://youtu.be/q_TUyxUhoEw") # download, extract, delete the video
65
+ clip = Corpus()[clip_id]
66
+ lm = clip.landmarks # LandmarkSeries: lm.pose (F,33,4), lm.pose_world (F,33,3), lm.hand_left, lm.face, ...
67
+ clip.beats["tempo"] # 129.2
68
+ clip.screen_text[:2] # [{'t_start': 3.0, 't_end': 6.0, 'text': 'Mise en place', ...}, ...]
69
+ clip.report["beat_alignment"] # AIST++ Beat Alignment Score of the body's landings against the music beats
70
+ ```
71
+
72
+ Each stage is a function with one seam, a keyword argument whose default works out of the box:
73
+
74
+ | stage | function | seam | default | a replacement that exists |
75
+ |---|---|---|---|---|
76
+ | fetch | `terpsi.acquire.fetch` | `downloader=` | `yb` over yt-dlp, with info.json, description, subtitles | a local file (passes through) |
77
+ | landmarks | `terpsi.pose.extract_landmarks` | `extractor=` | MediaPipe `HolisticLandmarker` | `kodokan.pose.estimate_poses` (RTMPose, 2D) |
78
+ | on-screen text | `terpsi.screen_text.read_screen_text` | `ocr=` | `ocracy` (`ocrmac` on macOS, Tesseract elsewhere) | any `ocracy` backend id |
79
+ | beats | `terpsi.audio.track_beats` | `tracker=` | librosa's beat tracker + onset envelope | a `madmom` or `su` tracker with the same signature |
80
+ | storage | `terpsi.store.Corpus` | `root=` | `~/.local/share/terpsi/clips` | any folder, a mounted or synced bucket included (a byte-store backend is the next seam, terpsi#1) |
81
+
82
+ `import terpsi` needs only numpy, scipy and cw; the heavy dependencies are extras (`pose`, `audio`, `ocr`, `acquire`) imported on first use.
83
+
84
+ ## Choosing clips
85
+
86
+ ```bash
87
+ terpsi search "house dance tutorial footwork" --n 15 # YouTube, Creative-Commons-filtered by default
88
+ terpsi screen https://youtu.be/XXXXXXXXXXX # single dancer? whole body? (a pose count on sampled frames)
89
+ terpsi ingest-many sources.txt # one URL per line
90
+ ```
91
+
92
+ `screen` reports the fraction of sampled frames with exactly one body, the fraction where that body is whole (nose and an ankle visible), and the licence yt-dlp found. The licence of record per clip is yt-dlp's `license` field, stored in the manifest.
93
+
94
+ ## The analysis
95
+
96
+ `terpsi.analysis` implements the literature's movement-versus-music measures over a `LandmarkSeries` and a beat grid: motion energy (summed joint speed), kinematic beats (its local minima, AIST++), the Beat Alignment Score in both directions, the phase concentration of the body's landings within the beat cycle (a resultant length), the motion tempo by autocorrelation and its ratio to the music tempo, and the audio-visual lag by onset cross-correlation. `terpsi analyze <clip_id>` recomputes a clip's report.
97
+
98
+ ## Data layout
99
+
100
+ ```
101
+ ~/.local/share/terpsi/clips/<clip_id>/
102
+ manifest.json id, title, source, licence, duration, fps, coverage, mirrored hint, files
103
+ info.json yt-dlp's metadata
104
+ description.txt
105
+ subtitles/*.vtt
106
+ audio.m4a the source audio stream (no re-encode)
107
+ landmarks.npz/.json the LandmarkSeries (NaN where nothing was seen) and its meta
108
+ screen_text.json [{t_start, t_end, text, lines}]
109
+ beats.json tempo, beats, onset envelope
110
+ report.json the movement-vs-music report
111
+ ```
112
+
113
+ `$TERPSI_DATA_DIR` moves the root. Models (`.task` files) are fetched once into `<root>/models/`.
114
+
115
+ ## Related
116
+
117
+ [thoremin](https://github.com/thorwhalen/thoremin) (the live instrument whose body nodes and pulse follower this corpus is for), [paces](https://github.com/reeleehq/paces) (step documents from tutorial video), [kodokan](https://github.com/thorwhalen/kodokan) (pose analysis of judo video), [yb](https://github.com/reeleehq/yb), [ocracy](https://github.com/thorwhalen/ocracy). Research notes: `docs/research/`.
terpsi-0.0.2/README.md ADDED
@@ -0,0 +1,71 @@
1
+ # terpsi
2
+
3
+ Dance corpora from single-dancer videos: body landmarks (no video kept), audio, subtitles, on-screen text, and movement-versus-music analysis. Named for Terpsichore, the muse of dance.
4
+
5
+ ```bash
6
+ pip install "terpsi[all]" # mediapipe + opencv, librosa, an OCR backend, yb (yt-dlp); ffmpeg on PATH
7
+ terpsi ingest https://youtu.be/q_TUyxUhoEw
8
+ terpsi clips
9
+ ```
10
+
11
+ A clip goes in as a URL (YouTube, Wikimedia Commons, anything yt-dlp reads) or a local file, and comes out as a folder under `~/.local/share/terpsi/clips/<clip_id>/` holding what a dance model needs and nothing a video needs: 553 landmarks per frame (33 body + 2×21 hands + 478 face, with metric 3D world coordinates for body and hands, and 52 face blendshapes), the audio stream as the source carried it, the description and metadata, the subtitles, the text that was on screen with its timestamps, a beat grid, and a movement-versus-music report. The video is deleted once extracted.
12
+
13
+ ## Python
14
+
15
+ ```python
16
+ from terpsi import ingest, Corpus
17
+
18
+ clip_id = ingest("https://youtu.be/q_TUyxUhoEw") # download, extract, delete the video
19
+ clip = Corpus()[clip_id]
20
+ lm = clip.landmarks # LandmarkSeries: lm.pose (F,33,4), lm.pose_world (F,33,3), lm.hand_left, lm.face, ...
21
+ clip.beats["tempo"] # 129.2
22
+ clip.screen_text[:2] # [{'t_start': 3.0, 't_end': 6.0, 'text': 'Mise en place', ...}, ...]
23
+ clip.report["beat_alignment"] # AIST++ Beat Alignment Score of the body's landings against the music beats
24
+ ```
25
+
26
+ Each stage is a function with one seam, a keyword argument whose default works out of the box:
27
+
28
+ | stage | function | seam | default | a replacement that exists |
29
+ |---|---|---|---|---|
30
+ | fetch | `terpsi.acquire.fetch` | `downloader=` | `yb` over yt-dlp, with info.json, description, subtitles | a local file (passes through) |
31
+ | landmarks | `terpsi.pose.extract_landmarks` | `extractor=` | MediaPipe `HolisticLandmarker` | `kodokan.pose.estimate_poses` (RTMPose, 2D) |
32
+ | on-screen text | `terpsi.screen_text.read_screen_text` | `ocr=` | `ocracy` (`ocrmac` on macOS, Tesseract elsewhere) | any `ocracy` backend id |
33
+ | beats | `terpsi.audio.track_beats` | `tracker=` | librosa's beat tracker + onset envelope | a `madmom` or `su` tracker with the same signature |
34
+ | storage | `terpsi.store.Corpus` | `root=` | `~/.local/share/terpsi/clips` | any folder, a mounted or synced bucket included (a byte-store backend is the next seam, terpsi#1) |
35
+
36
+ `import terpsi` needs only numpy, scipy and cw; the heavy dependencies are extras (`pose`, `audio`, `ocr`, `acquire`) imported on first use.
37
+
38
+ ## Choosing clips
39
+
40
+ ```bash
41
+ terpsi search "house dance tutorial footwork" --n 15 # YouTube, Creative-Commons-filtered by default
42
+ terpsi screen https://youtu.be/XXXXXXXXXXX # single dancer? whole body? (a pose count on sampled frames)
43
+ terpsi ingest-many sources.txt # one URL per line
44
+ ```
45
+
46
+ `screen` reports the fraction of sampled frames with exactly one body, the fraction where that body is whole (nose and an ankle visible), and the licence yt-dlp found. The licence of record per clip is yt-dlp's `license` field, stored in the manifest.
47
+
48
+ ## The analysis
49
+
50
+ `terpsi.analysis` implements the literature's movement-versus-music measures over a `LandmarkSeries` and a beat grid: motion energy (summed joint speed), kinematic beats (its local minima, AIST++), the Beat Alignment Score in both directions, the phase concentration of the body's landings within the beat cycle (a resultant length), the motion tempo by autocorrelation and its ratio to the music tempo, and the audio-visual lag by onset cross-correlation. `terpsi analyze <clip_id>` recomputes a clip's report.
51
+
52
+ ## Data layout
53
+
54
+ ```
55
+ ~/.local/share/terpsi/clips/<clip_id>/
56
+ manifest.json id, title, source, licence, duration, fps, coverage, mirrored hint, files
57
+ info.json yt-dlp's metadata
58
+ description.txt
59
+ subtitles/*.vtt
60
+ audio.m4a the source audio stream (no re-encode)
61
+ landmarks.npz/.json the LandmarkSeries (NaN where nothing was seen) and its meta
62
+ screen_text.json [{t_start, t_end, text, lines}]
63
+ beats.json tempo, beats, onset envelope
64
+ report.json the movement-vs-music report
65
+ ```
66
+
67
+ `$TERPSI_DATA_DIR` moves the root. Models (`.task` files) are fetched once into `<root>/models/`.
68
+
69
+ ## Related
70
+
71
+ [thoremin](https://github.com/thorwhalen/thoremin) (the live instrument whose body nodes and pulse follower this corpus is for), [paces](https://github.com/reeleehq/paces) (step documents from tutorial video), [kodokan](https://github.com/thorwhalen/kodokan) (pose analysis of judo video), [yb](https://github.com/reeleehq/yb), [ocracy](https://github.com/thorwhalen/ocracy). Research notes: `docs/research/`.
@@ -0,0 +1,238 @@
1
+ # terpsi: external web research (models, datasets, terms, metrics, clip choice)
2
+
3
+ Date: 2026-10-27. Scope: external sources only (in-house code survey is a separate note). Nothing here is legal advice; legal points only restate what the cited sources say. Items marked UNVERIFIED could not be confirmed from a primary source in this session. Items marked ESTIMATE are my own arithmetic or domain guesses.
4
+
5
+ ## Summary and recommendation
6
+
7
+ 1. Keep MediaPipe HolisticLandmarker as the default. The current guide counts 553 landmarks (33 pose + 478 face incl. 10 iris + 2x21 hands), not 543 (the 543 figure is the older 468-point face mesh) [1][2]. Metric world coordinates exist only for pose and hands; face landmarks are image-normalised only [1].
8
+ 2. The only realistic second backend is a 2D whole-body model through `rtmlib` (RTMW / DWPose, 133 keypoints, Apache-2.0 code, onnxruntime on cpu/cuda/mps) [5]. Make it a seam, not a dependency. Everything with SMPL output (4D-Humans, WHAM, GVHMR, TRAM, SMPLer-X) needs the SMPL model, which is non-commercial, non-redistributable and bars training commercial ML systems [23], and most need CUDA; treat them as study or optional extras.
9
+ 3. Sapiens (308 keypoints) is CC BY-NC 4.0 [11]; Sapiens2 has a custom Meta licence that prohibits "biometric processing" and "identifying individuals" among other uses [13]. Study, do not depend.
10
+ 4. No public dataset replaces scraping. AIST++ (5.2 h, 1,408 sequences, 30 subjects, 10 genres) is the only one with a clear, widely used metric protocol, but the underlying AIST Dance DB is academic-research-only, needs an application form, and forbids redistribution [24][28][29]. Use it to calibrate and sanity-check the beat-alignment code, not as corpus content.
11
+ 5. No dataset of dance TUTORIAL video with step names was found; the nearest are UID (154 movement types, 9 genres) and Let's Dance (style labels only) [43][44]. The on-screen-text and subtitle layer of terpsi is a real gap in the literature, as far as this search went.
12
+ 6. YouTube ToS forbids downloading and automated access without permission unless the service expressly authorises it [45]. The CC filter and yt-dlp `license` field identify CC BY uploads [46][47][48], but CC BY only covers what the uploader could license, and YouTube says it cannot grant rights to third-party content such as the song [46]. Audio is the weak point; landmarks are the safest derived layer, though choreography of a whole routine can itself be copyrightable [54][55].
13
+ 7. Research-exemption anchors: EU DSM art. 3 (research organisations, lawful access, no opt-out) and art. 4 (anyone, rightholder opt-out) [50]; the Hamburg LAION ruling applied the research exception to dataset creation, upheld on appeal in Dec 2025 per secondary summaries [51]; US fair use is case-by-case [52][53].
14
+ 8. Beat alignment: implement the AIST++ BeatAlign (sigma = 3 frames at 60 fps; rescale for 25-30 fps video) [29], plus a Davis-Agrawala style impact envelope as a pose-free cross-check [58]. FID_k/FID_g/Div are distribution metrics for generators and make no sense per clip [29][60].
15
+ 9. Practical flag: "mirrored" tutorials swap the dancer's left and right in the landmark labels [63]. Record a `mirrored` boolean per clip (and in the corpus schema) rather than silently un-mirroring.
16
+ 10. Recommended next step: pilot ~30 clips from the query list in Theme 5, filtered by yt-dlp `license` and a static-camera check, and decide on the audio policy (keep features only vs keep audio) before any bulk run.
17
+
18
+ ## 1. Pose and landmark models for monocular dance video
19
+
20
+ ### 1.1 Per-model notes
21
+
22
+ **MediaPipe HolisticLandmarker.** One task bundle combining BlazePose (33), FaceMesh-V2 (478 with iris) and HandLandmarker (21 per hand), i.e. 553 landmarks; normalised image coordinates for all three parts, plus 3D world coordinates for pose and both hands only; face blendshapes (52 coefficients) are optional and off by default [1]. Depth semantics come from the legacy solution docs, not the new task page: pose normalised z has the hip midpoint as origin, smaller means nearer the camera, scale roughly equal to x; pose world landmarks are in metres with origin at the hip centre [2]. Hand normalised z has the wrist as origin; hand world landmarks are in metres with origin at the hand's approximate geometric centre, not the wrist [3]. The task page itself does not define z or the world origin [1][4]; that these conventions carry over unchanged to the new Holistic task is an inference (UNVERIFIED). Consequences (my reasoning, not stated by the sources): world pose is hip-centred, so there is no global trajectory or floor contact; each hand's world frame is separate from the pose frame, so combining them needs the wrist alignment done in code. Code is Apache-2.0 [66]; the licence of the model bundle was not read (UNVERIFIED). Speed: about 40 fps at 640 px on an M1 Max per the in-house survey (not independently verified here).
23
+
24
+ **RTMPose / RTMW / DWPose (COCO-WholeBody, 133 keypoints, 2D).** RTMW is the whole-body successor to RTMPose: 133 keypoints for body, hands, face, feet; RTMW-l reports 70.2 mAP on COCO-WholeBody and the authors also explore a monocular 3D whole-body variant [6]. The model table lists RTMW-x 384x288 at 70.2 AP and RTMW-m 256x192 at 58.2 AP [7]. DWPose-l reaches 0.631 whole-body AP at 256x192 and 0.665 at 384x288 [8]. `rtmlib` wraps RTMW, DWPose, RTMPose, RTMO and ViTPose in onnxruntime/opencv/openvino, supports devices cpu, cuda and mps, depends only on numpy, opencv and onnxruntime, and is Apache-2.0 [5]. DWPose is Apache-2.0 and has an `onnx` branch that avoids mmcv [8]; the model weights' licence and the licences of the training datasets were not stated on the pages read (UNVERIFIED; a mirror says dataset terms apply separately [search result, no separate ref]). Speed: only RTMPose (17-keypoint body) has published CPU numbers: RTMPose-m 11.06 ms on an i7-11700 with onnxruntime (about 90 fps, the page's own 90+ fps claim; the fps conversion is mine), pose model alone, detector excluded; with RTMDet-nano the pipeline is 26.6 ms [7]. RTMW CPU speed was not found (UNVERIFIED; expect slower than RTMPose-m, since the RTMW paper says only "marginally reduced" speed vs RTMPose per a search snippet). Whole-body gives 2D only: no depth, no world frame.
25
+
26
+ **Sapiens (Meta, 308 keypoints).** Whole-body pose with 308 keypoints (body, face, hands, feet) in 0.3B/0.6B/1B(/2B) TorchScript variants, natively 1024x1024 [9][10]. Code and weights are CC BY-NC 4.0 (non-commercial) [10][11]; the repo says portions derived from other open-source projects are Apache-2.0 [9]. The "Lite" install claims 4x faster inference but gives no absolute speed [9]. CPU/Apple Silicon support and speed: UNVERIFIED. **Sapiens2** (2026) offers 308-keypoint pose in 0.1B-5B sizes plus a 4K variant [12], under a custom "Sapiens2 License" that covers weights, does not itself address commercial use, but prohibits surveillance, biometric processing, identifying individuals, deepfakes and military use, allows Meta audits and deletion demands, and terminates on suing Meta [13]. Face landmarks used purely as expression signals are probably not "identifying individuals", but the clause deserves a legal read before adoption (my reading, UNVERIFIED).
27
+
28
+ **ViTPose / ViTPose+ (2D).** Apache-2.0 code; ViTPose++ is trained on COCO, AIC, MPII, AP10K, APT36K and WholeBody and reports WholeBody AP 54.4 (S) to 61.2 (H) [14]. The page does not state the keypoint count for the WholeBody head (133 is the COCO-WholeBody standard; `rtmlib` lists ViTPose 133-keypoint models [5]). Weights are on OneDrive, licence of weights not stated [14]. Heavier than RTMW for lower reported whole-body AP, so no reason to prefer it here.
29
+
30
+ **4D-Humans / HMR2.0.** MIT code; requires registering for the SMPL model; outputs a `.pkl` with "3D pose and shape" per tracklet; the camera frame and parameter layout are not described on the page; no inference speed given (training took 8 A100 for 7 days); CPU/MPS not mentioned and setup targets CUDA [15]. Per-frame camera-frame mesh recovery, not world-grounded (my reading of the method name; UNVERIFIED).
31
+
32
+ **WHAM.** MIT code (LICENSE read); world-grounded output by default using SLAM (DPVO/DROID-SLAM) for camera motion; `--estimate_local_only` skips SLAM for camera-frame motion; SMPL registration required; no speed or hardware info on the page [16].
33
+
34
+ **GVHMR.** World-grounded recovery via gravity-view coordinates. The licence is a custom Zhejiang University one: "educational, research and non-profit purposes only", any modification must be open-source and non-commercial [17][18]. The network alone processes a 1,430-frame (~45 s) video in 280 ms on an RTX 4090, excluding tracking, 2D keypoints and visual odometry, which dominate real runtime [19]. `-s` skips visual odometry for static cameras [17], which suits terpsi's static-camera target. SMPL needed [23].
35
+
36
+ **TRAM.** MIT code, world-space 4D humans via masked DROID-SLAM + VIMO; install needs Python 3.10 conda, a compiled DROID-SLAM, Detectron2, SAM and DEVA; hardware and speed not listed; SMPL registration needed [20].
37
+
38
+ **SMPLer-X.** SMPL-X (body, hands, face) recovery; repo requires Python 3.8, PyTorch 1.12 with CUDA 11.3, mmcv-full 1.7.1; code licence not stated on the page; weights on SharePoint [21]. Effectively not usable in a plain modern env.
39
+
40
+ **MotionBERT.** Apache-2.0; input is 2D skeletons in H36M 17-joint format over up to 243 frames, output 3D pose (39.2 mm MPJPE on H36M-SH from scratch, 37.2 fine-tuned); weights 162 MB (61 MB Lite) hosted on OneDrive/Hugging Face; no speed given [22]. Could lift RTMPose/MediaPipe 2D to camera-frame 3D, but it needs a joint-mapping step and was trained on H36M, not dance (domain gap; my reasoning). Whether its output is root-relative camera-frame is UNVERIFIED.
41
+
42
+ **SMPL licence (applies to every SMPL-based row above).** Non-commercial scientific research, education or art only; no redistribution of the model; single-user licence; "cannot be used to train commercial AI or machine learning systems"; commercial licences via Meshcapade [23].
43
+
44
+ ### 1.2 Comparison
45
+
46
+ | Model | Landmarks | Dimensionality / frame | Code licence | Weights licence | Plain CPU / Apple Silicon | Speed evidence |
47
+ |---|---|---|---|---|---|---|
48
+ | MediaPipe Holistic | 553 (33+478+42) [1] | image 2.5D for all; metric 3D world for pose and hands only [1][2][3] | Apache-2.0 [66] | model card not read (UNVERIFIED) | Yes (pip, CPU) | ~40 fps M1 Max (in-house) |
49
+ | RTMW / DWPose | 133 [5][6] | 2D image (RTMW3D exists [5][6]) | Apache-2.0 [5][8] | not stated on pages read (UNVERIFIED) | Yes via onnxruntime; mps option listed [5] | RTMPose-m 90+ fps CPU, pose only [7]; RTMW unverified |
50
+ | Sapiens / Sapiens2 | 308 [9][12] | 2D | CC BY-NC [11] / Sapiens2 licence [13] | same | UNVERIFIED | no absolute numbers [9] |
51
+ | ViTPose+ | 133 for WholeBody (via rtmlib [5]) | 2D | Apache-2.0 [14] | not stated [14] | possible via rtmlib | chart only [14] |
52
+ | 4D-Humans (HMR2) | SMPL (24 joints + mesh) | per-frame camera frame (UNVERIFIED) | MIT [15] | not stated [15] | CUDA-oriented [15] | none [15] |
53
+ | WHAM | SMPL | world-grounded with SLAM [16] | MIT [16] | not stated [16] | UNVERIFIED | none [16] |
54
+ | GVHMR | SMPL | world-grounded, gravity-view [17] | custom non-commercial [18] | non-commercial (mirror claim, UNVERIFIED) | UNVERIFIED | 280 ms / 1,430 frames, 4090, network only [19] |
55
+ | TRAM | SMPL | world-space [20] | MIT [20] | third-party own licences [20] | heavy compile [20] | none [20] |
56
+ | SMPLer-X | SMPL-X (body, hands, face) | camera frame (UNVERIFIED) | not stated [21] | not stated [21] | CUDA 11.3 / Py3.8 [21] | none [21] |
57
+ | MotionBERT | 17 joints out | 3D lift from 2D [22] | Apache-2.0 [22] | not stated [22] | UNVERIFIED | none [22] |
58
+
59
+ ### 1.3 Ranking by landmark count and 3D-ness
60
+
61
+ By count: MediaPipe Holistic 553 (but only 75 of them, pose + hands, are metric 3D) > Sapiens 308 (2D) > RTMW/DWPose/ViTPose-WholeBody 133 (2D) > SMPL family 24 joints plus mesh (SMPL-X adds hands and face). By 3D-ness for dance: world-grounded SMPL (WHAM, GVHMR, TRAM) > camera-frame SMPL (4D-Humans, SMPLer-X) > MediaPipe hip-centred world pose and hands > 3D-lifted 2D (MotionBERT) > pure 2D. Only MediaPipe combines hands, face and metric body in one CPU-friendly call.
62
+
63
+ ### 1.4 Verdict
64
+
65
+ | Model | Verdict | Reason |
66
+ |---|---|---|
67
+ | MediaPipe HolisticLandmarker | depend | Already chosen; plain pip env; hands and face in one pass. |
68
+ | rtmlib (RTMW / DWPose) | wrap, as an optional extractor seam | Apache-2.0, small dependency set, 133 keypoints, cpu/mps; 2D only, so it adds robustness, not depth. |
69
+ | Sapiens2 / Sapiens | study | NC or restrictive licence, speed and platform unverified. |
70
+ | ViTPose+ | study | Same output as RTMW, heavier. |
71
+ | WHAM / TRAM | study (optional extra later) | MIT code but SMPL licence, SLAM install, CUDA bias; value is world trajectory and floor contact. |
72
+ | GVHMR | study | Best fit for static camera (`-s`) but custom non-commercial licence with copyleft-style modification clause. |
73
+ | 4D-Humans | study | Camera-frame only; SMPL licence. |
74
+ | MotionBERT | study (possible optional lifter) | Apache-2.0, but needs H36M joint mapping and dance-domain validation. |
75
+ | SMPLer-X | avoid | Pinned to Python 3.8 / CUDA 11.3. |
76
+
77
+ ## 2. Public dance datasets with music
78
+
79
+ ### 2.1 Summary table
80
+
81
+ | Dataset | Size | Provided | Licence / terms | Music redistributable? |
82
+ |---|---|---|---|---|
83
+ | AIST Dance Video Database | 13,939 videos, 10 street-dance genres, 60 music pieces [26]; 40 professional dancers, up to 9 cameras, 515 GB [25] | multi-view video, music | Academic research only, application form first, "unauthorized redistribution... prohibited", commercial use needs written consent from AIST; terms say nothing on music rights or faces [24] | Music described as copyright-cleared [25][26], but redistribution of any content is prohibited [24]; so no |
84
+ | AIST++ | 1,408 sequences, 5.2 h, 30 subjects, 10 genres, 9 views, ~10.1M images [28][29] | 3D keypoints, SMPL motion, 2D keypoints, cameras; videos and music NOT hosted, fetched from AIST site by script [27] | Annotations CC BY 4.0 (facts page) [28]; the download page itself states no annotation licence but requires agreeing to the AIST terms [27]; discrepancy noted | Music only via AIST under [24] |
85
+ | FineDance | 14.6 h, 346 paired songs/dances, 22 genres, 27 dancers, mocap [30][31] | SMPL-H motion, WAV music, features, labels; only 7.7 h public (Baidu) [30] | LICENSE file not read (UNVERIFIED) [30] | No statement on music rights [30]; treat as not redistributable (UNVERIFIED) |
86
+ | PopDanceSet | 263 videos, 180 pieces, 760 clips, ~12,819 s (~3.6 h), 19 genres [search result for 32]; built from Bilibili videos by popularity filter, 3D from HybrIK [32] | 3D joints and rotations, 2D keypoints, labels; no face or body-shape data [32] | Repo is MIT but dataset terms are in `docs/PopDanceSet_Description.md`, not read (UNVERIFIED) [33] | Paper says music is "publicly available"; no licence stated [32] |
87
+ | Motorica Dance Dataset | ~6 h mocap, 8 styles, 120 fps OptiTrack [34] | BVH, music with cleared rights; for some pop songs only extracted features (pkl) [34] | Free for research (academia, companies, individuals); commercial use incl. training commercial ML needs written consent; redistribution needs approval [34] | "All music audio has its own copyright holders and is not subject to this license"; cleared subset included, credit required [34] |
88
+ | PhantomDance | 260 pairs, 9.5 h, animator-made (not mocap) [35][36] | FBX-derived JSON at 30 fps, SMPL 24-joint, 16 kHz WAV [35] | Repo MIT; unclear whether this covers data [35] | Not described [35] |
89
+ | DanceCamera3D (DCM) | 108 sequences, 3.2 h, 4 genres, from the anime/MMD community [37] | dance motion, camera, music | Academic use only, signed EULA emailed to authors; follow original creators' rules [37] | Governed by upstream creators' rules [37] |
90
+ | EDGE | none of its own; trains on AIST++ [38] | code and checkpoint | Code MIT [38] | AIST terms apply |
91
+ | AIOZ-GDANCE | 16.7 h, 7 styles, 16 music genres, group dance from in-the-wild video [39] | WAV per sequence, SMPL poses and root translation (Hugging Face) [39] | "Software Copyright License for non-commercial scientific research" [39] | Music sourcing and rights not stated [39] |
92
+ | DD100 (Duolando) | ~117 min, duets, 10 ballroom-type genres [40] | dataset and code | NTU S-Lab 1.0 licence [40] | Music source not stated [40] |
93
+ | OpenDanceSet | >100 h, 14 genres, 147 subjects, from in-the-wild internet video [42] | 3D motion, music, 2D keypoints, trajectories, expert text [42] | Not found (UNVERIFIED) | Not stated |
94
+ | Dance Dance Convolution (StepMania) | Fraxtil: 90 songs by one author; second set from StepMania packs; hours and chart counts not found (UNVERIFIED) [41] | song audio plus step charts (rhythm-game choreography) | No licence found; repo gives build instructions from community packs rather than hosting [41] | Community packs; rights unclear |
95
+ | Let's Dance | ~1,000 YouTube videos, 10 styles, 10 s clips [44] | videos and pose coordinates, style labels only | not checked (UNVERIFIED) | not checked |
96
+ | UID (Illinois Dance) | 1,143 clips, 9 genres, ~30 h; 154 movement types over 16 body parts [43] | video, segment-level movement annotation | not checked (UNVERIFIED) | not checked |
97
+
98
+ Genre counts for FineDance (22) differ from some summaries (the brief mentioned 40); the repo states 22 [30].
99
+
100
+ ### 2.2 Observations
101
+
102
+ All the music-paired 3D datasets are research-only, and almost none grant redistribution rights for the music. Two release patterns are directly relevant to terpsi: AIST++ ships annotations and a download script, not media [27]; Motorica ships extracted audio features for songs it could not clear [34]. Both are precedents for the "landmarks plus features, no media" shape. Also relevant: PopDanceSet and OpenDanceSet were themselves built from web video [32][42], so the approach is accepted in peer-reviewed venues (CVPR 2024; CVPR 2026 oral per a search listing [42]), but this says nothing about their legal footing.
103
+
104
+ ### 2.3 Verdict
105
+
106
+ | Dataset | Verdict | Use for |
107
+ |---|---|---|
108
+ | AIST++ | complement | Calibrating and unit-testing the beat-alignment code against a reference protocol; baseline for "what good alignment looks like" (study music beats vs kinematic beats). Not corpus content. |
109
+ | Motorica | complement | Hands/finger-rich solo styles (popping, locking, tap, Charleston) with cleared music; useful as ground-truth mocap to evaluate MediaPipe landmark quality on the same styles (needs video, which it lacks, so only motion-statistics comparison). |
110
+ | FineDance | study | Fine-grained 3D with hands; partial release, licence unread. |
111
+ | PopDanceSet / OpenDanceSet | study | Closest methodological precedent for web-scraped corpora; read their data descriptions and licences before citing as precedent. |
112
+ | PhantomDance, DCM, DD100, AIOZ-GDANCE | avoid for now | Animator-made, anime-derived, duet, or group; wrong fit for single-dancer video. |
113
+ | DDC step charts | study | Only if terpsi later wants rhythm-game chart alignment; no evidence of dance-tutorial relevance. |
114
+ | UID, Let's Dance | study | Style and movement labels for evaluating a genre classifier; no step-name text. |
115
+
116
+ No dataset replaces scraping for the stated purpose (tutorial video with step names, subtitles, on-screen text); no such dataset turned up in two searches.
117
+
118
+ ## 3. Licence and terms-of-service notes (not legal advice)
119
+
120
+ **YouTube ToS.** The English terms state that users may not "access, reproduce, download, distribute, transmit, broadcast, display, sell, license, alter, modify" any part of the Service or Content unless expressly authorised by the Service or with prior written permission from YouTube and, where applicable, rights holders; and may not "access the Service using any automated means (such as robots, botnets or scrapers)", with an exception for public search engines following robots.txt or with YouTube's advance written approval [45]. These are contractual terms; whether and how they are enforced against research use is not addressed by the sources read.
121
+
122
+ **Creative Commons on YouTube.** YouTube's help page says CC BY lets others reuse the video under the CC BY terms, with credit (title, author, source URL, licence); creators can apply it only to content they can license, and not when the video has a Content ID claim; "Content already on YouTube isn't covered just because it's there"; YouTube cannot grant rights to content others own; for music it points to its Audio Library [46]. The search UI offers "Creative Commons" under Features and the filter returns CC-licensed videos without distinguishing the particular licence; one guide notes it sometimes returns wrong results, so each video's licence must be checked [49]. Videos uploaded after a switch (the Commons guide's filter example uses 2025-08-01) are CC BY 4.0, earlier ones CC BY 3.0 [47]. The URL parameter `sp=EgIwAQ%3D%3D` from the brief is not documented by any source found (UNVERIFIED); I could not confirm that it maps to the CC filter, and it is likely to be an internal, changeable encoding.
123
+
124
+ **yt-dlp `license`.** The YouTube extractor sets `info['license']` from the "License" row of the watch page metadata; its test cases show `'Creative Commons Attribution license (reuse allowed)'` and `'Standard YouTube License'` as values [48]. The Wikimedia Commons guide filters with `--match-filters "license=Creative Commons Attribution license (reuse allowed)"` and notes that a licence stated only in the description is not the metadata flag [47]. A reliable gate for terpsi is therefore this field, not the search filter.
125
+
126
+ **What CC BY permits, and the audio problem.** CC BY covers reuse with attribution; per YouTube it is valid only for what the uploader can license [46]. A dance tutorial that plays a commercial song under a CC BY flag is therefore a case where the uploader's grant probably does not reach the song (inference from [46]; the page's Content ID rule helps only when a claim exists). The extracted audio track remains a copy of whatever recording and composition are in it (inference). Motorica and AIST++ show two ways around it: features only [34], or media fetched by the user from the rights holder [27].
127
+
128
+ **Landmarks as derived data.** No source read states a legal status for pose keypoints. Two relevant points: (a) US guidance says individual steps are not copyrightable but a longer arrangement can be protected if it has sufficient choreographic authorship, on a continuum rather than a bright line [54][55]; a complete landmark time series of a routine encodes that arrangement, so "derived" does not obviously mean "free" (inference). (b) A NeurIPS 2025 position paper argues pose estimation should not be assumed privacy-preserving without measuring re-identification risk [56]; whether 478 face landmarks or hand shapes count as biometric data under GDPR art. 9 or BIPA was not answered by any source found (UNVERIFIED). Practical consequence, my suggestion: keep face landmarks optional and off by default in any shared export.
129
+
130
+ **EU text-and-data-mining exceptions (DSM Directive 2019/790).** Art. 2(1): a "research organisation" is a not-for-profit entity or one tasked by a Member State with a public-service research mission; commercial research institutes fall outside art. 3 [50]. Art. 3: research organisations and cultural-heritage institutions may mine content to which they have lawful access, may store copies securely and retain them for research including verification, and rightholders cannot opt out or override by contract [50]. Art. 4: any user, including commercial, may mine lawfully accessible content for any purpose unless the rightholder has reserved rights "in an appropriate manner" (machine-readable for online content; recital 18 includes terms of use) [50]. The primary text on EUR-Lex could not be fetched; the above is from a secondary summary (UNVERIFIED against the Directive text). Note the sources diverge on whether ToS text counts as an art. 4 reservation (recital 18 per [50]) and, for art. 3, no opt-out is possible.
131
+
132
+ **German case law.** Per secondary summaries, LG Hamburg (Kneschke v LAION, 310 O 227/23, 27 Sept 2024) held that copying images to build a training dataset was covered by the scientific-research exception (s. 60d UrhG), reading "scientific research" broadly; OLG Hamburg (5 U 104/24, 10 Dec 2025) upheld it for a non-commercial research association; one tracker lists a further appeal as possibly pending [51]. The case covered dataset creation only, not model training or outputs [51]. I did not read the judgments.
133
+
134
+ **US.** The district court in Authors Guild v Google noted Google Books transformed book text into data for research including data mining; the Second Circuit affirmed fair use of the scanning and search project [52] (the data-mining remark is the district court's, per the search summary; verify against the opinion). The US Copyright Office's May 2025 pre-publication report treats AI-training fair use as case by case, with academic research training described as more likely fair, expressive commercial uses less; it is non-binding and its status was contested after the Register's dismissal [53]. Fair-use analysis does not by itself address breach of the ToS [45] (my reading, not a cited claim).
135
+
136
+ **Precedent for releasing derived data.** YouTube-8M ships video IDs plus precomputed audio-visual features (IDs anonymised in a later release), under CC BY 4.0 for the dataset [57]. Whether that arrangement was reviewed for ToS compliance is not addressed (UNVERIFIED).
137
+
138
+ ## 4. Movement and music alignment measures
139
+
140
+ **AIST++ Beat Alignment Score.** Music beats B^y come from librosa; kinematic beats B^x are the local minima of the kinetic velocity; with m kinematic beats, `BeatAlign = (1/m) * sum_i exp( - min_j ||t_i^x - t_j^y||^2 / (2 sigma^2) )`, where sigma normalises for frame rate and is set to 3 because the sequences are 60 fps. The metric is deliberately one-directional: every kinematic beat should match a music beat, but a dancer need not hit every music beat. Calibration: upper bound is the real AIST++ data, lower bound is randomly paired data [29]. ESTIMATE: sigma = 3 frames at 60 fps is 50 ms, i.e. about 1.5 frames at 30 fps; rescale sigma in seconds, not frames, for typical YouTube frame rates. Bailando, per a search summary, reports BAS from the music-beat side (distance from each music beat to the nearest dance beat), a different direction from AIST++ (UNVERIFIED against the paper); do not compare numbers across papers without checking [60].
141
+
142
+ **Davis and Agrawala visual beats.** Optical flow F_t is computed per frame; flow vectors are binned by angle (N_bins) into a weighted "directogram" `D(n,k) = sum_{x,y} |F_n(x,y)| * 1[angle in bin k]`; a 3x3 median filter removes codec-repeated frames; per-direction change `DF(n,k) = D(n,k) - D(n-1,k)` is the analogue of spectral flux; the impact envelope sums the positive part, `u_v(n) = sum_k (DF(n,k) + |DF(n,k)|)/2`; the 99th percentile is clipped to the 98th to suppress shot-boundary spikes, and the envelope is normalised by its maximum; beats are then picked with the same peak algorithm as for audio onset envelopes. The motivating heuristic is "visible impact": sudden deceleration of a moving object [58]. A search summary reports that this flow-based approach fails with even minor camera motion (second-hand via [62], UNVERIFIED), which is why a static-camera filter matters for terpsi. Pose-space analogue: negative derivative of joint speed, which is close to the AIST++ kinematic beat.
143
+
144
+ **Pedersoli and Goto, dance beat tracking from visual information alone (ISMIR 2020).** Extracts (x, y) body keypoints per frame at 60 fps with OpenPose, feeds keypoint deltas to a temporal convolutional network that labels each frame beat or non-beat, and adds a periodicity-based loss term; on the AIST Dance DB the best F-measure was 61.20% with the dancer split, lower than audio beat tracking, with TCN better than bidirectional LSTM [59]. Useful as a learned alternative to hand-made kinematic beats and as a baseline for terpsi's own pose-derived beat detector.
145
+
146
+ **Music-to-dance generation metrics (FID_k, FID_g, Div / Dist).** FID is the Fréchet distance between Gaussians fitted to features of real and generated motion, `||mu_r - mu_g||^2 + Tr(S_r + S_g - 2 (S_r S_g)^(1/2))` (the standard FID definition, cited in [29]); AIST++ computes it on a 33-dimensional boolean geometric feature vector (FID_g) and a 72-dimensional kinetic feature vector (FID_k), both from fairmotion extractors; diversity (Dist_k, Dist_g in AIST++; Div_k, Div_g in Bailando) is the average pairwise Euclidean distance of those features across generated motions [29][60]. Reported caveats: scores depend on the AIST++ reference set, jittery motion can inflate diversity, and Bailando's FID_g (9.62) was better than the ground truth's (10.60) [60]. These are population metrics for generators; they are not meaningful per clip, but the same 72-D kinetic and 33-D geometric descriptors are reusable as per-clip features for a dance-similarity index (my suggestion).
147
+
148
+ **Laban effort features on skeletons.** No standard formula exists; papers converge on proxies: Weight from kinetic energy (squared joint velocity, weighted across body parts) [61]; Time from acceleration magnitude; Space as the ratio of windowed joint displacement or path length to net displacement (direct vs indirect); Flow as mean jerk magnitude [61]. Window length and joint weights are implementation choices that change results [61], so terpsi should store raw per-joint derivatives and compute effort features lazily with the window as a parameter.
149
+
150
+ **Tutorial video understanding and step names.** In two searches no benchmark pairing dance tutorial video with step names from on-screen text or speech was found. Related datasets label dance style (Let's Dance [44]) or movement segments (UID: 154 movement types over 16 body parts, with start and end marks on a subset [43]); the Bharatanatyam work annotates key postures with experts [search result, no separate ref]. A natural method, which no source here validates, is OCR on frames plus ASR on narration aligned to timestamps. This is the part of terpsi with the most novelty and the least prior art.
151
+
152
+ ## 5. Choosing the YouTube clips
153
+
154
+ Basis: reasoning from general knowledge plus the few tutorial-convention sources found; none of these queries was run, so what they return is UNVERIFIED. Conventions: K-pop tutorials commonly come as "(Slow + Mirrored + Counts)" with the channel mirroring the footage so viewers follow without mentally flipping sides [63][64]. The search results did not confirm front-facing static cameras or on-screen step labels on those channels [63][64], so those must be checked per clip. Hip hop breakdowns by a single named instructor are the most-cited beginner-friendly format in blog lists [65]; no source covered bachata footwork or salsa shines specifically [65].
155
+
156
+ Candidate queries (tempo ranges are ESTIMATES from general music knowledge, not from the sources):
157
+
158
+ 1. `ballet barre tendu degage fondu tutorial front view` (ballet, roughly 60-90 BPM for adagio-style barre music).
159
+ 2. `hip hop basic steps tutorial step names bounce rock groove` (roughly 85-100 BPM).
160
+ 3. `house dance tutorial jack skate loose legs step names` (roughly 120-128 BPM).
161
+ 4. `popping tutorial hit waves tutting breakdown mirrored` (roughly 90-120 BPM).
162
+ 5. `salsa shines tutorial solo footwork suzy q cumbia counts mirrored` (roughly 160-200 BPM).
163
+ 6. `bachata footwork solo tutorial basic step counts mirrored` (roughly 120-140 BPM).
164
+ 7. `kpop dance tutorial slow mirrored counts` (roughly 100-140 BPM; this title pattern is documented [63]).
165
+ 8. `afrobeats dance tutorial step by step names` (roughly 100-115 BPM).
166
+ 9. `tap dance shuffle ball change time step tutorial front view` (roughly 100-160 BPM).
167
+ 10. `solo charleston tutorial tacky annie fall off the log` plus `shuffle dance running man tutorial` and `contemporary dance floor work tutorial` as stress tests (Charleston/swing roughly 180-240 BPM; shuffle roughly 125-135 BPM; contemporary has no fixed tempo and often a moving camera).
168
+
169
+ Selection filters, my suggestions: add the "Creative Commons" UI filter or gate on the yt-dlp `license` field [46][48]; prefer videos under about 10 minutes; reject clips with camera motion or cuts (the visual-beat literature says camera motion breaks flow-based beat finding, second-hand); drop any clip where more than one person is full-body visible; record `mirrored` per clip (left/right labels in the landmarks are swapped relative to the dancer's own body when mirrored [63]); expect most commercial tutorial channels to be "Standard YouTube License", so a CC-only corpus will skew toward small channels and studios and should be checked for style coverage before relying on it.
170
+
171
+ ## REFERENCES
172
+
173
+ 1. [Holistic landmark detection guide, Google AI Edge (MediaPipe)](https://developers.google.com/edge/mediapipe/solutions/vision/holistic_landmarker)
174
+ 2. [MediaPipe Pose (legacy solution) documentation, GitHub](https://github.com/google-ai-edge/mediapipe/blob/master/docs/solutions/pose.md)
175
+ 3. [MediaPipe Hands (legacy solution) documentation, GitHub](https://github.com/google-ai-edge/mediapipe/blob/master/docs/solutions/hands.md)
176
+ 4. [Pose landmark detection guide, Google AI Edge](https://developers.google.com/edge/mediapipe/solutions/vision/pose_landmarker)
177
+ 5. [rtmlib, Tau-J, GitHub](https://github.com/Tau-J/rtmlib)
178
+ 6. [RTMW: Real-Time Multi-Person 2D and 3D Whole-body Pose Estimation, arXiv:2407.08634](https://arxiv.org/abs/2407.08634)
179
+ 7. [MMPose RTMPose project README (speed and RTMW tables)](https://github.com/open-mmlab/mmpose/tree/main/projects/rtmpose)
180
+ 8. [DWPose, IDEA-Research, GitHub](https://github.com/IDEA-Research/DWPose)
181
+ 9. [Sapiens, facebookresearch, GitHub](https://github.com/facebookresearch/sapiens)
182
+ 10. [facebook/sapiens-pose-0.3b-torchscript model card, Hugging Face](https://huggingface.co/facebook/sapiens-pose-0.3b-torchscript)
183
+ 11. [Sapiens LICENSE (CC BY-NC 4.0), GitHub](https://raw.githubusercontent.com/facebookresearch/sapiens/main/LICENSE)
184
+ 12. [Sapiens2, facebookresearch, GitHub](https://github.com/facebookresearch/sapiens2)
185
+ 13. [Sapiens2 LICENSE.md, GitHub](https://raw.githubusercontent.com/facebookresearch/sapiens2/main/LICENSE.md)
186
+ 14. [ViTPose, ViTAE-Transformer, GitHub](https://github.com/ViTAE-Transformer/ViTPose)
187
+ 15. [4D-Humans, shubham-goel, GitHub](https://github.com/shubham-goel/4D-Humans)
188
+ 16. [WHAM, yohanshin, GitHub (MIT LICENSE: raw.githubusercontent.com/yohanshin/WHAM/main/LICENSE)](https://github.com/yohanshin/WHAM)
189
+ 17. [GVHMR, zju3dv, GitHub](https://github.com/zju3dv/GVHMR)
190
+ 18. [GVHMR LICENSE, GitHub](https://raw.githubusercontent.com/zju3dv/GVHMR/main/LICENSE)
191
+ 19. [GVHMR project page (runtime figures)](https://zju3dv.github.io/gvhmr/)
192
+ 20. [TRAM, yufu-wang, GitHub](https://github.com/yufu-wang/tram)
193
+ 21. [SMPLer-X, wqyin, GitHub](https://github.com/wqyin/SMPLer-X)
194
+ 22. [MotionBERT, Walter0807, GitHub](https://github.com/Walter0807/MotionBERT)
195
+ 23. [SMPL model licence, Max Planck Institute](https://smpl.is.tue.mpg.de/modellicense.html)
196
+ 24. [AIST Dance Video Database: Terms of Use](https://aistdancedb.ongaaccel.jp/terms_of_use/)
197
+ 25. [AIST Dance Video Database home page](https://aistdancedb.ongaaccel.jp/)
198
+ 26. [Tsuchida S, Fukayama S, Hamasaki M, Goto M. AIST Dance Video Database, ISMIR 2019](https://archives.ismir.net/ismir2019/paper/000060.pdf)
199
+ 27. [AIST++ download page](https://google.github.io/aistplusplus_dataset/download.html)
200
+ 28. [AIST++ facts and figures](https://google.github.io/aistplusplus_dataset/factsfigures.html)
201
+ 29. [Li R et al. AI Choreographer: Music Conditioned 3D Dance Generation with AIST++, arXiv:2101.08779](https://arxiv.org/abs/2101.08779)
202
+ 30. [FineDance, THUSIGSICLAB, GitHub](https://github.com/THUSIGSICLAB/FineDance)
203
+ 31. [Li R et al. FineDance, arXiv:2212.03741 (ICCV 2023)](https://arxiv.org/abs/2212.03741)
204
+ 32. [Luo Z, Ren M et al. POPDG: Popular 3D Dance Generation with PopDanceSet, arXiv:2405.03178](https://arxiv.org/abs/2405.03178)
205
+ 33. [POPDG, Luke-Luo1, GitHub](https://github.com/Luke-Luo1/POPDG)
206
+ 34. [Motorica Dance Dataset, GitHub](https://github.com/simonalexanderson/MotoricaDanceDataset)
207
+ 35. [PhantomDanceDataset, libuyu, GitHub](https://github.com/libuyu/PhantomDanceDataset)
208
+ 36. [DanceFormer: Music Conditioned 3D Dance Generation with Parametric Motion Transformer, arXiv:2103.10206](https://arxiv.org/abs/2103.10206)
209
+ 37. [DanceCamera3D-Official, Carmenw1203, GitHub](https://github.com/Carmenw1203/DanceCamera3D-Official)
210
+ 38. [EDGE, Stanford-TML, GitHub](https://github.com/Stanford-TML/EDGE)
211
+ 39. [AIOZ-GDANCE, aioz-ai, GitHub](https://github.com/aioz-ai/AIOZ-GDANCE)
212
+ 40. [Duolando project page (DD100)](https://lisiyao21.github.io/projects/Duolando/)
213
+ 41. [Donahue C, Lipton Z, McAuley J. Dance Dance Convolution, arXiv:1703.06891](https://arxiv.org/abs/1703.06891) and [chrisdonahue/ddc, GitHub](https://github.com/chrisdonahue/ddc)
214
+ 42. [OpenDance: Multimodal Controllable 3D Dance Generation with Large-scale Internet Data, arXiv:2506.07565](https://arxiv.org/abs/2506.07565)
215
+ 43. [Hu et al. Unsupervised 3D Pose Estimation for Hierarchical Dance Video Recognition, ICCV 2021](https://openaccess.thecvf.com/content/ICCV2021/papers/Hu_Unsupervised_3D_Pose_Estimation_for_Hierarchical_Dance_Video_Recognition_ICCV_2021_paper.pdf)
216
+ 44. [Castro D et al. Let's Dance: Learning From Online Dance Videos, arXiv:1801.07388](https://arxiv.org/abs/1801.07388)
217
+ 45. [YouTube Terms of Service (English)](https://www.youtube.com/static?template=terms&gl=US&hl=en)
218
+ 46. [Creative Commons licences on YouTube, YouTube Help](https://support.google.com/youtube/answer/2797468)
219
+ 47. [Commons:YouTube files/Downloading, Wikimedia Commons](https://commons.wikimedia.org/wiki/Commons:YouTube_files/Downloading)
220
+ 48. [yt-dlp YouTube extractor source (`_video.py`)](https://github.com/yt-dlp/yt-dlp/blob/master/yt_dlp/extractor/youtube/_video.py)
221
+ 49. [Audiovisual content and the YouTube Creative Commons filter, Texas State University Libraries](https://guides.library.txstate.edu/toolsforoer/audiovisualcontent)
222
+ 50. [The New Copyright Directive: Text and Data Mining (Articles 3 and 4), Kluwer Copyright Blog](https://legalblogs.wolterskluwer.com/copyright-blog/the-new-copyright-directive-text-and-data-mining-articles-3-and-4/)
223
+ 51. [LG Hamburg, Kneschke v LAION e.V. (summary), Lausen](https://lausen.com/en/lg-hamburg-kneschke-v-laion-e-v/) and [Hogan Lovells AI case tracker, decision 2](https://digital-client-solutions.hoganlovells.com/resources/ai-litigation-case-law-tracker/case/robert-kneschke-vs-laion-e-v/decision/2)
224
+ 52. [Authors Guild v. Google, 804 F.3d 202 (2d Cir. 2015), US Copyright Office fair use summary](https://www.copyright.gov/fair-use/summaries/authorsguild-google-2dcir2015.pdf)
225
+ 53. [Copyright Office Weighs In on AI Training and Fair Use, Skadden](https://www.skadden.com/insights/publications/2025/05/copyright-office-report)
226
+ 54. [Circular 52: Copyright Registration of Choreography and Pantomime, US Copyright Office](https://www.copyright.gov/circs/circ52.pdf)
227
+ 55. [Ninth Circuit Waltzes with Choreographic Works (Hanagami v. Epic Games), Finnegan](https://www.finnegan.com/en/insights/blogs/incontestable/ninth-circuit-waltzes-with-choreographic-works.html)
228
+ 56. [Don't call it privacy-preserving or human-centric pose estimation if you don't measure privacy, NeurIPS 2025](https://nips.cc/virtual/2025/poster/121920)
229
+ 57. [YouTube-8M download page, Google Research](https://research.google.com/youtube8m/download.html)
230
+ 58. [Davis A, Agrawala M. Visual Rhythm and Beat, ACM TOG 37(4), 2018 (author PDF)](https://www.abedavis.com/files/papers/VisualRhythm_Davis18.pdf)
231
+ 59. [Pedersoli F, Goto M. Dance Beat Tracking from Visual Information Alone, ISMIR 2020](https://program.ismir2020.net/static/final_papers/144.pdf)
232
+ 60. [Siyao L et al. Bailando: 3D Dance Generation by Actor-Critic GPT with Choreographic Memory, CVPR 2022](https://openaccess.thecvf.com/content/CVPR2022/papers/Siyao_Bailando_3D_Dance_Generation_by_Actor-Critic_GPT_With_Choreographic_Memory_CVPR_2022_paper.pdf)
233
+ 61. [Proceedings of eNTERFACE 2015 Workshop (Laban effort from skeletons), arXiv:1801.06349](https://arxiv.org/abs/1801.06349) and [Dance Style Recognition Using Laban Movement Analysis, arXiv:2504.21166](https://arxiv.org/abs/2504.21166)
234
+ 62. [Long-Term Rhythmic Video Soundtracker, arXiv:2305.01319 (critique of flow-based visual beats, seen only via search summary)](https://arxiv.org/abs/2305.01319)
235
+ 63. [K-Pop Mirrored Dance: How to use videos effectively, Udansa](https://udansa.com/en/dance-guide/k-pop/learn-kpop-dance/kpop-mirrored-dance-guide) and [LISA "ROCKSTAR" Dance Tutorial (Slow + Mirrored + Counts), YouTube](https://www.youtube.com/watch?v=oXs6aYT4zRE) and [Dance mirror, K-Crush](https://k-crush.com/dance-mirror/)
236
+ 64. [Henry Dance Tutorials, YouTube](https://www.youtube.com/@henrydancetutorialsofficial/videos)
237
+ 65. [Best Dance Tutorial Videos, City Academy](https://www.city-academy.com/news/best-dance-tutorial-videos/)
238
+ 66. [MediaPipe LICENSE (Apache-2.0), GitHub](https://github.com/google-ai-edge/mediapipe/blob/master/LICENSE)