| name | meeting-copilot |
| description | A two-machine live meeting copilot. A Windows laptop streams two audio channels (your mic, and a loopback of the other side's voice) to a parent machine, which transcribes them, drives a teleprompter you read from, watches every incoming utterance against a ledger of pre-agreed facts, and answers off-script questions. Ships the parent daemons, the Windows capture agent, and worked config examples. Consumes raw transcripts only â never a meeting-AI summary.
äŒè°ã«ååžããŠãªã¢ã«ã¿ã€ã ã§é²è¡ããã»åæç£èŠã»å°æ¬å€è³ªåãžã®åçãè¡ã2å°æ§æã®ã¢ãã¿ãåæ©(WindowsããŒã)ã2系統ã®é³å£°ã芪æ©ãžéãã芪æ©ãæåèµ·ããã»ã«ãŒãçæã»ç»é¢é
ä¿¡ãè¡ãã芪æ©ã®åžžé§äžåŒã»åæ©ã®åã蟌ã¿äžåŒã»èšå®ã®å®äŸã€ããå
¥åã¯éèªã®ã¿ã§ãè°äºé²AIã®èŠçŽã¯äœ¿ããªãã
|
meeting-copilot
äŒè°ã«ååžããŠãé²è¡ãšåæãèŠåŒµãã¢ãã¿äžåŒ
English abstract â Two machines. The child (a Windows laptop, in the meeting) captures two physical audio channels â T = your microphone, G = a WASAPI loopback of the default speaker â and streams both to the parent over TCP with a shared token. The parent transcribes each channel separately (speaker identity comes from the channel, never from diarization), then runs three layers over the transcript: a rule-only warden (copilot.py) that advances the agenda and fires boundary alarms with no LLM at all; a premise watcher (premise_watch.py) that classifies every guest utterance against a ledger of pre-agreed facts as contradiction / already-known / new; and an answerer (answerer.py) for off-script questions. A teleprompter (viewer2.py) serves two different pages â a prompt screen only you see on your phone, and a stage window you actually screen-share. Everything case-specific lives in config files; the code carries no customer data. Written mainly in Japanese; the structure is language-independent.
0. å
šäœå â ããã¯2å°æ§æã§ãã
äžçªããããåãéããã1å°ã§å®çµããéå
·ã ãšæããããšãå¿
ã2å°èŠãã
ââ åæ© (Windows ããŒãPCã»äŒè°ã«æã£ãŠããæ©äœ) âââââââââââââ
â â
â ãã€ã¯ ââââââââââââ⺠agent_mic.py âââ ch "T" â
â â â
â æ¢å®ã¹ããŒã«ãŒã® â â
â ã«ãŒããã㯠âââââ⺠agent_loop.py ââ†ch "G" â
â â â
â é³ãé²ã£ãŠéãã ããSTTãAPIããŒãæããªã â
ââââââââââââââââââââââââââââââââââââââââââââŒâââââââââââââââââââ
â
TCP + åèšè(token) â 16kHz mono Ã2æ¬
ãã©ã€ããŒãç¶²(tailscaleç)ãæ³å®
â
ââ èŠªæ© (Linux / WSLã»èªå®
ãäºåæã«çœ®ãã£ã±ãªã) ââââââââââââŒââââ
â ⌠â
â receiver.py ⊠é³ãåã㊠STT ãžæµã transcript.jsonl ãžè¿œèš â
â â â
â âââ⺠copilot.py ⊠ã«ãŒã«ã ãã§æ®µã®é²è¡ã»å¢çèŠå ± â
â â âââ⺠premise_watch.py âŠ çžæã®çºè©±Ãäºå®å°åž³ â
â â âââ⺠answerer.py âŠ å°æ¬å€ã®è³ªåã«åç â
â â â
â âââ⺠viewer2.py ⊠ã«ã³ãç»é¢ + èå°ç»é¢ãé
ä¿¡ â
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
â â
â ã«ã³ãç»é¢(èªåã ãèŠã) â èå°ç»é¢(çžæã«ç»é¢å
±æãã)
⌠âŒ
ã¹ãã / æºåž¯ãã£ã¹ãã¬ã€ ååä»ãå¥çª meetlive_stage
ðŽ ã€ã€ãã³ïŒã€ã€ã¢ããå¿
é ãªçç±ã¯ããã®æ§æã«çŽçµããŠãã
話è
ã®åãæ¹ãç©çãã£ã³ãã«ã ããã§ãã(receiver.py ã® CH_SPEAKER = {"T": "host", "G": "guest"})ã
STT ã®è©±è
åé¢(diarization)ã«ã¯äžåé Œã£ãŠããªããå®ããéãã確å®ââãã ã1ã€ã ãåæãããã
åæ©ã®ã¹ããŒã«ãŒã§çžæã®å£°ã鳎ãããšãch G(çžæã®å£°)ãšããŠéã£ãŠããé³ã
ch T(èªåã®ãã€ã¯)ãæŸãçŽããåã声ã2ãã£ã³ãã«ã«äºéèšäžãããã
ãããªããšçžæã®çºè©±ã speaker="host" ãšããŠèšé²ãããã
ãã㊠host / guest ã®åºå¥ã¯ããã®éå
·ã®åå°ã«ãªã£ãŠãã:
| äœãå£ããã | ã©ãã§å¹ããŠããã |
|---|
| 段ã®é²è¡ãåæã«é²ã | æ®µã®æ€ç¥ããŒã¯ãŒã㯠host ã®çºè©±ã ãã«åœãŠã (copilot.auto_step) |
| åæç£èŠãé»ã/誀çãã | åæç£èŠãæã€ã®ã¯ guest ã®çºè©±ã®ãšãã ã (copilot.feed) |
| åŒã³ãããå¹ããªã/æŽçºãã | åŒã³ããèªã®æ€ç¥ã¯ host ã®çºè©±ã ã (receiver.Writer.emit) |
| å°æ¬å€ã®è³ªåãžã®åçãæŽèµ°ãã | answerer ãåŒã¶ã®ã¯ guest ã®è³ªåã®ãšãã ã |
ã€ãŸãã€ã€ãã³ãå¿ãããšãã¢ãã¿ã®æ©èœãã»ãŒå
šéšãããããªãã
receiver.py --xtalk-gate ã¯ãT ã®é³éãã G ã®é³éã1.5å倧ãããã° T ãæšãŠãããšãã
ä¿éºã ãã解決ã§ã¯ãªããã€ã€ãã³ãæ¿ãããšã
1. 4ã€ã®å±€ â äœãã©ããŸã§ããã
| å±€ | ãã¡ã€ã« | LLM | ãã€åãã |
|---|
| éèªå | receiver.py + stt.py | 䜿ããªã | é³ãæ¥ããã³ |
| çªäºº(第1å±€) | copilot.py | 䜿ããªã | éèª1è¡ããšãã«ãŒã«ãšæååç
§åã ã |
| åæç£èŠ | premise_watch.py | éç£åŒã³åºã | çžæã®çºè©±ããšã«æ¯å |
| åç(第2å±€) | answerer.py | äžçºåŒã³åºã | å°æ¬å€ã®è³ªåã®ãšãã ã(30ç§ã«1åãŸã§) |
| 衚瀺 | viewer2.py | 䜿ããªã | é·ããŒãªã³ã°ã§é
ä¿¡ |
| äºåŸæ€èšŒ | action_log.py | 䜿ããªã | äŒè°ã®ããš |
ãªã第1局㫠LLM ã眮ããªãã: äŒè°äžã¯ãéãã»èœã¡ãªãã»åãå
¥åã«åãåºåãã
äœããå¹ããæ®µã®é²è¡ãšçŽæã®å¢ç(éé¡ã»æéã»è²¬ä»»)ã®æ€ç¥ã¯ãããŒã¯ãŒãç
§åã§è¶³ããã
LLM ãæããšããã®åã ãé
ãããã®åã ãèœã¡ãã
2. ç°å¢å€æ°ãªãã¡ã¬ã³ã¹
æªèšå®ã§ã顧客ããŒã¿ãžã¯çµ¶å¯Ÿã«èœã¡ãªããèœã¡ãå
ã¯æ¬¡ã®2ã€ã ã:
ç¶æ
ãã£ã¬ã¯ã㪠= ./meetlive_state(ã«ã¬ã³ãçŽäž)ãå
¥åãã¡ã€ã« = 忢±ã® config/*.exampleã
ç°å¢å€æ°ãæããã¡ã€ã«ãååšããªããšãã¯ãäŸãžèœã¡ãã« SystemExit ã§æ¢ãŸã
(解決㯠scripts/meetlive_config.py ã®1ç®æã«éçŽããŠãã)ã
眮ãå Ž
| 倿° | æ¢å® | æå³ |
|---|
MEETLIVE_DIR | ./meetlive_state | ç¶æ
(éèªã»ã«ãŒãã»ãã°)ã®çœ®ãå ŽãðŽæ¡ä»¶ããšã»äŒè°ããšã«å¿
ãåãã |
MEETLIVE_LEDGER | config/ledger.yaml.example | åæç£èŠãèªãäºå®å°åž³(YAMLã»facts[].id / .title) |
MEETLIVE_AGENDA | config/agenda_steps.example.json | 段ãšå¿
é ååŸç© |
MEETLIVE_SCRIPT | config/talk_script.example.md | å°æ¬(ãã¬ããã³ãã¿ãŒã®äžèº«) |
MEETLIVE_PHRASEBOOK | config/phrasebook.example.json | å®ååçã»çŽæã®å¢çã®æèš |
MEETLIVE_STAGE | config/stage_resources.example.json | èå°ã«åºãããã®(URLã»ç»åã»å£°ã§åŒã¶èª) |
MEETLIVE_KNOWLEDGE_DIR | config/ | answerer ã®æ¥å°è³æãã£ã¬ã¯ããªãðŽãã®çŽäžã® .md/.txt ãååé ã«å
šéšèªã¿ããã®ãŸãŸLLMãžéã(§2.1) |
MEETLIVE_SCRIPT_NAME | talk_script.example.md | æ¥å°è³æã®ãã¡å
é ã«çœ®ãå°æ¬ã®ãã¡ã€ã«å |
2.1 ðŽ MEETLIVE_KNOWLEDGE_DIR ã«äœã眮ããã¯ããã®ãŸãŸãLLMãžéããã®ããæ±ºãã
answerer.py ã¯ãã®ãã£ã¬ã¯ããªçŽäžã® .md / .txt ãååé ã«å
šéšèªã¿ã
äžé(MEETLIVE_KNOWLEDGE_PER_FILE / _TOTAL)ãŸã§éèªã§ããã³ãããžèŒããã
ãã¡ã€ã«åã® allowlist ã¯æã£ãŠããªãã眮ãããã®ã¯éãããã
ãããã£ãŠãæ¡ä»¶ãã©ã«ãããŸãããšæããªãããšãå€ä»ãã®æ€èšã¡ã¢ã»ç€Ÿå
ã®äžæžãã»
çžæã«èŠããããªã倿ã®èšé²ãåãéå±€ã«ããã°ããããäžç·ã«éãããã
export MEETLIVE_KNOWLEDGE_DIR=/path/to/projects/acme
mkdir -p /path/to/projects/acme/meetlive_knowledge
cp talk_script.md requirements.md minutes_prev.md /path/to/projects/acme/meetlive_knowledge/
export MEETLIVE_KNOWLEDGE_DIR=/path/to/projects/acme/meetlive_knowledge
ãµããã£ã¬ã¯ããªã¯èªãŸãªã(çŽäžã ã)ãæ¡åŒµåã .md / .txt 以å€ã®ãã®ãèªãŸãªãã
äŒè°ã®äžèº«
| 倿° | æ¢å® | æå³ |
|---|
MEETLIVE_CALL_WORDS | ã³ãã€ããã,ãã±ããã£ãš,ç§æž,ã²ãã | åŒã³ããèª(ã«ã³ãåºåã)ãSTT ã®èª€å€æã®ç¶Žãã䞊ã¹ã |
MEETLIVE_COUNTERPART | çžæ | çžæã®åŒã³æ¹(ããã³ããå
ã§äœ¿ããäŸ:ãããããã) |
MEETLIVE_HOST_LABEL | é²è¡åœ¹ | ãã¡ãåŽã®åŒã³æ¹(ããã³ããå
ã§äœ¿ã) |
MEETLIVE_MODE_START_WORD | ååžéå§ | ååžã®éå§åå³ |
MEETLIVE_MODE_END_WORD | ååžçµäº | ååžã®çµäºåå³ |
MEETLIVE_START_HOMOPHONES | (空) | éå§åå³ã STT ã§åããç¶Žããå®éã«åããèªãè¶³ã |
MEETLIVE_PREMISE_IDS | (空âå°åž³ã®å
é Nä»¶) | ç£èŠããäºå®idã®ã«ã³ãåºåã |
MEETLIVE_PREMISE_MAX | 16 | id æªæå®ã®ãšãå°åž³ããåãä»¶æ°ã®äžé |
MEETLIVE_PREMISE_COOLDOWN | 45 | åçš®ã®åæã«ãŒããéåŒãç§æ° |
ã¢ãã«ã»æ¥ç¶
| 倿° | æ¢å® | æå³ |
|---|
MEETLIVE_MODEL_PREMISE / _EFFORT_PREMISE | claude-sonnet-5 / medium | åæç£èŠ(éç£åŒã³åºã) |
MEETLIVE_MODEL_PREMISE_FALLBACK / _EFFORT_PREMISE_FALLBACK | claude-opus-5 / medium | æ¢å®ã空ãè¿ãããšãã ã1å |
MEETLIVE_MODEL_ANSWER / _EFFORT_ANSWER | claude-opus-5 / low | å°æ¬å€ã®åç(äžçºåŒã³åºã) |
MEETLIVE_MODEL_ANSWER_FALLBACK / _EFFORT_ANSWER_FALLBACK | claude-sonnet-5 / low | åäžã®ãã©ãŒã«ãã㯠|
MEETLIVE_KNOWLEDGE_PER_FILE / _TOTAL | 9000 / 40000 | æ¥å°è³æã®æåæ°äžé |
MEETLIVE_TOKEN | (空) | åæ©ãšã®åèšèãreceiver.py --token ã®æ¢å®å€ |
DEEPGRAM_API_KEY / OPENAI_API_KEY | â | 䜿ã STT ããã¯ãšã³ãã«å¿ããŠå¿
é |
3. ã»ããã¢ãã
3.1 åæ
- 芪æ©: Linux ãŸã㯠WSL2ãPython 3.9+ã
claude CLI ã PATH ã«ãããèªèšŒæžã¿ã§ããããš
(premise_watch.py / answerer.py 㯠claude -p <prompt> --model <m> --effort <e> ã
ãµãããã»ã¹ã§å©ããCLI ãç¡ããšããã®2ã€ã¯é»ã£ãŠäœãåºããªã)
- åæ©: Windows ããŒãPCãPython 3.9+(
setup.cmd ãç¡ããã° winget ã§å
¥ãã)
- 2å°ãã€ãªãç¶²: åæ©ãã芪æ©ã® TCP ããŒããžå±ãããšãå®éçšã§ã¯ tailscale çã®
ãã©ã€ããŒãç¶²ãæ³å®ãåã LAN å
ãªã LAN ã® IP ã§ãã
- STT ã® API ããŒ: Deepgram(
DEEPGRAM_API_KEY)ãŸã㯠OpenAI(OPENAI_API_KEY)ã
ããŒç¡ãã§ã --backend stub ã§é
ç®¡ã®æ€èšŒã ãã¯ã§ãã(çºè©±åºéãæ€ç¥ããŠ
[STUB] host ã®çºè©± 1.2ç§ ã®ãããªè¡ã transcript ãžæžãã話è
ã»æå»ã»é
å»¶ã»
jsonl ã®åœ¢åŒã¯æ¬çªãšå®å
šã«åãçµè·¯ãéã)
- ã€ã€ãã³ïŒã€ã€ã¢ã(§0ãèªãããšãä»»æã§ã¯ãªã)
3.2 芪æ©ã®ã»ããã¢ãã
cd <ãã®ã¹ãã«ã® scripts/ ã眮ããå Žæ>
python3 -m venv venv
./venv/bin/pip install numpy websockets pyyaml
äŸåã¯ããã ã(å®éã® import ããæ°ãããã®):
| éšå | ã©ãã§äœ¿ãã |
|---|
numpy | receiver.py(ãªãµã³ãã©ã»é³é枬å®)ãstt.py(VADã»PCM倿) |
websockets | stt.py ã® OpenAI / Deepgram ããã¯ãšã³ã(颿°ã®äžã§ import ããŠãã) |
pyyaml | premise_watch.py ãäºå®å°åž³ãèªã |
copilot.py / viewer2.py / answerer.py / action_log.py / meetlive_config.py ã¯
æšæºã©ã€ãã©ãªã ãã§åãã
export MEETLIVE_DIR=$PWD/meetlive_state/2026-01-20-acme
export MEETLIVE_LEDGER=/path/to/projects/acme/ledgers/ledger.yaml
export MEETLIVE_AGENDA=/path/to/projects/acme/agenda_steps.json
export MEETLIVE_SCRIPT=/path/to/projects/acme/talk_script.md
export MEETLIVE_PHRASEBOOK=/path/to/projects/acme/phrasebook.json
export MEETLIVE_STAGE=/path/to/projects/acme/stage_resources.json
export MEETLIVE_KNOWLEDGE_DIR=/path/to/projects/acme/meetlive_knowledge
export MEETLIVE_SCRIPT_NAME=talk_script.md
export MEETLIVE_COUNTERPART="ãããã"
export MEETLIVE_CALL_WORDS="ã³ãã€ããã,ãã±ããã£ãš,ç§æž,ã²ãã"
export MEETLIVE_TOKEN="$(openssl rand -base64 18)"
export DEEPGRAM_API_KEY=...
./venv/bin/python copilot.py --selfcheck
--selfcheck ã¯æ®µåãã»å°æ¬ã»èªåœéã»èå°ã®è³æºãèªãã§ä»¶æ°ãåºããŠçµããã
â MEETLIVE_XXX ãæªèšå®ã§ãã忢±ã®äŸãèªã¿ãŸã ãåºããããã®ç°å¢å€æ°ã
å¹ããŠããªã(=æ¶ç©ºã®äŸã®ãŸãŸäŒè°ã«å
¥ããšããã ã£ã)ã
./venv/bin/python receiver.py --backend deepgram --port 47311 >> receiver.log 2>&1 &
./venv/bin/python copilot.py --start 2026-01-20T15:00:00 >> copilot.log 2>&1 &
./venv/bin/python viewer2.py --start 2026-01-20T15:00:00 --port 47323 >> viewer2.log 2>&1 &
èµ·åé ã«ã€ããŠïŒæ£ç¢ºã«ïŒ
硬ãå¶çŽã¯1ã€ã ã: receiver.py ãåŸ
ã¡åããŠããªããšåæ©ã¯ç¹ãããªã
(ç¹ãããªãéãåæ©ã¯æå€§30ç§ãŸã§åŸ
ã¡æéã䌞ã°ããŠç¹°ãè¿ã詊ã)ã
ã ãã receiver ãå
ã«äžããã
copilot.py ãš viewer2.py ã®éã«ã¯é åºã®å¶çŽã¯ç¡ããã©ã¡ããåã
transcript.jsonl ãç¬ç«ã«èªã¿ãåãåŒã§æ®µãèšç®ããã ãã ããã§ããã
ãã ãæ¬¡ã®2ã€ã¯å®ããªããšãç»é¢ãšçªäººãé£ãéã:
-
--start ã copilot ãš viewer2 ã§åãå€ã«ãããçµéæéã»äºå®æå»ã»è¶
éå€å®ã
ãã®å€åºæºã(receiver.py ã« --start ã¯ç¡ããéèªãæžãã ããªã®ã§èŠããªã)
-
MEETLIVE_AGENDA ãåããã¡ã€ã«ã«ããç·šéããã copilot ãš viewer2 ã®
äž¡æ¹ãäžãçŽãã
copilot.py ã¯æ®µåãJSONãèµ·åæã«1åã ãèªã
viewer2.py ã¯ãäžæ®µã«åºãå°æ¬ãããã¯ã ãã¯æ¯ãªã¯ãšã¹ãèªã¿çŽããã
段ã®å€å®ã«äœ¿ã段åãã¯èµ·åæã«èªãã ãã®ã䜿ãç¶ãã
(ããã ãèªã¿çŽããšãçªäººãæã€å€ãããŒã¯ãŒããšæ®µã®å€å®ããºã¬ããã)
çæ¹ã ãäžãçŽããšãäžæ®µã®ã«ãŒãã«æžãããæ®µçªå·ãšäžæ®µã®æ®µçªå·ããºã¬ãã
3.3 åæ©(Windows)ã®ã»ããã¢ãã
scripts/portable/ ã®äžèº«ãããã®ãŸãŸããŒãPCãžæã£ãŠãã(zip ã§ãã)ã
setup.cmd ãããã«ã¯ãªãã¯(ååã ãã»2ã3å)
- Python ãæ¢ããç¡ããã° winget ã§å
¥ãã
venv/ ãäœããsoundcard ãš numpy ãå
¥ãã
config.txt.example ã config.txt ãžã³ããŒããã¡ã¢åž³ã§éã
config.txt ãæžãæãã
host=<芪æ©ã®ã¢ãã¬ã¹> â ãã©ã€ããŒãç¶²ã®IP
port=47311 â receiver.py --port ãšåã
token=<芪æ©ãšåãåèšè> â MEETLIVE_TOKEN ãšåãå€
rate=16000
mic_match= â ä»»æã§6 ãèŠã
ðŽ config.txt ã¯èŠªæ©ã®ã¢ãã¬ã¹ãšåèšèãå¹³æã§å
¥ããã¡ã€ã«ã
git ã«å
¥ããªãã»ä»äººã«æž¡ããªããé
ãã®ã¯ config.txt.example ã®æ¹ã ãã
äŸã®ãŸãŸ(CHANGE_ME...)ã§èµ·åãããšããã®å Žã§æ¢ãŸã£ãŠäœãçŽããåºãã
- ã€ã€ãã³ãæ¿ã(START.bat ããå
ã«ã§0)
START.bat ãããã«ã¯ãªã㯠â çªã2ã€éã
MIC (agent_mic) - my voice ⊠[mic-only] æ¥ç¶OK -> éä¿¡äž ãåºãã°æå
LOOP (agent_loop) - other side ⊠[loop-only] connected OK -> sending ãåºãã°æå
- 2ã€ãšãåºãŠåããŠæåãçæ¹ã ãã ãšçåŽã®å£°ãäžžããšèœã¡ã
- 芪æ©åŽã®ãã°ã«ã
++ host æ¥ç¶ ++ guest æ¥ç¶ ãåºã
- æ¢ãããšãã¯
STOP.bat(ãŸãã¯2ã€ã®çªãéãã)
portable/ ã®äžèº«:
| ãã¡ã€ã« | åœ¹å² |
|---|
agent_mic.py | èªåã®å£°ãæšå¥šçµè·¯ãããã€ã¹åæãã«ãŒãããã¯ãããªãæå°ç |
agent_loop.py | çžæã®å£°(WASAPI ã«ãŒãããã¯)ãv10ãé²é³ã¹ã¬ãããšéä¿¡ã«ãŒããåããŠãã |
agent_loop_v9.py | äžã®æ§çãç¡é³ãç¶ããš1ãã€ããéããªãã®ã§å®éçšäžå¯ãããã€ã¹ãéãããã®åãåãçš |
agent.py | 2系統ã1ããã»ã¹ã§æ±ãç°¡æçãçæ¹ãèœã¡ããšäž¡æ¹æ»ã¬ã®ã§éæšå¥š |
agent_common.py | config.txt ã®èªã¿èŸŒã¿(æ¥ç¶å
ã®æ¢å®å€ãã³ãŒãã«æããªã) |
START.bat / start_all.ps1 | MICçªãšLOOPçªãéãã©ã³ãã£ãLOOPçªã¯èœã¡ãã3ç§åŸã«èªååèµ·å |
STOP.bat / stop.cmd | æ¢ãã |
setup.cmd / start.cmd | ååã»ããã¢ãã / agent.py ã®èµ·å |
config.txt.example | èšå®ã®é圢 |
æé .txt | åæ©ã䜿ãäººãžæž¡ãæé æž(ãã® SKILL.md ãèªãŸãªã人åã) |
åæ©ãšèŠªæ©ãã€ãªãç·ã®ä»æ§
èªåã®åã蟌ã¿ããã°ã©ã ãæžããªãããã«åãããã
æ¥ç¶çŽåŸã« JSON 1è¡ + "\n":
{"ch":"T","rate":16000,"token":"åèšè"}
ch = "T"(ãã¡ãã®ãã€ã¯) / "G"(çžæåŽã®ã«ãŒãããã¯)
以éããè¿ã:
struct "<dI" = (åæ©ã®æå» float64, ç¶ã PCM ã®ãã€ãæ° uint32) + PCM int16 LE mono
åæ©ã®æå»ã¯åèå€ã§ã芪æ©ã¯äœ¿ããªãã芪æ©ã¯ãåãåã£ããµã³ãã«æ°ãã ãã§
æéãé²ãã(WSL2 ã§ã¯ time.time() ããã¹ãååæã§å·»ãæ»ããtime.monotonic() ã
宿éããçŽ7%éãããšãã宿ž¬ããã£ãããã48kHz ã®æ°Žæ¶ã§å»ãŸããé³ã®ãµã³ãã«æ°ã ãã
æ£ããæéãæã£ãŠãã)ã
ã ããåæ©åŽã¯ãç¡é³ã®éãç¡é³ãµã³ãã«ãéãç¶ããªããã°ãªããªãã
éããªããšãã®ãã£ã³ãã«ã®æå»ã ãã宿éããé
ããŠããã
4. äœ¿ãæ¹
4.1 2ã€ã®ç»é¢ã®éãïŒåãéãããšäºæ
ãïŒ
| ã«ã³ãç»é¢ | èå°ç»é¢ |
|---|
| URL | http://<芪æ©>:47323/ | http://<芪æ©>:47323/stage/... |
| 誰ãèŠãã | èªåã ããã¹ããïŒæºåž¯ãã£ã¹ãã¬ã€ã§èŠã | çžæããããç»é¢å
±æãã |
| äžèº« | 段ã®äžèЧã»å°æ¬ã»ã«ãŒãã»èå°ã®æçžŠãã¿ã³ | è³æº1æã ã(é»ç»é¢ã»ã¹ã©ã€ãã»ç»åãªã©) |
èå°ã¯ window.open(url, 'meetlive_stage') ã§éãååä»ãã®1æã®çªã
å
±æããã®ã¯ãã®çªã ãã§ãäžèº«ã声ããã¿ã³ã§åãæ¿ããã
iframe ã¯äœ¿ã£ãŠããªã(çžæå
ãµã€ãã x-frame-options: DENY ã ã£ããããã°ã€ã³
cookie ã SameSite=lax ã ã£ããããŠäžèº«ãåºãªããã)ã
ã«ã³ãç»é¢ãPCã«åºããšç»é¢å
±æã«æ ã蟌ãã®ã§ãã«ã³ãã¯ã¹ããã§èŠãã
?theme=washitsu ãä»ãããšå颚ã®èŠãç®ã«ãªã(æ¢å®ã¯æãé
è²)ã
4.2 äŒè°ã®æµã
- åæ©ã®2çªããéä¿¡äžãã«ãªã£ãŠããã®ã確èªãã
- ã«ã³ãç»é¢ãã¹ããã§éã
- èå°ã䜿ããªããã«ã³ãç»é¢ã®ãð èå°ãéãããæŒããŠå¥çªãåºãããããç»é¢å
±æãã
- ãååžéå§ããšå£°ã«åºã â ããã§çªäººã®ç¶æ
ããªã»ããããã
(åå€ã®ãªãçºè©±ããã¹ãè¡ãæ¬çªã«æã¡èŸŒãŸãªãããããã®åå³ãç¡ããšã
èµ·åæã«èªãã å€ãéèªã段ã®å€å®ã«æ··ãã)
- äŒè°äžã«äœ¿ãã声ã®ã³ãã³ã:
<åŒã³ããèª>ãæ¬¡ / <åŒã³ããèª>ãæ»ã£ãŠ âŠ æ®µãæã§éãïŒæ»ã
<åŒã³ããèª>ãæé ⊠çµéã»æ®ãã»ããŸã®æ®µã®äºå®æ
<åŒã³ããèª>ãææã¯ âŠ å¿
é ååŸç©ã®æªéäžèЧ
<åŒã³ããèª>ãã¹ã©ã€ã ⊠èå°ãåãæ¿ãã(èªã¯ stage_resources.json ã® match)
<åŒã³ããèª>ãèå°æ¶ã㊠⊠èå°ãé»ç»é¢ã«æ»ã
- ããä»¥å€ âŠ å°æ¬ã𿮵åãã®å
šææ€çŽ¢ãåœãããªããã°ãæå
ã«ãããŸããã
- ãååžçµäºããšèšã â éèªã«åºåããå
¥ã(å€å®ã¯ç¶ããç¶æ
ã¯ä¿æããã)
- åæ©ã®
STOP.batã芪æ©ã®ããã»ã¹ãæ¢ãã
4.3 äŒè°ã®ããš â äœããããæ€èšŒãã
MEETLIVE_DIR=$PWD/meetlive_state/2026-01-20-acme \
python3 action_log.py --date 2026-01-20 --md action_log_0120.md
ã«ãŒãçºç«ã»èå°åæ¿ã»åæç£èŠã®å€å®ã»æ®µã®é²è¡ãã1æ¬ã®æå»é ã®å¹Žè¡šã«ããã
--kind card ãªã©ã§çš®å¥ãçµããã--from-time / --to-time ã§å®éå§ã§åããã
ããã¯é£Ÿãã§ã¯ãªãããã¢ãã¿ã鳎ããç¶ãããã®å¬ä¿ã¯ã誀æ€ç¥ã ã£ãã®ãã
æ¬åœã«æªéã ã£ãã®ãããåŸãã確ãããå¯äžã®ææ®µã§ãã(§5.4)ã
幎衚㚠transcript.jsonl ã䞊ã¹ãŠèªãããšã
5. 宿Šã§åŸãèšèšç¥èŠ
ããã¯ãããæ±ºããçç±ããæ®ãç¯ãåã穎ãæãçŽããªãããã«æžããŠããã
5.1 ðŽ è°äºé²AIã®èŠçŽãå
¥åã«äœ¿ããªããéèªã®çãã°ã ããä¿¡ãã
Gemini çã®è°äºé²AIãåºãèŠçŽããã¢ãã¿ãå°åž³ã®å
¥åã«äœ¿ã£ãŠã¯ãªããªãã
宿ž¬ã§ãèŠçŽããåã£ãé
ç®ã¯10ä»¶äž4ä»¶ããæ£ãããªãã£ãã
ææªã®å£ãæ¹ã¯ãçå圢ãçŽæã«æ Œäžããããââçžæãããã§ããŸããïŒããšèããã ãã®
ãã®ããèŠçŽã§ã¯ããããããšã§åæãã«ãªãããããäºå®å°åž³ã«å
¥ããšãåæç£èŠã¯
ééã£ãåæãåºæºã«ãççŸããå€å®ãå§ããã
ãã®éå
·ã®é
ç®¡ã¯æåãããããªã£ãŠãã: receiver.py ã STT ã®ç¢ºå®çºè©±ã ãã
transcript.jsonl ãžè¿œèšããcopilot.py ã¯ããã tail ãããèŠçŽãå
¥ãééãç¡ãã
äŒè°åŸã®å°åž³æŽæ°ã§ãåãèŠåŸãå®ãããš(èŠçŽã¯çŽ¢åŒãšããŠãªã䜿ã£ãŠããã
é
管ã«ã¯äœ¿ããªã)ã
5.2 åæç£èŠã¯éç£åŒã³åºãã«ãªããæ¢å®ãå®ãã¢ãã«ã«çœ®ã
premise_watch.py ã¯çžæã®çºè©±1ä»¶ããšã«1ååŒã°ãã(copilot.call_premise_watch)ã
宿ž¬ã§ 50åã®äŒè°ã§218åãããã«äžäœã¢ãã«ã眮ããšã¯ã©ãŒã¿ã®åºãæããã
ã ããæ¢å®ã¯ Sonnet çžåœã»--effort mediumãç°åžžæ(空ãè¿ã£ããšã)ã ãäžäœã¢ãã«ãž
1åãã©ãŒã«ããã¯ãã圢ã«ããŠããã
åŒã¶åæ°ãæžããæ¹åã§ç¯çŽããªãããšã çºè©±ããã£ã«ã¿ã§éåŒããšç²ŸåºŠãèœã¡ãââ
äŒè©±ã¯éåãéåãã§ãæçãæŸããªããšæèãç¹ãããªããåŒã¶é »åºŠã¯å€ãããå䟡ãäžããã
察ç
§çã« answerer.py ã¯å°æ¬å€ã®è³ªåã®ãšãã ãã»30ç§ã«1åãŸã§(ANSWERER_MIN_GAP)ã®
äžçºåŒã³åºããªã®ã§ãäžäœã¢ãã«ã眮ããŠããã
éç£åŒã³åºããäžçºåŒã³åºããã§ã眮ãã¢ãã«ãåããã®ãååã
5.3 ðŽ ã€ã€ãã³ïŒã€ã€ã¢ãã¯å¿
é ãä»»æã§ã¯ãªã
§0 ã«æžãããšããã話è
åé¢ãç©çãã£ã³ãã«ã§ãã£ãŠãã以äžã
ã¹ããŒã«ãŒã§çžæã®å£°ã鳎ãããç¬éã«åå°ã厩ããã--xtalk-gate ã¯ä¿éºã
5.4 ðŽ å¿
é ååŸç©ã®æ€ç¥ããŒã¯ãŒãã¯ãå®éã®äŒè©±ã§è©Šããªããšæ©èœããªã
unmet() ã¯ããã®å¿
é ååŸç©ã®æ€ç¥ããŒã¯ãŒã(æ£èŠè¡šçŸ)ããèç©ããçºè©±å
šæã«
1ã€ãåœãããªãããšãã«æªéãšã¿ãªããã€ãŸãããŒã¯ãŒããå®éã®èšãåãã«
åœãããªããã°ãæ°žé ã«æªéã®ãŸãŸå¬ä¿ã鳎ãç¶ããã
å®éã«ã18åéãã£ãšåãå¬ä¿ã鳎ãç¶ããäŒè°ããã£ãã
ãã ãââããšã§éèªãšçªãåãããããããã¯èª€æ€ç¥ã§ã¯ãªããæ¬åœã«æªéã ã£ãã
ã¢ãã¿ã¯æ£ãã鳎ããç¶ããŠããã
ãããäž¡é¢ã§ããã
ã¢ãã¿ã¯ãããŒã¯ãŒãèšèšãæªãããšãæ¬åœã«åããŠããªãããåºå¥ã§ããªãã
ã©ã¡ããåãã鳎ãç¶ããããšããŠåºãŠããã
ãããã£ãŠ:
- ããŒã¯ãŒãèšèšããµãããšãçå®ã鳎ããç¶ããã ãã®è£
眮ã«ããªããã
(鳎ã£ãŠããããšèªäœã¯æ
å ±éãŒããåå ã2ã€ããã®ã§)
- æ£èŠè¡šçŸãšããŠåœããã®ã§ãèšãæãã
| ã§äžŠã¹ãŠããã®ãå®çšçã
äŸ: "(ææ«|æ¥ææ«|æ«æ¥)ãŸã§"
- äŒè°ã®åã«ãæ³å®ãããçžæã®èšãåãã声ã«åºããŠ1床éãããš
- äŒè°ã®åŸã«ãå¿
ã
action_log.py ã®å¹Žè¡šãšéèªãçªãåããã
ã鳎ã£ãŠããå¬ä¿ã¯ã©ã¡ãã ã£ãã®ãããå€å®ããŠãããŒã¯ãŒããžåæ ãã
äŒè°1åããšã«ãããåããªããšãããŒã¯ãŒãã¯æ°žé ã«ãã¥ãŒãã³ã°ãããªãã
5.5 ðŽ æ¡ä»¶ãç§»ããšãã¯ãå¿
ãç¶æ
ãã£ã¬ã¯ããª(MEETLIVE_DIR)ãéé¢ãã
åããã£ã¬ã¯ããªã䜿ãåããšãéå»ã®äŒè°ã®éèªã段ã®å€å®ã«æ··ããã
copilot.tail() ã¯èµ·åæã«æ¢åã® transcript.jsonl ãèªã¿ãçŽè¿ã®ãååžéå§ã以éã
ç¡èšã§åçããŠç¶æ
ã埩å
ãããviewer2.build_nav() ãéèªãåãè©°ããã«å
šéšèªã
(æ«å°ŸNè¡ã ãèŠããšãé·ãäŒè°ã§å€ãçºè©±ãçªããèœã¡ãŠæ®µãå·»ãæ»ããã)ã
ã€ãŸãå€ãéèªã¯æ¶ããã«å¹ãç¶ãããæ¡ä»¶ããšã»äŒè°ããšã«åããããšã
MEETLIVE_DIR=$PWD/meetlive_state/2026-01-20-acme
cards.jsonl / premise_watch.jsonl / stage_cmd.jsonl / display_log.jsonl ã
ãã¹ãŠããã«æºãŸãã®ã§ãéé¢ããŠãããšäŒè°åŸã®æ€èšŒããã®ãŸãŸæ¡ä»¶å¥ã«ãªãã
5.6 çªäººã¯åŒã°ãåŸ
ã¡ãããªãå±€ãæã€
åæçã¯ãåŒã°ãããçãããã ãã ã£ãããã®çµæãçžæãåæãèŠãçºèšãããŠãã
åŒã°ããªãéãäœãåºãªãã£ããåæç£èŠ(premise_watch.py)ã¯ãããçŽãããã«ã
çžæã®çºè©±ããšã«èªçºçã«æã€å±€ãšããŠè¶³ãããã®ã
å€å®ã¯3å€(ççŸâ / æ¢ç¥â / æ°èŠïŒ)ã§ãã«ãŒããåºããªãã£ãå€å®ãå«ããŠå
šä»¶
premise_watch.jsonl ã«æ®ããç»é¢ã«åºãªãã£ããããšãã£ãŠãå€å®ããŠããªãããã§ã¯ãªãã
5.7 äºå®å°åž³ã¯10ã20ä»¶ã«çµã
MEETLIVE_PREMISE_MAX ã®æ¢å®ã16ãªã®ã¯ãã®ãããå
šéšå
¥ãããšããã³ãããèšãã¿ã
ãççŸãã®å€å®ããŒãããŠé³Žããªããªãã仿¥ã®äŒè°ã§èŠããããå°ãäºå®ã ããéžã¶:
å¥çŽã»çŽæã®ç¯å²å¢çãçžæã®çŸç¶ã«ã€ããŠãã¡ããæ¡ã£ãŠããèªèãååæ±ºãŸã£ãããšã
6. èªåã®æ¡ä»¶ã«åããã â æžãã®ã¯3ãã¡ã€ã«
æäœéããã ãæžãã°åããæ®ã2ã€(phrasebook.json / stage_resources.json)ã¯
æ¢å®ã®ãŸãŸã§ãæç«ããã
6.1 ledger.yaml â äºå®å°åž³ïŒåæç£èŠã®åºæºïŒ
facts:
- id: F-001
title: çºæ³šã¯ä¿å®ãã§ãŒãºã®ã¿ãæ°èŠéçºã¯ä»åã®ç¯å²ã«å«ãŸãªã
- id: F-002
title: çžæå
ã®åšåº«ç®¡çã¯ä»ã衚èšç®ãœããã§ãæ
åœè
1åã«éäžããŠãã
id ãš title ã ãããã°ãã(ä»ã®åã¯äººéã®ç®¡ççš)ã
æ¢ã«3å°åž³(templates/context_ledgers_template.md)ãéçšããŠãããªãã
ãã® ledger.yaml ããã®ãŸãŸ MEETLIVE_LEDGER ã«æããã
title ã¯äžæã§èšãåãããšãããã«ã€ããŠãã®ãããªèŠåºãã ãšã
LLM ãççŸãå€å®ã§ããªãã
6.2 agenda_steps.json â æ®µãšå¿
é ååŸç©
{
"äŒè°å": 45,
"èŠå ±å": 10,
"steps": [
{
"id": "s1",
"title": "â çŸç¶ã®ç¢ºèª",
"ç®å®å": 10,
"æ€ç¥ããŒã¯ãŒã": ["ãŸãçŸç¶", "ããŸã®éçš"],
"å¿
é ååŸç©": [
{"åå": "çŸè¡ã®æ
åœè
æ°",
"æ€ç¥ããŒã¯ãŒã": ["(æ
åœ|éçš)(ã¯|ã)?\\s*\\d+\\s*(å|人)", "äžäººã§ãã£ãŠ"]}
],
"nudge": "çžæã«åãããããã¡ãã®æ¡ã¯ãŸã åºããªã",
"å°æ¬": ["ãŸããããŸã®éçšã確èªãããŠãã ããã"
- æ®µã®æ€ç¥ããŒã¯ãŒãã¯ãã¡ãåŽã®çºè©±ã«ã ãåœããã
â å°æ¬ã§å¿
ãå£ã«ããèªãéžã¶ãçžæãèšããããªèªãå
¥ãããšåæã«é²ã
- å¿
é ååŸç©ã®æ€ç¥ããŒã¯ãŒãã¯äž¡è
ã®çºè©±ã«åœãã(çããã®ã¯çžæãªã®ã§)
â ðŽ Â§5.4 ãèªãããšãããã®ãã¥ãŒãã³ã°ãå
šäœã®åœããå€ããæ±ºãã
- è±èªããŒ(
title / minutes / keywords / musts / name / script /
total_minutes / warn_at_minutes)ã§ãæžãã
6.3 talk_script.md â å°æ¬ïŒãã¬ããã³ãã¿ãŒã®äžèº«ïŒ
## ã1ã çŸç¶ã®ç¢ºèª
**ãŸããããŸã®éçšã確èªãããŠãã ããã**
### èãé çª
**ããŒã¿ã¯ãäœå¹Žåãããæ®ã£ãŠããŸããã** ïŒç§»è¡ç¯å²ã®èŠç©ãã«å¹ãïŒ
âž ãããããªãããšèšãããã â ãã§ã¯ãããŸã®çœ®ãæ¹ã§ä»®ã«äœã£ãŠãããŸãã
ïŒãæžããå°ããèãåºãïŒ
| è¡ã®åœ¢ | ç»é¢ã§ã®åºæ¹ |
|---|
## ãNã èŠåºã | 段N ã®å§ãŸããN 㯠agenda_steps.json ã®äžŠã³é (1å§ãŸã)ãšå¯Ÿå¿ |
**声ã«åºãæ** | 倧ãã衚瀺ãåŸãã«ç¶ãæåã¯å°ããæ³šèšã«ãªã |
### å°èŠåºã | 段ã®äžã®åºåã |
âž æ¡ä»¶ â èšãããš | æããããŸããåå² |
ïŒãæžãïŒã»è¡š | å°ããèãæ³šèš |
âž è¡ã®ããã§å²ãã éšåã¯ãçªäººããå°æ¬ãæ³å®ããŠããèšãåãããšããŠæŸãã
çžæããã®èšãæ¹ãããããçå笊ãç¡ããŠã第2å±€(answerer)ãåŒãã§ãããã®å€å®ææã«ãªãã
## ãNã 以å€ã® ## ç¯ã¯ãã¬ããã³ãã¿ãŒã«åºãªãã®ã§ãæºåã¡ã¢ã¯ãã¡ããžæžãã
6.4 åŒã³ããèªã¯ãèª€å€æã®ç¶Žãã䞊ã¹ã
export MEETLIVE_CALL_WORDS="ã³ãã€ããã,ãã±ããã£ãš,ã«ã¿ã«ã以å€ã®èª€å€æ,..."
STT ã¯åŒã³ããèªãé«ç¢ºçã§åããã1åã§ãåããç¶Žãã¯ããã®ãŸãŸè¶³ãã
éå§åå³ãåããå Žå㯠MEETLIVE_START_HOMOPHONES ã«è¶³ã(ãã¡ãã¯ãéå§/ã¹ã¿ãŒãããšã®
çµã¿åããã§ã®ã¿å¹ãã®ã§ãå€å°åºãå
¥ããŠãæŽçºãã«ãã)ã
7. ãã©ãã«ã·ã¥ãŒã
7.1 ããŒããåãŸã£ãŠãã / å·®ãæ¿ããã â kill ã䜿ããªã
3ã€ãšãèªåã§åžãè²ãä»çµã¿ãæã£ãŠããã®ã§ãããã»ã¹ãæã€å¿
èŠããªãã
| ããã»ã¹ | å·®ãæ¿ãæ¹ | ä»çµã¿ |
|---|
viewer2.py | curl http://127.0.0.1:47323/quit ããŠããæ°ããã®ãèµ·å | /quit ã¯localhost ããã®ã¿åãä»ãã0.3ç§åŸã«èªãçµäºãããå€ããæ¢ãããããšäŒè°äžã«äºæ
ãã®ã§ãã®å¶éããã |
copilot.py | æ°ããã®ããã®ãŸãŸèµ·åããã ã | èµ·åæã« <state>/copilot.owner ãžèªåã®pidãæžããå€ãæ¹ã¯æ¬¡ã®ããŒãªã³ã°(0.3ç§)ã§æã¡äž»ãå€ãã£ãã®ã«æ°ã¥ããèªåããéãã |
receiver.py | allow_reuse_address ãç«ã£ãŠããã®ã§ãæ¢ããçŽåŸã«äžãçŽãã | åæ©ã®äºéæ¥ç¶ãåæ§ã«ãæ°ããæ¥ç¶ãå€ãæ¥ç¶ãæã¡åã£ãŠå·®ãæ¿ãã(åãæ®ãããããšå
šè¡ãäºéã«åºããã) |
kill -9 ã§èœãšããšãcopilot.owner ã«æ»ãã pidãæ®ã£ãããç¶æ
ãã¡ã€ã«ãäžéå端ã«
ãªã£ãããããäžã®çµè·¯ã䜿ãããšã
7.2 é³ãå±ããªã â 確èªã®é åº
- åæ©ã®2çªã«
æ¥ç¶OK -> éä¿¡äž / connected OK -> sending ãåºãŠããã
- åºãŠããªã â
config.txt ã® host / portããã©ã€ããŒãç¶²ã®æ¥ç¶ãèŠã
åèšèãéã ã芪æ©ã®ãã°ã«åºã â token ã芪æ©ãšäžèŽããŠããªã
- 芪æ©ã®ãã°ã«
++ host æ¥ç¶ ++ guest æ¥ç¶ ãäž¡æ¹åºãŠããã
<state>/transcript.jsonl ãå¢ããŠããã
- å¢ããªã â STT ã®ããŒ(
DEEPGRAM_API_KEY / OPENAI_API_KEY)ã確èª
- åãåã:
--backend stub ã§äžãçŽããããŒç¡ãã§ [STUB] ... ã®çºè©± Nç§ ã
åºããªããé
管ã¯çããŠã㊠STT ã ããåé¡ãšåãã
- çåŽã ãå
¥ããªã
- çžæã®å£°ã ãå
¥ããªã â äŒè°ã¢ããªã®é³ãåºãŠããããã€ã¹ããæ¢å®ã®ã¹ããŒã«ãŒããã
ã€ã€ãã³ãæ¿ãçŽããã
START.bat ãå©ãçŽã(åã蟌ã¿å
ã¯èµ·åæã«æ±ºãŸã)
- èªåã®å£°ã ãå
¥ããªã â æ¢å®ã®ãã€ã¯ã確èªãæ¢å®ãã€ã¯ã Bluetooth æ©åšã ãš
ååŸæã«ãã€ãã£ãå±€ããšèœã¡ãããšãããããã®å Žåã¯
config.txt ã®
mic_match ã«å
èµãã€ã¯åã®äžéšãæžããŠæåãã
- æåãäºéã«åºã â åæ©ã2ã€åããŠããã
STOP.bat ããŠãã START.bat
7.3 ã«ãŒããåºãªã â 確èªã®ç®æ
MEETLIVE_DIR ã copilot ãš viewer2 ã§åããã
copilot.py 㯠<state>/cards.jsonl ãžæžããviewer2.py ã¯åããã¡ã€ã«ã®æ«å°Ÿ40è¡ãèªãã
ãããé£ãéããšãçªäººã¯åããŠããã®ã«ç»é¢ã«ã¯æ°žé ã«äœãåºãªã
<state>/cards.jsonl ã«è¡ãå¢ããŠããã
- å¢ããŠãã â 衚瀺åŽã®åé¡ãã«ãŒãã¯
ttl ç§ã§æ¶ããæ°ããçºè©±ã2ã€æ¥ãŠãæ¶ãã
(ãã ãåºããŠããæäœ8ç§ã¯æ®ã)ãäŒè©±ãéãåºéã§ã¯èŠéãããã
- å¢ããŠããªã â
copilot.log ãèŠããCARD ã®è¡ãåºãŠããªããã°å€å®ã«éããŠããªã
- åæã«ãŒããåºãªã
<state>/premise_watch.jsonl ãèŠããã«ãŒããåºããªãã£ãå€å®ãå
šä»¶æ®ã£ãŠãã
type: ãªã ã°ãã â äºå®å°åž³ã® title ãèŠåºã調ã§ãççŸãå€å®ã§ããŠããªã
debounced: true ã°ãã â åçš®ã®é£çºã45ç§ã§éåŒããŠãã(MEETLIVE_PREMISE_COOLDOWN)
- ãã¡ã€ã«èªäœã空 â
claude CLI ã PATH ã«ç¡ã / èªèšŒãåããŠããã
æã§ python3 premise_watch.py "ãã¹ãã®çºè©±" ãå©ããŠç¢ºããã
- å°æ¬å€ã®è³ªåã«çããªã
- çºç«æ¡ä»¶ãå³ãã: ãæç¢ºãªçå圢ã®èªå°Ÿ ã〠30å以äžããŸãã¯
ãå°æ¬ã®
âž è¡ãæ³å®ããŠããèšãåããã®ã©ã¡ãããããã30ç§ã«1åãŸã§
- ããã¯æå³çã«å³ããããŠãã(ç·©ãããšçžæã®èšãããæçã§æã¡ãŸããã
ç»é¢ãã«ãŒãã§åãŸã£ãŠå°æ¬ãèªããªããªã)
<state>/answerer_log.jsonl ã«ãã«ãŒããåºããªãã£ããæå
ã«ãªãããå«ããŠå
šä»¶æ®ã
- 段ãé²ãŸãªã / åæã«é²ã
- æ®µã®æ€ç¥ããŒã¯ãŒãã¯ãã¡ãåŽã®çºè©±ã«ã ãåœãããã€ã€ãã³ãããŠããªããš
çžæã®å£°ã
host ãšããŠå
¥ããåæã«é²ã(§0)
<åŒã³ããèª>ãæ¬¡ ã§æã§éãããæåã®éãã¯èªåå€å®ã«å ç®ããã
7.4 äŒè°åã®ç¹æ€ïŒ1åïŒ
python3 copilot.py --selfcheck
python3 premise_watch.py "ãã¹ãã®çºè©±ã§ã"
--selfcheck ã§ â ... æªèšå®ã§ãã忢±ã®äŸãèªã¿ãŸã ã1è¡ã§ãåºããã
æ¶ç©ºã®äŸã®ãŸãŸæ¬çªã«å
¥ããšããã ã£ããšããããšãç°å¢å€æ°ãèŠçŽãã
8. åé²ç©
meeting-copilot/
âââ SKILL.md
âââ config/ ⊠å
šéšãæ¶ç©ºã®æ¡ä»¶ãã®äŸãäžèº«ãå
¥ãæ¿ããŠäœ¿ã
â âââ ledger.yaml.example ⊠äºå®å°åž³(åæç£èŠã®åºæº)
â âââ agenda_steps.example.json ⊠段ãšå¿
é ååŸç©
â âââ talk_script.example.md âŠ å°æ¬(ãã¬ããã³ãã¿ãŒã®äžèº«)
â âââ phrasebook.example.json ⊠å®ååçã»çŽæã®å¢çã®æèš
â âââ stage_resources.example.json ⊠èå°ã«åºãããã®
âââ scripts/
âââ meetlive_config.py ⊠眮ãå Žãšèšå®ã®è§£æ±º(æ¢å®ã®äžå
管ç)
âââ receiver.py ⊠é³ãåããŠéèªãž
âââ stt.py ⊠STTã¢ããã¿(stub / OpenAI / Deepgram)
âââ copilot.py ⊠çªäºº(第1å±€ã»LLMç¡ã)
âââ premise_watch.py ⊠åæç£èŠ(éç£åŒã³åºã)
âââ answerer.py âŠ å°æ¬å€ã®åç(äžçºåŒã³åºã)
âââ viewer2.py ⊠ã«ã³ãç»é¢ + èå°ç»é¢
âââ action_log.py ⊠äŒè°åŸã®è¡å幎衚
âââ portable/ âŠ åæ©(Windows)äžåŒãããŒãPCãžæã£ãŠãã
âââ agent_mic.py / agent_loop.py / agent_loop_v9.py / agent.py
âââ agent_common.py
âââ START.bat / STOP.bat / start_all.ps1
âââ setup.cmd / start.cmd / stop.cmd / agent_loop.cmd
âââ config.txt.example ⊠ðŽ å®ç©(config.txt)ã¯ã³ãããããªã
âââ æé .txt âŠ åæ©ã䜿ãäººãžæž¡ãæé æž
ãã®äžåŒã«æ¡ä»¶ã®ããŒã¿ã¯å
¥ã£ãŠããªãã 顧客åã»URLã»åèšèã»éé¡ã»å®åšã®ãã¹ã¯
ãã¹ãŠèšå®ãã¡ã€ã«åŽã«ãããèšå®ãã¡ã€ã«ã®å®ç©ã¯ãã®ã¹ãã«ã®å€ã«çœ®ãã