ESP32-S3 Bench Guide
ESP32-S3 N16R8 bench guide: live pinout, lessons, simulators and the bench log.
翻译准备中
尚未检测到更新。GitHub 发布版本后会显示在这里。
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证制作者的介绍仅有上面的一句话。 更多详情请阅读仓库 README。 仓库 README ↗
正在加载完整 README。
查看完整 README ↗有料職業紹介事業の求職者支援の一環として、中途採用の転職希望者がAIの面接官と音声で会話しながら、本番に近い形で何度でも面接練習ができ、回答ごとに具体的なフィードバックを受けられるWebアプリケーション。担当キャリアアドバイザーは、求職者の練習状況を把握して支援に活かせる。
製品版の先行版(求職者が使う画面。ログインとデータベースの前の版)を / で、管理者向けの検証ツール(音声会話の試作版)を /poc で動かせる。先行版では、練習の記録などは求職者のブラウザに保存する(基本設計書 14.2)。
Node.js 22 が必要。
npm install
cp .env.example .env.local # 値を入れる(下表)
npm run dev # http://localhost:3000/join#<POC_ACCESS_CODE の値> を開く(検証ツールは /poc)
| 環境変数 | 必須 | 内容 |
|---|---|---|
POC_ACCESS_CODE | ○ | 招待のコード。求職者には https://<ドメイン>/join#<コード> を招待リンクとして送る(「#」より後ろはサーバーに送られないため、アクセスログに残らない)。検証ツール(/poc)では画面で入力する。未設定だと API は使えない |
ANTHROPIC_API_KEY | △ | Claude API キー。AI_PROVIDER=mock のときは不要。Anthropic Console でワークスペースを選んで作成したキーを使う |
ANTHROPIC_WORKSPACE_ID | ワークスペースに属していないAPIキーを使う場合だけ、使うワークスペースのID(wrkspc_...)を入れる | |
AI_PROVIDER | mock にすると Claude API を呼ばず、固定の文面で動く(APIキーなしで画面と音声の流れを確認できる) | |
GOOGLE_TTS_API_KEY | Google Cloud の API キー。設定すると、音声合成(Text-to-Speech)と音声認識(Speech-to-Text)で Google Cloud を使える(どちらも標準になる)。Google Cloud で「Cloud Text-to-Speech API」と「Cloud Speech-to-Text API」を有効にし、キーの制限(API の制限)でこの2つだけを許可する | |
GOOGLE_STT_API_KEY | 音声認識だけ別の API キーを使う場合に設定する(未設定なら GOOGLE_TTS_API_KEY を使う) | |
AZURE_SPEECH_KEY / AZURE_SPEECH_REGION | Azure AI Speech(音声認識・音声合成)。未設定でもブラウザ標準の音声認識・読み上げで試せる | |
INTERVIEWER_VOICE_ID | 製品版の面接官の声(Google Cloud の声の名前。例:ja-JP-Chirp3-HD-Charon)。未設定なら男性の Chirp 3 HD の声のうち一覧の先頭を使う。検証ツールの「声を試す」で選んだ声を入れる | |
NEXT_PUBLIC_SUPABASE_URL / NEXT_PUBLIC_SUPABASE_PUBLISHABLE_KEY | Supabase のプロジェクトの URL と公開用のキー。エージェントのログインとデータの保存に使う。未設定なら開発用の方式(サーバーのメモリに置き、ログインの確認コードを画面に出す)で動く。本番では必ず設定する |
/join#<コード>)を開く。リンクを開けない場合は、トップの画面にリンクかコードを貼り付ける。音声認識・音声合成・AIモデル・面接官の顔と声は利用者に選ばせず、使えるものの中から決まった順に選ぶ(Google Cloud → ブラウザ標準など。面接官は Claude Opus 5.5 の佐藤 健一)。
エージェントが求職者と応募先を登録し、求職者×応募先ごとの招待リンクを作って送る画面(設計:docs/superpowers/specs/2026-10-27-agent-invite-design.md)。いまはログインまでできる。
/agent を開くと、ログインの画面に移る。登録されているメールアドレスを入れると、ログインのリンクと6桁の確認コードが書かれたメールが届く。supabase/migrations/、メールの文面は supabase/templates/(本番のプロジェクトには、ダッシュボードの Authentication → Emails に同じ文面を貼る)。音声の組み合わせ:
| 区分 | 選択肢 | 補足 |
|---|---|---|
| 音声認識 | Google Cloud(Speech-to-Text。標準) | どのブラウザ(Safari・スマホを含む)でも同じように使える。マイクの音声を話の短い間(0.5秒)ごとに区切ってサーバーへ送り、文字にする(途中の文字は出ず、区切りごとに字幕が出る)。準備のときにごく短い無音を送って使えるかを確かめ、使えなければ文字での回答に切り替えて、有効にする方法を画面に出す。Google Cloud が使える場合は、前回の選択に関係なく Google Cloud から始める |
| ブラウザ標準(Web Speech API) | Chrome・Edge 向け(Safari は Siri の設定などで聞き取れないことがあり、Firefox・Brave は非対応)。音声はブラウザの提供元のサーバーで処理されるため、比較の基準として使い、本番では採用しない。認識のサーバーにつながらない(network エラーが3回続く)、マイクが許可されていないなどで使えなくなったら、面接は続けたまま文字での回答に切り替え、理由と対処を画面に出す | |
| Azure AI Speech | サーバーが発行する一時トークンで、ブラウザから直接接続する | |
| テキスト入力 | マイクを使わずに流れを確認する | |
| 音声合成 | Google Cloud(標準)/ Azure AI Speech / ブラウザ標準 / テスト音 | 面接官の声をそろえるため、Google Cloud が使えるとき(GOOGLE_TTS_API_KEY を設定済み)は、前回の選択に関係なく Google Cloud から始める(ブラウザ標準の声は端末ごとに変わる)。Google は日本語の声の一覧から選べる(Chirp 3 HD が最も自然、WaveNet が低価格)。「声の高さ」「話す速さ」で調整し、「声を試す」で確認できる。テスト音は発話時間ぶんの信号音(音声サービスなしで確認する用) |
面接官のアバター:
| 選択肢 | 補足 |
|---|---|
| 佐藤 健一(写真) | 標準の面接官(public/avatars/sato/)。口は、この写真から作った話している動画の口元のコマ(mouth-frames.webp と mouth-frames.json)で動かす。動画を作り直したら node scripts/build-mouth-frames.mjs <動画ファイル> で作り直せる(ffmpeg が必要)。目を閉じた顔の画像と、予備の口の形の画像(「い・う・え・お」。「あ」は「え」で代用)つき。面接官はこの名前で名乗り、ブラウザ標準の読み上げでは男性の声を優先する |
| 仮の顔(イラスト) | public/avatars/placeholder/。正式な顔画像ができるまでの仮の顔。表情違いの画像は node scripts/generate-placeholder-avatar.mjs で作り直せる |
| 自分で用意した画像 | 画像生成AIなどで作った顔画像を選び、両目・口・あごの4点をクリックする。正面を向き、目を開けて口を閉じた、肩まで写った画像(正方形がおすすめ)を使う。続けて「表情の画像」に、同じ人物の口の形(あ・い・う・え・お)と目を閉じた顔を追加すると、口の中やまばたきも本物の画像になる(位置は自動で合わせる)。画像はサーバーに送らず、そのブラウザだけに保存する。実在の人物に似せない |
| 表示しない | アバターを出さずに試す |
アバターは声に合わせて口を動かし、まばたき・相づちのうなずきをする(設計書 3.12)。サーバーで合成した音声(Google・Azure)は音から、ブラウザ標準の読み上げは文章の母音から口の動きを作る。テスト音はほぼ無音のため、口はほとんど動かない。
スマホでマイクを使うには HTTPS が必要なため、スマホでの確認は Vercel のプレビュー・本番の URL で行う。
vercel.json で東京(hnd1)に固定している。npm run lint # ESLint
npm run typecheck # TypeScript の型チェック
npm test # 単体テスト(Vitest)
npm run build # 本番ビルド
cd e2e && npm test # ブラウザでの通しの確認(e2e/README.md)
app/(app)/、components/app/ 製品版(先行版)の求職者向けの画面
features/app/ 求職者向けの画面の処理(ブラウザへの保存・面接の設定・画面の言葉・招待)
app/poc/ 試作版の画面(管理者向けの検証ツール)
app/api/poc/ 試作版の API(質問計画・面接官の応答・音声認識トークン・音声合成)
components/poc/ 試作版の画面部品
features/interview/client/ ブラウザ側の音声処理(状態管理・マイク入力・話し終わりの判定・再生)
features/avatar/ 面接官のアバター(口の動き・表情違いの画像の位置合わせ・動画から作った口元のコマの再生・まばたき・うなずき・WebGL での描画)
lib/interview/turn-engine.ts 会話の1往復を処理するターンエンジン(Next.js に依存しない)
lib/ai/ Claude の呼び出し・プロンプト・質問計画
lib/speech/ 音声合成・音声認識トークンのアダプター
tests/unit/ 単体テスト
e2e/ ブラウザでの通しの確認(模擬サーバーと AI の固定の文面を使う)
/agent/login からログインし、/agent で求職者を登録する。求職者の詳細で応募先・求人票・面接設定を入れると、/i#<鍵> のリンクを作成・コピーできる。応募先を編集してもリンクは同じ。停止・再開でき、求職者の削除には確認を挟み、応募先・リンク・練習記録も削除する。他の担当者の求職者は見られない(管理者を除く)。
PRACTICE_LINK_SECRET: サーバーだけに設定する32文字以上の安全な乱数。Supabase 使用時は必須。各サーバーで同じ値を維持する。IDとこの値から鍵を作り、DBには鍵のハッシュだけを保存する。値を変更すると既存リンクとの対応が失われるため、変更時にはリンクの再発行・ハッシュの移行設計が必要。/i の面接・結果保存も実装。実サービス・実機の確認前なので、まだ本番配布はしない。/i#<鍵> を開くと、担当者が入れた応募先の練習を始められる。結果の担当者共有と音声を保存しないことを案内し、音と声の確認→面接→結果へ進む。マイクが使えない場合は、直し方と「もう一度試す」を出す(文字で答える面接への切り替えボタンはない。面接の途中で聞き取りが続けて失敗したときだけ、自動で文字の入力に切り替わる)。同じリンクから履歴と結果を見返し、再練習できる。
SUPABASE_SERVICE_ROLE_KEY をサーバーだけに設定し、新しい 20261027000001_practice_sessions.sql まで適用する。今回、実際のプロジェクトへの移行・設定変更はしていない。求職者の詳細で、練習が1回以上ある応募先のカードに「結果を見る」が出る。開くと、そのリンクでの練習の一覧(日時・点数・状態)が出て、選ぶと求職者と同じ結果と会話の記録の全文を見られる。途中で終わった練習(会話を保存する前に画面を閉じた練習)は開けない。
20261028000000_reopen_evaluation.sql まで適用する。/ は利用案内、担当者は /agent/login、求職者は担当者が作った /i#鍵 から練習する。/privacy にデータの取り扱い、/help に操作の案内を置く。旧 /join は受付終了、旧端末保存方式の画面は案内へ戻す。旧端末データは削除しない。管理用の /poc は維持する。
閲覧記録は4本目のマイグレーション 20261028000001_agent_access_logs.sql と lib/agent-data/access-log.ts。アプリが認可済みの情報を提供した記録で、直接Data API/DBの監査や人の読了回数を意味しない。記録の保持期間・正式な運営主体の表記・法務確認は未確定。要件v0.19・設計v0.20を参照。
| 項目 | 内容 |
|---|---|
| Supabase | プロジェクト ai-interview-pj(東京リージョン、無料プラン、組織「month color PJ」)。データベースの定義は supabase/migrations/ の4本を適用済み。ログインの設定(招待制、サイトの URL、戻ってよい URL)は supabase/config.toml から反映済み |
| Vercel の環境変数 | NEXT_PUBLIC_SUPABASE_URL・NEXT_PUBLIC_SUPABASE_PUBLISHABLE_KEY・SUPABASE_SERVICE_ROLE_KEY・PRACTICE_LINK_SECRET を本番(Production)と、ブランチ feat/login-db のプレビューに設定済み。PRACTICE_LINK_SECRET は本番とプレビューで同じ値(違うと、片方で作ったリンクがもう片方で開けない) |
| 秘密の値の控え | データベースのパスワードと PRACTICE_LINK_SECRET は、開発用の Mac のキーチェーン(「ai-interview-pj-supabase-db」「ai-interview-pj-practice-link-secret」)にだけ置いている |
| エージェントの追加 | node scripts/add-agent.mjs <メールアドレス> [--name 表示名] [--admin](環境変数 NEXT_PUBLIC_SUPABASE_URL・SUPABASE_SERVICE_ROLE_KEY が必要)。追加した人は /agent/login でメールアドレスを入れて、届いたメールのリンクでログインする |
いまのログインのメールは、Supabase 標準の英語のメール(件名「Your sign-in link」)で、本文の「Sign in」を、ログインの画面を開いた端末のブラウザで押す(別のブラウザで開くとログインできない)。確認コードは入っていない。
公開(求職者への配布)の前に必要なこと:
supabase/config.toml のメールの文面の4行の「#」を外して supabase config push する(確認コードの入ったメールになる)。/agent/login からログインし、求職者と応募先を登録して、招待リンクをスマホで開いて最後まで練習する(音声で答える面接も)。