ESP32-S3 Bench Guide
ESP32‑S3 N16R8 벤치 가이드: 실시간 핀아웃, 강의, 시뮬레이터 및 벤치 로그
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기메이커가 쓴 소개는 위의 한 줄이 전부입니다. 더 자세한 내용은 저장소 README에서 읽을 수 있습니다. 저장소 README ↗
README 전체를 불러오는 중입니다.
README 전문 보기 ↗Open the online app and choose Expand Your Vocal Variety from the menu, or use
/#vocal-variety. It trains vocal variety plus structure: every round is a spoken
answer to a real question using PREP (Point, Reason, Example, Final Point), while the
game shows the speaker's voice live.
Seven games, all open from the start, grouped by what they train:
| Game | What it trains |
|---|---|
| Volume: Loud & Soft | Guided ribbon. Boom the Point, whisper into the Example, land the Final Point strong. |
| Volume: Freestyle | Reach Whisper and Boom and swing between zones, your own way. |
| Pitch: High & Low | Guided ribbon. Lift the Point, paint the Example low then high, let the Final Point fall. |
| Pitch: Freestyle | Reach Low and High and swing between them. |
| Pace: Fast, Slow & Pause | Guided ribbon in words a minute: Slow for the Point, Fast for the Example, then pause and slow down. |
| Pace: Freestyle | Reach Slow and Fast and swing between them. |
| All Three: Full Vocal Variety | Swings in volume, pitch and pace in one answer, on three live lanes. |
Pace is counted in words a minute, the same for every speaker: Slow is under 110, Steady is 110 to 139, Fast is 140 or more (pauses count as slowing down; the ribbon aims at 100, 125 and 150). Common published figures put conversation at roughly 120 to 150 and presentations at roughly 100 to 160, so 140 is an ordinary quick pace, not a strain. How the number is made steadier over a call: clips overlap by 0.8 seconds and each stretch of speech is counted from one clip only, so a word at a join is neither cut nor counted twice. The reading looks at about 8 seconds, and a long thinking pause counts for little more than an ordinary gap (a really slow speaker still reads slow). Words the speech service invents from silence or noise (it reports its own confidence, and "thank you" over almost no sound is a known invention) are removed on the server, and stretched or looping words are dropped in the browser. A failed clip is retried once, an expired sign-in is refreshed, and only a real refusal (404, 405, 501, a login that stays invalid, or four clips in a row failing) ends pace counting. A line under the pace reading says what is happening: how many words have been heard, or that the service is slow, or that no words have been heard (is the student unmuted, and is the Meet tab the shared one?).
Words are counted from the speech itself: a few seconds of audio at a time go to
/api/transcribe (Whisper, the same service the AI feedback uses), which returns the words
with their times. Readings appear a few seconds late on screen but are filed at the moment
the words were spoken, so scoring is exact. If the service cannot be reached, pace falls back
to an estimate from the sound alone (peaks in the vowel energy, wpmFromSound, fitted to
recordings of known speed) and the results say so. Measured against recordings from 60 to
320 WPM, the sound-only estimate separates Slow, Steady and Fast only roughly, which is why
words are counted whenever the service is available.
A round:
Nobody is tuned. There is no "whisper, then shout" step. The zones follow whoever is speaking: the sound check sets the speaker's typical loudness (Whisper is more than about 6 dB under it, Boom more than about 5 dB over it) and natural note (six semitones either way reaches High and Low), the loudness carries on from one student to the next, and pace is absolute words a minute. This also covers microphones that are louder or quieter than usual and the levelling a video call applies.
Pick Analogy Blitz ("A battery is like a jacuzzi, because…"), Hot Take (agree or disagree, and why), Sell It (pitch a strange product) or Wild Mix (all three). Choose 2 to 5 seconds a prompt and 5 to 20 prompts. All modes are open from the start. Hot Take (Toastmasters Table Topics style: pick a side, then Point, Reason, Example, Point) and Sell It (the classic "sell me this pen" test: who needs it, the problem it solves, a feature and its benefit, then ask for the sale) give 30 seconds a prompt, with a few seconds allowed for reading before the speed points start to fall; only Analogy Blitz uses the 2 to 5 second choice. Back goes one step: from a round or the results to the Think Fast menu, and only from the menu to Home. A 3-2-1 countdown, then each prompt shows a draining ring; start talking at once.
Hear me (a switch in Settings under Microphone, on by default; the games have no listening controls of their own) listens through the microphone, or through the meeting audio when that is on, and times how long it takes to start speaking. It learns the room's quiet during the countdown, so nobody is tuned or asked to shout. Each prompt scores up to 100: up to 80 for a fast start (full marks within 0.6 s, falling to 25 at the buzzer) and up to 20 for talking through the rest of the time. Answer 35 points or more to keep a combo going; the session score is the average, with stars at 35, 65 and 85. XP builds ranks (Rookie, Sprinter, Quick Draw, Lightning, Thunder, Mind Reader) and eight badges. Without a microphone it is a practice run: the prompts and timer only, no scores.
Sounds are skipped in meeting mode (they would be heard as answers). Nothing is recorded or uploaded. Progress is
kept in this browser (sg-think-fast-v1), and sessions and prompts still add to the old Think Fast totals and the account
sync. Files: think-fast-core.js (prompts, listening maths, scoring, ranks, badges; covered by
tests/think-fast-core.test.js), think-fast.js and think-fast.css (screen), think-fast-words.js (analogy words).
Get a question, think for a moment, then tell one story that answers it. New words appear every few seconds (whether or not you have used the last one) and stay on the board until you have worked them in; connect each into the story so it keeps flowing. Pick Quick Spark (30 s, 4 words), Classic (60 s, 6 words), Pressure (a new word every 6 s), Endurance (90 s, 10 words) or Custom. The question can be shuffled or typed in ("Write my own").
Speed is not scored. The score is out of 100 for the whole story: 45 points for how many of the words ended up in it
(at any moment, even right at the end), 25 for how long it is (a full telling is about 90 words a minute of speech) and
30 for how well it connects. The connection is rated once, at the end, by the AI (api/story-score.js, signed-in
users only); if it cannot be reached the connection is a capped estimate from joining words (because, so, then, but) and
the results say "estimated". Saying a word before it appears does not count. Words are detected as before (the browser's
speech recognition, or the call audio when Google Meet audio is on). Ranks, XP and eight badges are kept in this browser
(sg-spot-v1). Rules live in spot-core.js (tested by tests/spot-core.test.js), the look in spot.css.
The coach shares their screen in a Google Meet and students speak from their own laptops. The games listen to the call instead of the microphone:
/api/transcribe
(with the target words as a spelling hint) and runs its existing word detection on the text.Chrome or Edge on a computer only. The coach stays on the game tab (a round stops if the tab is hidden). Only the students are heard: the coach's own voice is not in the shared audio. Pitch and pace track well over a call; volume is the roughest, because the call levels and compresses voices before the game hears them, and each student's microphone settings apply as well.
Files: meeting-audio.js (connection, panel, ChunkTranscriber), api/transcribe.js (short
speech to text), vocal-variety-game.js (rules, pure functions, covered by
tests/vocal-variety-game.test.js), vocal-variety-core.js (pitch, vowel filter, sound-only
pace estimate), vocal-variety.js and vocal-variety.css (interface).
Scoring. Each dimension maps to a 0 to 1 level. Variety = range (45%) + swings between zones (35%) + use of all three zones (20%). Guided games are 70% ribbon match and 30% variety; All Three averages the three dimensions. Talking for under half a round lowers the score; pauses are never penalised. Volume is relative level, not calibrated sound pressure. Strong means energetic, never strained.
Privacy. Audio and PREP notes stay in the browser. In meeting mode, and in the Pace games,
a few seconds of speech at a time are sent to the app's speech service to be turned into words
(nothing is stored by the app); the other games and the microphone-only Volume and Pitch games
send nothing. Stars, XP, badges and the learned loudness are saved in this browser's
localStorage only and never change the coaching scores, progress, or history. Capture stops
on Finish, navigation away, backgrounding, Escape, or page close; the meeting connection stays
open until it is disconnected (the browser shows its sharing indicator while it is).
api/transcribe.js only answers signed-in users: the browser sends its Firebase login token and the
server checks it against the app's Firebase project (no secret needed, only the public project id).
It is also limited to short audio chunks (1.5 MB) of known
audio types. Every chunk with speech costs a little on the OpenAI account.
Web only. The loader and modules guard against native Capacitor, and build:web does
not package them. Do not include them in an Android release until the user has tested and
approved them.
Run npm test for the signal, rules and endpoint tests plus the existing app suite. The web
deployment serves the repository root; www/ remains the Capacitor asset output.
With a local server on port 8766 and Playwright CLI open on its index page, run
playwright-cli run-code --filename scripts/validate-vocal-variety-ui.js to play the game
with generated audio.