ESP32-S3 Bench Guide
ESP32‑S3 N16R8 벤치 가이드: 실시간 핀아웃, 강의, 시뮬레이터 및 벤치 로그
BPO·고객 서비스 직무용 무료 음성 면접관으로, 말하고 듣고 후속 질문하고 불만 고객을 시뮬레이션하며 채용 담당자처럼 점수를 매깁니다
A free voice interviewer for BPO and customer-service jobs. It speaks, listens, follows up, plays an upset customer on a mock call, and scores you like a recruiter, all inside your browser.
교육JavaScript · CSSGitHub @TUSHARXP-10온라인운영자 미확인
써 보셨어요? 한 번만 눌러 주세요. 로그인은 필요 없어요.
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기메이커가 쓴 소개는 위의 한 줄이 전부입니다. 더 자세한 내용은 저장소 README에서 읽을 수 있습니다. 저장소 README ↗
README 전체를 불러오는 중입니다.
README 전문 보기 ↗A free voice interviewer for BPO and customer-service jobs, and now for engineers too. It works like a real phone interview: Tushar AI, the AI interviewer, asks every question out loud, listens to your spoken answers, asks follow-up questions, and plays an upset customer in a mock call. At the end you hear how you did, and you get a recruiter-style scoresheet with recordings of your answers.
You only need Node.js 18+ (no npm install step; the project has zero dependencies).
git clone https://github.com/TUSHARXP-10/Ai-interviewer-.git
cd Ai-interviewer-
npm start
Open http://localhost:8080, enter your name, press 📞 Start voice interview, and allow the microphone. Headphones help.
Browsers only allow the microphone on
https://orlocalhost, which is why a tiny local server is included. If you prefer Python:python3 -m http.server 8080.
Opening http://<your-computer's-IP>:8080 on a phone does not work for the interview: the page loads, but phones only allow the microphone on https://. So there is an HTTPS mode for your local network:
npm run lan
https://192.168.1.23:8443; open it on the phone (Chrome on Android, Safari on iPhone)..cert/ and reused next time). Tap Advanced → Proceed (Chrome) or Show Details → visit this website (Safari).On a phone, the app asks for the microphone (and camera) once, at the start, keeps the screen on during the interview, and then hands the microphone to the browser's speech recognition: on Android that is the phone's own speech service, which hears only silence if the page keeps a second microphone stream open. Answer recordings are therefore only saved on computers.
If the phone keeps asking for the microphone or doesn't hear you:
If the phone can't connect:
node.exe in Windows Defender Firewall → Allow an app. Make sure the Wi-Fi is set to a Private network.npm run lan again and open the new address.PORT=9443 npm run lan (Windows: set PORT=9443 && npm run lan).The repo is ready for Vercel: vercel.json runs npm run build, which copies index.html, css/ and js/ into dist/ (no dependencies, no bundler), and serves that folder over HTTPS with microphone permission allowed.
From the dashboard: go to vercel.com/new, import this GitHub repository and press Deploy. If Vercel says it needs the GitHub integration, install the Vercel GitHub app for this repository first. Set Application Preset to Other and leave everything else at its default; vercel.json sets the build. Every push to the branch redeploys.
From the terminal:
npm i -g vercel # once
vercel --prod # build and deploy to production
Share the right link. Open and share the short address, https://<project>.vercel.app: it's on the CLI's Aliased line, and in the dashboard under Domains (or press Visit). Open it in Chrome or Edge, allow the microphone, and you're in. The longer <project>-<hash>-<team>.vercel.app links (the Production:/Preview: lines, and every preview deployment) sit behind Vercel's default Deployment Protection, so anyone not logged in to your Vercel account sees a "Log in to Vercel" page. To make those public too, turn off Vercel Authentication in Project → Settings → Deployment Protection.
To check the build locally: npm run build, then serve dist/, e.g. python3 -m http.server 8080 -d dist.
When a candidate finishes, their scoresheet shows 📤 Send my result. They tap it and pick WhatsApp (or any app), or copy the link, and send it to the recruiter. The link holds the whole scoresheet, compressed (about 7–10 KB of text); it lives after the #, so it never reaches any server, and there is nothing to set up. Recordings and proctoring photos are never in it.
The recruiter opens the link on their phone or computer: the full scoresheet opens, and it's kept on that device under 📊 Results. There they see every result they've received: score, verdict, skills and integrity at a glance, search, filter and sort, the full scoresheet (transcript included), print, remove, and Export CSV for a spreadsheet. A link that doesn't open from the chat can be pasted (the whole message is fine) into Add a result, and a scoresheet file ("Download data (JSON)") can be added with Add a file.
localStorage). Opening the same link twice keeps one copy. Export CSV now and then as a backup.If you'd rather have every interview arrive by itself, connect a database; the site then sends each finished scoresheet to a shared Results board instead of asking the candidate to send a link:
KV_REST_API_URL and KV_REST_API_TOKEN).ADMIN_KEY = a passcode. Without one the board is public and nobody can delete results; with one, only the passcode opens the board (unless PUBLIC_RESULTS = 1) and deletes results. The passcode lives only in Vercel's settings, never in this public code. After 10 wrong passcodes, that address must wait 15 minutes.Each interview is stored once, however often it's sent, and a stored result can't be overwritten. npm start / npm run lan run a board in .data/results/ with a passcode printed in the terminal (RESULTS_BOARD=0 npm start turns it off, to use links instead).
On the hosted site (HTTPS) or localhost, the app can be installed:
The installed app opens in its own window, without the browser's address bar. A small service worker (sw.js) keeps a copy of the app, so it opens offline too. It always loads the newest version while you're online. Offline, the built-in speech recognition of Chrome and Edge doesn't work (it needs the internet), so use the offline Whisper engine: run one interview online first, so its model is downloaded. The proctoring models are kept after their first download as well.
npm run lanuses a self-signed certificate, which browsers don't accept for installing apps. Install from the hosted site (Vercel or GitHub Pages) or fromlocalhostinstead.
/ (root) folder.https://<your-username>.github.io/Ai-interviewer-/. HTTPS is included, so the microphone works.npm run demo (try node tools/simulate.js weak --full or node tools/simulate.js average --role sales).If something goes wrong, Tushar AI handles it:
Live captions are on by default: you see the interviewer's words, and the You panel shows your own words live as you answer. (With the offline Whisper engine your words appear phrase by phrase, each time you pause.) The CC button hides them.
On-screen buttons (Captions, Repeat, Skip, I'm done, End) are there if you want them. Keyboard: Enter finishes an answer, R repeats, C toggles captions.
A focused 10–12 minute test, picked on the setup page (or from the home page):
The scoresheet adds a round-by-round card (score and key evidence per round, e.g. "Mood 85 → 17 · resolved"). Content lives in js/callContent.js, the customer's behaviour in js/callsim.js.
Pick Engineering at the top of the setup page. Choose your role, a company style, fresher or experienced, and a length (Quick screen, Standard loop or Full loop). Tushar AI calls "from" that company ("Hi Ravi! I'm Tushar AI, calling from Amazon's hiring team about the Backend Developer role…") and runs two rounds:
There's no code editor: you think out loud, the way a phone screen works. A new Technical knowledge skill scores the correct concepts, the depth (trade-offs, complexity, edge cases, measurable evidence) and the reasons you give; a confident answer that misses the concepts scores low. The scoresheet shows each round and the company style, and gives an engineering-specific verdict. A sample engineering scoresheet is one click away on the setup page.
The company styles follow each company's publicly described interview format. This is a practice simulation; it isn't affiliated with or endorsed by any of these companies. The questions live in js/techBank.js.
| Stage | Example question | What it checks |
|---|---|---|
| Introduction | "Tell me about yourself." | Structure, completeness, confidence |
| Background | Education, or your last job (experienced candidates) | Relevance, achievements, specifics |
| Motivation & fit | "Why do you want to work in a BPO?" / "Why should we hire you?" | Genuine motivation, red flags (e.g. "only for money") |
| Role knowledge | "What is BPO?" / "Inbound vs outbound?" / AHT & CSAT | Industry understanding |
| Situational | "How would you handle an angry customer?" | Empathy, steps, ownership, escalation |
| Past experience | "A time you worked under pressure…" | STAR storytelling (Situation, Task, Action, Result) |
| Mock call | An upset customer charged twice, an internet outage (tech support), or an outbound sales pitch | Greeting, empathy, ownership, probing, resolution, closing |
| English & listening | Remember a customer's name, order number and city; repeat a sentence after the interviewer; correct a sentence | Listening accuracy, grammar, word-for-word repetition |
| Flexibility | Night and rotational shifts, weekends | Willingness, clarity |
| Self-awareness | Strengths and weaknesses, five-year plan | Honesty, growth mindset |
| Closing | "Any questions for me?" | Curiosity, engagement |
Lengths: Quick (7 questions, about 10 min), Standard (14, about 20 min), Full (22, about 30 min), the 4-round assessment, and English & Versant practice (below). Questions adapt to the role (voice support, tech support, sales, chat/email, general) and to fresher or experienced candidates. The question set is randomised, so practising again gives different questions.
Many BPOs screen voice candidates with an automated spoken-English test (Versant and similar), where fluency and sentence repetition carry a lot of the score. English & Versant practice (6–8 minutes) drills exactly that: repeat after me (the interviewer says a customer-service sentence once and you say it back; it is scored word for word, with spoken numbers and digits treated alike, and the scoresheet shows the words you missed), a listening test, two sentence corrections and a short talk on a topic. The Full assessment includes one repeat-after-me sentence too.
Open Tailor it to a real job on the setup page and paste the job description. Tushar AI recognises what it asks for (engineering skills such as Java and Spring, Kafka, AWS, Kubernetes, React, LLMs; or for BPO jobs an international process, night shifts, sales targets, CRM tools, AHT and CSAT) and shows it as chips. Each question slot then prefers the questions about those things, and one extra question right after the introduction is built from the job's top asks ("The job description asks for Java and Spring, plus microservices and messaging. Tell me about your hands-on experience with Java and Spring…"). If the job reads like a different role from the one selected, it offers to switch. The text never leaves your device.
Most of the learning happens on the second try, so the scoresheet leads straight into it:
| Skill | Built from |
|---|---|
| Communication & fluency | Grammar while speaking ("he say", "I am complete my graduation", "listen the customer"), dropped small words ("I did diploma"), filler words (basically, you know, crutch like), restarts, completeness, speaking pace (wpm), long pauses and silences, voice modulation |
| Confidence & composure | Hedging (I think, maybe, I guess), assertive language (I handled, I achieved), negative self-talk, how quickly you start, voice strength above room noise, whether your voice fades at the end |
| Thought process & structure | Reasoning and sequencing words (because, first… then, as a result), real examples and your own stories, STAR completeness, specific details; stock phrases ("hard working and dedicated", "quick learner") and off-topic answers count against it |
| Answer quality & relevance | How much of what a strong answer includes you covered (a per-question rubric with synonyms), whether you answered the question that was asked, and real substance |
| Customer handling & empathy | Empathy phrases, approach to customer situations, and the mock call: apology, verifying details, a concrete fix with a timeline, warmth, clear English, closing — and anything rude ("shouting won't help") |
| Attitude & motivation | Genuine motivation, flexibility, curiosity, minus red flags (money only, planning to leave soon, badmouthing a past employer, refusing shifts, blaming customers) |
| English & listening | Listening-test recall, sentence corrections, a grammar coach for common slips ("Myself Rahul", "I am having 2 years experience", "revert back"…) |
The scoresheet also includes an estimated English level (CEFR), role fit for each BPO role, red flags to probe, speech analytics, the mock-call checklist, an integrity panel (tab switches, pasted answers), and a question-by-question breakdown with scores, feedback and what a strong answer would include.
Your answers, word for word. Every question is listed with exactly what you said, caption style (or why there is no answer: skipped, or time ran out). Grammar slips get a wavy underline, weak or informal words (gonna, stuff, good used four times…) a dotted one, and fillers are highlighted. Under each answer, a language check lists the better way to say each one, and your recording plays right beside it.
Scoresheets (and answer recordings) are saved in your browser's history (the newest 12).
Back up, restore and export (on the home page, under Your progress):
.json file. 📂 Restore adds them on another browser or device; interviews already there are skipped, and the newest 12 are kept. Recordings and proctoring photos stay on the device they were made on. Restore also accepts a single scoresheet from Download JSON, so a candidate can send you theirs.Scoresheets They can be printed or saved as PDF, or downloaded as JSON. Press 🔊 Hear my feedback to have Tushar AI read your result aloud again.
js/analyzer.js) extracts signals from the transcript, the timing, and the microphone (Web Audio: loudness, pauses, pitch).js/scoring.js), each question contributes to the dimensions it informs. A situational question counts heavily towards customer handling; a listening test counts towards English. The seven dimensions are then weighted by role: confidence matters more for sales, written accuracy more for chat support.tests/calibration.test.js keeps it that way).Your name, spelled right. Speech recognition often mangles names ("I am tishar chadne"). The app knows the name you typed, so where you introduce yourself it puts it back ("I am Tushar Chandane"), only right after "my name is", "I am", "myself"… or when your full name appears, so ordinary words are never turned into a name.
The word lists live in js/lexicons.js and the rubrics in js/questionBank.js, so you can tune the model without touching the code.
The built-in model needs no AI service. For a deeper qualitative review, you can add a local language model:
# install from https://ollama.com, then:
ollama pull llama3.2 # or qwen2.5:3b, gemma2:2b, phi3:mini
ollama serve # usually already running after install
In the app, open Studio settings, tick Use a free local AI model, press Test, and pick the model. After the interview, the model rates each answer and writes the summary. Its scores are blended with the rule-based ones (the rules stay the majority), and it adds a one-line tip per answer. Everything stays on your computer.
If the app is hosted somewhere other than
localhost(e.g. Vercel or GitHub Pages), allow that site in Ollama:OLLAMA_ORIGINS="https://<your-app>.vercel.app" ollama serve. Some browsers block an online page from talking tolocalhost; if Test can't connect, run the app locally withnpm start.
| Engine | Used by default in | How it works | Needs |
|---|---|---|---|
| Browser built-in | Chrome, Edge, Safari | The browser's own speech service; live words while you speak | Internet |
| Offline Whisper | Firefox, Brave, and any browser whose built-in service fails | OpenAI's Whisper tiny.en model running on your device with WebAssembly (transformers.js 4.3.0) | A one-time download of about 48 MB, cached by the browser |
The interview picks automatically, and switches to Whisper mid-interview if the built-in service fails (e.g. offline or blocked). You can force either engine under Voice, camera & local AI settings → Speech recognition. With Whisper, the app uses the microphone level to tell when you've finished, then transcribes your answer in a background worker (usually 1 to 3 seconds).
Self-hosting the model (e.g. for an intranet with no internet): set
window.AII_CONFIG = { whisper: { libUrl, modelHost, wasmPaths } }before the scripts load. See the comments at the top ofjs/whisper.js.
The camera tile on the right of the call is read about eight times a second by Google's free MediaPipe models, running in your browser: a face landmarker (478 points, eye and head direction) and an object detector (phones). The models download once (about 21 MB) when the interview starts.
| What it checks | Noted after | Warning after |
|---|---|---|
| Your face is in view | 2 s missing | 5 s missing |
| Camera not covered or dark | 1.5 s | 4 s |
| Nobody else in view (a much smaller face, like a photo on the wall, doesn't count) | 0.7 s | 2 s |
| No phone in view (seen twice in a row) | at once | 1 s |
| Eyes and head towards the screen (down or to the side; looking up to think doesn't count) | 3 s | 8 s |
| Repeated short glances away (4 within 45 s, like reading notes) | yes | no |
| You stay on this tab and this window | at once (2.5 s for the window) | |
| A second screen is connected (Chrome) | yes | no |
localStorage. Use Clear all on the home page to delete it, recordings included. A backup file holds your scoresheets, transcripts included, so keep it somewhere private.| Browser | Voice interview | Speech engine |
|---|---|---|
| Chrome / Edge (desktop and Android) | ✅ Best | Built-in (Whisper fallback) |
| Safari (macOS / iOS 16.4+) | ✅ | Built-in (Whisper fallback) |
| Firefox (desktop and Android) | ✅ | Offline Whisper |
| Brave | ✅ | Offline Whisper |
Tips: use headphones (so the mic never hears Tushar AI), find a quiet room, and pick your accent in the setup (e.g. English — India) for better recognition.
js/questionBank.js. Each question has its own rubric (concepts with synonyms, ideal length, follow-ups, and a "what a strong answer includes" tip). Add its slot to a plan in PLANS if it is a new slot.js/lexicons.js.ROLE_WEIGHTS and VERDICTS in js/scoring.js.After any change, run npm test. It includes calibration tests that check strong, average and weak candidates still rank correctly.
index.html App shell (home, voice call, scoresheet)
css/styles.css Styles (light and dark themes, print layout)
js/textUtils.js Tokenising, contraction handling, pattern matching, numbers
js/lexicons.js Word lists: fillers, hedges, STAR, empathy, red flags, grammar
js/questionBank.js Questions, rubrics, follow-ups, interview plans
js/jobFit.js Tailoring to a pasted job description: skills, question choice, the job question
js/coach.js Live coaching (time, pace, fillers) and the engineering approach checklist
js/progress.js Progress across saved interviews: trend, skills, streak
js/backup.js Back up and restore saved interviews, and export them as CSV
js/techBank.js Engineering roles, company styles, two-round plans and 100+ technical questions
js/analyzer.js Per-answer signals and 0–100 scores
js/scoring.js Interview-level scoresheet, recruiter scale, gates, verdict
js/explain.js Evidence behind every score: reasons, strengths, tips, summary
js/engine.js Interview flow: follow-ups, reactions, branching mock call, rounds
js/callsim.js The live customer for the 4-round assessment (mood, reactions, outcome)
js/callContent.js Call problems, customer moods, caller names, topic words
js/voice.js Hands-free rules: voice commands, end-of-answer detection, nudges
js/speech.js Browser text-to-speech and speech recognition
js/whisper.js Offline Whisper speech recognition (transformers.js, loaded on demand)
js/proctor.js AI proctoring from the camera: face, eyes, extra people, phones (MediaPipe, loaded on demand)
js/audio.js Microphone analysis: pauses, loudness, pitch
js/recorder.js Answer recordings (MediaRecorder + IndexedDB)
js/llm.js Optional Ollama integration
js/report.js Scoresheet rendering
js/demo.js Scripted candidates (sample report, demo, tests)
js/app.js UI controller
js/share.js Results without a database: a scoresheet packed into a link; results received on this device
js/board.js The Results page: results received (or the optional board), search, sort, CSV, full scoresheets
api/results.js Vercel function for the optional Results board (send, list, open, delete)
lib/results.js Optional Results board logic and storage (Upstash Redis on Vercel, files for npm start)
sw.js Service worker: install as an app, open offline
manifest.webmanifest App name, icons and colours for installing
icons/ App icons (drawn by tools/icons.js)
server.js Zero-dependency local server (npm start; npm run lan for phones on Wi-Fi)
tools/selfsigned.js Self-signed HTTPS certificate with Node's crypto (for npm run lan)
vercel.json Vercel hosting: build command, output folder, headers
tools/build.js Copies the site into dist/ for static hosting (npm run build)
tools/simulate.js Run a scripted interview in the terminal
tools/icons.js Draws the app icons as PNG files (no dependencies)
tests/ node:test suite (npm test), incl. 30 recruiter-rated interviews