Run 2026-10-26_231334, chakra f72b136, public variant
- Strikes: Flow shows the right chakra for 21 of 28 strikes (75 % [57, 81]), Strike for 22 of 28 (79 % [71, 81]); 2 recordings (YouTube only).
- Latency from the onset to the right colour, median: Flow 0.25 s [0.22, 0.28] (n = 9), Strike 0.10 s [0.05, 0.73] (n = 10).
- The owner's own rounds (seven bowls struck root to crown, 6 recordings, shown here as numbers only): Flow 40 of 42, Strike 41 of 42 strikes right.
- AI gate (mn05, 79 Commons clips): sounds that should colour keep 63 % [49, 76] without AI, 53 % [39, 66] pretrained, 50 % [36, 63] with the trained head; sounds that should not colour drop from 25 % [15, 36] to 7 % [2, 12] and 4 % [1, 10] (n = 30 and 49).
- Light in real sessions (10 YouTube sessions): Flow 7.3 [4.2, 8.4] colour changes a minute, Strike 14.5 [11.3, 22.5]; recordings with more than three changes in any second: Flow 0, Strike 2.
Every number carries its n. Intervals are 95 % percentile bootstrap intervals over recordings (10000 draws, seed 26102026): recordings, not strikes or windows, are the independent unit.
| Set | Recordings | Hours | What | Data list hash |
|---|---|---|---|---|
| Wikimedia Commons clips | 79 | 0.82 | free licences, 8 classes (fetch_clips.py) | b89c100897ac |
| YouTube videos | 24 | 4.49 | tune-ups, sessions on the body, concerts; not redistributed | 5d0a01aee0ea |
| Own recordings | 20 | 0.61 | the owner's rounds and sessions; private, counted only | 957e45784bd5 |
Left out as duplicates: CPlC2404Ils (the same audio as u1KjQTAHSlo under another channel, shifted by 1.7 s). Commons clips are single recordings of one instrument, not sessions; the YouTube and own sessions are the nearest thing to a room.
Data cleaning: 17 entries of the Commons source lists are recordings of someone saying the word ('shaker', 'gong', 'maraca': Lingua Libre and Wiktionary pronunciations), not the instrument; they are left out (fetch_clips.PRONUNCIATION). Up to 25 October 2026, 12 such files were counted among the benchmark's 91 clips (11 as shakers, 1 as a gong).
- Detector: the app's own C code (
chakra_detect.cthroughtests/analyse_wav.c, built into the run folder), notes at A = 440 Hz, sensitivity 8. Flow locks a tone after 384 ms and switches after 1500 ms; Strike after 128 and 256 ms. Both have the strike path (spectral flux) that lets a new bowl take over a louder ringing one. - Onsets (reference, independent of the detector's decisions): peaks of the rectified log-magnitude spectral flux, 60 to 4000 Hz, 16 ms hops, corrected by 42 ms so a synthetic strike is found within 10 ms.
- A strike is right when its chakra is shown at some time from 0.1 s before the onset until the next strike or 3 s, whichever comes first. First colour right: the first colour that starts in that window is the right one. Latency: from the onset to the start of the right colour; a strike whose colour already showed (the same bowl again) counts for accuracy, not for latency.
- Colour share: the share of the sounding time (RMS above 3 % of the loudest 0.1 s) with any colour. The gate comparison uses gate_bench.py's own time base: the first 30 s of each clip.
- Light: colour changes a minute (a new chakra, or colour to dark), the share of colours that stand under 3 s, and the most changes in any 1 s window against the photosensitivity guidance of at most three flashes a second (light_timeline.py).
- AI gate: EfficientAT mn05 on 2 s windows; pretrained = the best bowl-like AudioSet class beats the best other class; trained = a logistic head on the embedding, 5-fold by clip (a clip is never in its own training).
| Source | Chakra from | Strike time from | Reliability |
|---|---|---|---|
| Own rounds, hand-marked | a person marked each strike and its bowl (frames, or flux onsets checked against a contact sheet) | the flux onset found by the order alignment, when it lies within 1.6 s of the mark | chakra high; time high where the marks were checked (see validation) |
| Own rounds, derived | the seven bowls are struck root to crown (the owner's set, tuned C3 to B3) | onsets aligned to that order by dynamic programming: each bowl takes the onset where its fundamental gained most new energy | chakra high; time medium, validated on the round with checked marks |
| YouTube, chapters (-ar9vsmFhJU) | the player's chapter list, root to crown, 'each bowl is struck 3 times' | the 3 strongest onsets of each chapter, at least 4 s apart | chakra high; time medium |
| YouTube, announced (u1KjQTAHSlo) | automatic captions: the seller names each bowl's chakra and note | the strongest onset after the sentence and before the next one | chakra high; time medium |
| YouTube, crystal chapters (8Qhh2VF1Oz4) | chapter numbers read as chakra numbers, as the description says | none (bowls rung on): only the share of chapter time with the intended colour | medium |
Validation of the derived strike times: the order alignment, run without the marks, against the hand marks of the two marked rounds.
| Round | Strikes | Median offset | Largest | Within 0.1 s | Marks from |
|---|---|---|---|---|---|
| own round 1 | 7 | 1.12 s | 1.53 s | 0 of 7 | marks from 1 fps frames |
| own round 2 | 7 | 0.03 s | 0.04 s | 7 of 7 | checked marks |
Where the marks were checked against the flux, the alignment finds the same strikes within a few hundredths of a second; where they came from video frames at one a second, the frames lag the sound by up to 1.5 s, so those marks give the bowl but not the time.
| Ground truth | Mode | Recordings | Strikes | Right | Accuracy [95 % CI] | First colour right | Latency, median [95 % CI] |
|---|---|---|---|---|---|---|---|
| YouTube, chapters (3 strikes a bowl) | Flow | 1 | 21 | 17 of 21 | 81 % | 81 % | 0.22 s (n = 5) |
| YouTube, chapters (3 strikes a bowl) | Strike | 1 | 21 | 17 of 21 | 81 % | 76 % | 0.05 s (n = 5) |
| YouTube, spoken announcements | Flow | 1 | 7 | 4 of 7 | 57 % | 57 % | 0.28 s (n = 4) |
| YouTube, spoken announcements | Strike | 1 | 7 | 5 of 7 | 71 % | 57 % | 0.73 s (n = 5) |
| Own rounds, hand-marked strikes | Flow | 2 | 14 | 14 of 14 | 100 % [100, 100] | 100 % [100, 100] | 0.29 s [0.28, 0.30] (n = 14) |
| Own rounds, hand-marked strikes | Strike | 2 | 14 | 14 of 14 | 100 % [100, 100] | 100 % [100, 100] | 0.00 s [0.00, 0.01] (n = 13) |
| Own rounds, derived strike times | Flow | 4 | 28 | 26 of 28 | 93 % [86, 100] | 93 % [86, 100] | 0.29 s [0.29, 0.31] (n = 25) |
| Own rounds, derived strike times | Strike | 4 | 28 | 27 of 28 | 96 % [89, 100] | 96 % [89, 100] | 0.02 s [0.00, 0.05] (n = 26) |
Own rounds with derived times: 5 of 28 strikes are flagged uncertain (their bowl gained under 10 % of the new energy). Without them, Flow 96 % [88, 100], Strike 96 % [88, 100].
Share of strikes that show the right chakra, Flow and Strike. Filled marks and thick lines: 95 % bootstrap interval over recordings; hollow marks and thin lines: a group of one recording, Wilson interval over its strikes (YouTube; the own rounds are in the table).
Each point is one strike whose colour changed to the right chakra; the bar is the median with its 95 % bootstrap interval over recordings.
Time with the intended colour in the YouTube tune-ups, mean over their chapters or announced bowls:
| Video | Truth | Segments | Flow | Strike |
|---|---|---|---|---|
| -ar9vsmFhJU | chapters | 7 | 80 % | 81 % |
| u1KjQTAHSlo | announced | 7 | 60 % | 56 % |
| 8Qhh2VF1Oz4 | chapters sustained | 5 | 87 % | 79 % |
-ar9vsmFhJU's root bowl rings at G#3 (208 Hz): by note the app calls it Throat, so the root chapter scores near zero by design. The app's answer is to learn your bowls (Settings, mapping 'your bowls').
| Sound | Recordings | Should colour | Flow, colour share | Strike, colour share |
|---|---|---|---|---|
| Singing bowl | 10 | yes | 93 % [87, 98] | 98 % [94, 99] |
| Bell | 18 | yes | 45 % [27, 63] | 87 % [82, 92] |
| Tuning fork | 2 | yes | 91 % [87, 95] | 95 % [93, 97] |
| Gong | 11 | no | 58 % [36, 78] | 94 % [89, 97] |
| Voice | 5 | no | 47 % [24, 72] | 81 % [68, 95] |
| Drum | 20 | no | 14 % [3, 28] | 46 % [28, 64] |
| Shaker | 9 | no | 0 % [0, 0] | 49 % [23, 73] |
| Rain stick | 4 | no | 3 % [0, 8] | 13 % [0, 38] |
Mean share of the sounding time with any colour, whole recordings, 95 % bootstrap interval over recordings.
| Sound | Recordings | Should colour | No AI | AI, pretrained | AI, trained head |
|---|---|---|---|---|---|
| Singing bowl | 10 | yes | 92 % [85, 97] | 86 % [79, 91] | 86 % [80, 91] |
| Bell | 18 | yes | 43 % [26, 61] | 32 % [17, 49] | 28 % [13, 45] |
| Tuning fork | 2 | yes | 93 % [89, 96] | 72 % [54, 89] | 61 % [54, 68] |
| Gong | 11 | no | 66 % [44, 84] | 24 % [7, 44] | 18 % [1, 36] |
| Voice | 5 | no | 48 % [25, 72] | 9 % [0, 23] | 3 % [0, 9] |
| Drum | 20 | no | 14 % [2, 28] | 1 % [0, 2] | 1 % [0, 2] |
| Shaker | 9 | no | 0 % [0, 0] | 0 % [0, 0] | 0 % [0, 0] |
| Rain stick | 4 | no | 0 % [0, 0] | 0 % [0, 0] | 0 % [0, 0] |
gate_bench.py, mn05_as@2s, 79 clips; the trained head gets 85 % of windows right on clips it never saw; 43 ms a window on the Mac's CPU.
Share of sounding time with a colour per class: no AI, the pretrained gate and the trained head.
The owner's recordings, segments a person checked (2 s labels), gate trained with them in the folds:
| Segments | Recordings | No AI | AI, pretrained | AI, trained head |
|---|---|---|---|---|
| Own segments, bowl or bell (should colour) | 10 | 71 % [55, 86] | 43 % [24, 63] | 65 % [49, 79] |
| Own segments, other sounds (should not) | 3 | 10 % [0, 21] | 0 % [0, 0] | 7 % [0, 21] |
| Measure | Flow | Strike |
|---|---|---|
| Strikes right (YouTube) | 75 % [57, 81] | 79 % [71, 81] |
| First colour right | 75 % [57, 81] | 71 % [57, 76] |
| Latency, median | 0.25 s [0.22, 0.28] | 0.10 s [0.05, 0.73] |
| Singing bowls, colour share | 93 % [87, 98] | 98 % [94, 99] |
| Gongs, colour share | 58 % [36, 78] | 94 % [89, 97] |
| Sessions, changes a minute | 7.3 [4.2, 8.4] | 14.5 [11.3, 22.5] |
| Concerts, changes a minute | 10.0 [5.3, 16.2] | 16.8 [11.5, 24.6] |
| Sessions, colours under 3 s | 32 % [26, 38] | 58 % [49, 63] |
| Recordings | Mode | n | Colours | Changes a minute, median | Colours under 3 s, median | Over 3 changes in 1 s | Most changes in 1 s |
|---|---|---|---|---|---|---|---|
| Commons, bowl-like sounds | Flow | 30 | 49 | 3.8 [2.4, 5.8] | 0 % [0, 0] | 0 of 30 | 2 |
| Commons, bowl-like sounds | Strike | 30 | 144 | 11.2 [6.7, 18.3] | 50 % [0, 67] | 0 of 30 | 3 |
| Commons, other sounds | Flow | 49 | 126 | 0.0 [0.0, 2.7] | 50 % [0, 80] | 0 of 49 | 2 |
| Commons, other sounds | Strike | 49 | 490 | 13.4 [9.5, 23.3] | 78 % [67, 100] | 1 of 49 | 4 |
| YouTube tune-ups | Flow | 5 | 107 | 5.5 [1.6, 7.3] | 30 % [16, 53] | 0 of 5 | 2 |
| YouTube tune-ups | Strike | 5 | 275 | 13.5 [2.2, 15.4] | 44 % [31, 68] | 0 of 5 | 3 |
| YouTube sessions on the body | Flow | 10 | 362 | 7.3 [4.2, 8.4] | 32 % [26, 38] | 0 of 10 | 3 |
| YouTube sessions on the body | Strike | 10 | 1472 | 14.5 [11.3, 22.5] | 58 % [49, 63] | 2 of 10 | 4 |
| YouTube concerts | Flow | 9 | 654 | 10.0 [5.3, 16.2] | 42 % [34, 49] | 0 of 9 | 3 |
| YouTube concerts | Strike | 9 | 1687 | 16.8 [11.5, 24.6] | 62 % [52, 70] | 1 of 9 | 4 |
| Own rounds, derived strike times | Flow | 6 | 49 | 9.4 [7.0, 16.1] | 83 % [75, 94] | 0 of 6 | 2 |
| Own rounds, derived strike times | Strike | 6 | 82 | 15.1 [11.4, 26.6] | 78 % [66, 89] | 0 of 6 | 2 |
| Own sessions | Flow | 14 | 117 | 6.3 [2.4, 13.4] | 45 % [22, 71] | 0 of 14 | 3 |
| Own sessions | Strike | 14 | 252 | 13.2 [7.9, 27.3] | 71 % [62, 83] | 0 of 14 | 3 |
Colour changes a minute per group of recordings, Flow and Strike: median and 95 % bootstrap interval over recordings.
Share of colours that stand under 3 s (median over recordings).
- Small n. The strike results rest on 2 recordings; with so few, a bootstrap interval over recordings is coarse and can collapse to a point when every recording scores the same. Wilson intervals over strikes are in report.json; they assume independent strikes, which they are not.
- Commons clips are not sessions. They are short recordings of one instrument, often close up; a room with several bowls, voices and a gong at once is harder. The YouTube sessions and concerts have no ground truth and serve only the light measures.
- Labels by one person. The own segment labels, the strike marks and the check of the derived times were made by one person; nobody measured agreement between two.
- Teacher-labelled data. Unchecked labels of the own videos were proposed by an AudioSet model (EfficientAT dymn04); the gate's trained head uses only checked segments, but its pretrained teacher shaped what was checked. The YouTube chakra labels are what the players say their bowls are, not measured pitches.
- One set of own bowls, one room. All own rounds use the same seven bowls; another set, mallet or room may behave differently.
- Latency resolution. The detector prints its colour changes to 0.1 s, and the reference onset is the peak of the spectral flux, which for a soft felt mallet comes some tens of milliseconds after the attack begins. Latencies are good to about 0.1 s; a Strike latency near zero means 'within a hop or two of the flux peak', not 'before the sound'.
- Not the board. The detector runs on the Mac from audio files; the ESP32-S31's microphone, its gain and its timing are not measured here, and the lamps add their own delay.
- chakra (ChakraA) commit
f72b136261c3(README: flash safety comes from the rate (one kick per 2 s), not the small step; no WCAG compliance claimed (approach review 26.10.2026)), 4 uncommitted paths at the start (diff hash066687eb334a) - chakrav commit
974e38deb6ea - stages continued later (--run latest --from report --force), last at chakra commit
6b34ca80a093 - config hash
c473ec5e2c85; detector sources hasha228ecec939b; data hash7b96ad157000 - tools: Python 3.14.9, numpy 2.5.4, torch 2.14.1, ffmpeg version 9.0.2 Copyright (c) 2000-2026 the FFmpeg developers
- command:
tools/bench/pipeline.py(stages fetch, own, detect, strikes, gate, light, report);--run latest --from report --forceredraws only the report.
YouTube (watched for evaluation only, nothing redistributed): -ar9vsmFhJU (templesounds); u1KjQTAHSlo (RANA SINGING BOWL CENTRE); ePKXtFLYnUs (templesounds); 8Qhh2VF1Oz4 (templesounds); _RijJiX5rng (templesounds); rVbdnUhjQhM; U4ximZISXWo; l1026mXyQoI; PVNlmgsTbl0; HMClRBBC6iY; Tu3fBhpCusM; MDh00cYlmGk; WG9WGk55PG8; eXxitYpgNF0; IWPwzGgTmhc; BJKqpdvGiGc; vzMMYYI0K2k; VjJrvQCsc7o; tB1fvqGagFM; oh0FUveHOBI; chGb_m3wdZo; pqEG48dS6pw; 0sM7ggc3geU; 5EalbAG0lP8.
Wikimedia Commons: 79 clips under free licences, listed with title, page, licence and author in commons_sources.csv beside this report.
| Recording | Mode | Right | Strikes in order (+ right, x wrong) |
|---|---|---|---|
| -ar9vsmFhJU | Flow | 17 of 21 | xRoot xRoot xRoot +Sacr +Sacr +Sacr xSola +Sola +Sola +Hear +Hear +Hear +Thro +Thro +Thro +Thir +Thir +Thir +Crow +Crow +Crow |
| -ar9vsmFhJU | Strike | 17 of 21 | xRoot xRoot xRoot +Sacr +Sacr +Sacr xSola +Sola +Sola +Hear +Hear +Hear +Thro +Thro +Thro +Thir +Thir +Thir +Crow +Crow +Crow |
| u1KjQTAHSlo | Flow | 4 of 7 | +Crow +Thir xThro +Hear xSola +Sacr xRoot |
| u1KjQTAHSlo | Strike | 5 of 7 | +Crow +Thir xThro +Hear +Sola +Sacr xRoot |