အသံ ထပ်တင်ခြင်း လုပ်ဆောင်မှု အဆင့်များ (macOS)¶
Audience: macOS app contributors. Goal: wake‑word နှင့် push‑to‑talk တိုက်ဆိုင်နေချိန်တွင် voice overlay ကို ခန့်မှန်းနိုင်အောင် ထိန်းထားရန်။
လက်ရှိ ရည်ရွယ်ချက်¶
- Wake‑word ကြောင့် overlay မြင်နေပြီးသားဖြစ်သောအချိန် အသုံးပြုသူက hotkey ကို နှိပ်ပါက hotkey session သည် ရှိပြီးသားစာသားကို လက်ခံယူ သုံးစွဲပြီး reset မလုပ်ပါ။ Hotkey ကို ဖိထားသည့်အချိန်အတွင်း overlay သည် ဆက်လက် ပြနေပါသည်။ အသုံးပြုသူ လွှတ်ချလိုက်သည့်အခါ: trim လုပ်ပြီးသား စာသားရှိပါက ပို့ပြီး မရှိပါက ပယ်ဖျက်သည်။
- wake-word တစ်ခုတည်းသာ အသုံးပြုပါက အသံမရှိတော့သည့်အချိန်တွင် အလိုအလျောက် ပို့မည်၊ push-to-talk သည် လွှတ်ချင်းချင်း ပို့မည်။
အကောင်အထည်ဖော်ပြီးသား (Dec 9, 2025)¶
- Overlay session များတွင် capture တစ်ကြိမ်စီအတွက် token (wake‑word သို့မဟုတ် push‑to‑talk) ကို ထည့်သွင်းထားသည်။ Token မကိုက်ညီပါက partial/final/send/dismiss/level update များကို ပယ်ချပြီး stale callback များကို ရှောင်ရှားသည်။
- Push‑to‑talk သည် မြင်နေရသော overlay စာသားကို prefix အဖြစ် လက်ခံယူသည် (wake overlay ပြနေစဉ် hotkey ကို နှိပ်လျှင် စာသားကို ထိန်းထားပြီး အသစ်ပြောသော အသံကို ဆက်လက်ပေါင်းထည့်သည်)။ Final transcript ကို အများဆုံး 1.5 စက္ကန့် စောင့်ပြီး မရပါက လက်ရှိစာသားကို အသုံးပြုသည်။
- Chime/overlay logging ကို
infoတွင် categoriesvoicewake.overlay,voicewake.ptt, နှင့်voicewake.chime(session start, partial, final, send, dismiss, chime reason) အဖြစ် ထုတ်လွှင့်ထားပါသည်။
နောက်တစ်ဆင့်များ¶
- VoiceSessionCoordinator (actor)
- တစ်ကြိမ်တည်းတွင်
VoiceSessionတစ်ခုတည်းကိုသာ ပိုင်ဆိုင်ထားပါသည်။ - API (token အခြေပြု):beginWakeCapture,beginPushToTalk,updatePartial,endCapture,cancel,applyCooldown။ - token ဟောင်းများပါလာသော callback များကို ပယ်ချပါသည် (recognizer ဟောင်းများက overlay ကို ပြန်ဖွင့်မိခြင်းကို တားဆီးရန်)။ - VoiceSession (model)
- Fields:
token,source(wakeWord|pushToTalk), committed/volatile စာသား၊ chime flags၊ timers (auto-send, idle),overlayMode(display|editing|sending), cooldown deadline။ - Overlay binding
-
VoiceSessionPublisher(ObservableObject) သည် active session ကို SwiftUI ထဲသို့ mirror လုပ်ပေးပါသည်။ -VoiceWakeOverlayViewသည် publisher မှတစ်ဆင့်သာ render လုပ်ပြီး global singleton များကို တိုက်ရိုက် မပြောင်းလဲပါ။ - Overlay အသုံးပြုသူ လုပ်ဆောင်ချက်များ (sendNow,dismiss,edit) သည် session token နှင့်အတူ coordinator ကို ပြန်ခေါ်ပါသည်။ - Unified send path
-
endCaptureတွင်: trim လုပ်ပြီးနောက် စာသားမရှိပါက → dismiss; မရှိမဖြစ်performSend(session:)(send chime ကို တစ်ကြိမ်သာ ဖွင့်ပြီး forward လုပ်ကာ dismiss လုပ်သည်)။ - Push-to-talk: နှောင့်နှေးမှု မရှိ; wake-word: auto-send အတွက် ရွေးချယ်နိုင်သော delay။ - Push-to-talk ပြီးဆုံးပြီးနောက် wake runtime အပေါ် short cooldown တစ်ခု သက်ရောက်အောင်လုပ်ပြီး wake-word က ချက်ချင်း ပြန်မထွက်လာစေရန်။ - Logging
- Coordinator သည်
.infologs များကို subsystembot.molt, categoriesvoicewake.overlayနှင့်voicewake.chimeတွင် ထုတ်လွှင့်ပါသည်။ - အရေးပါသော ဖြစ်ရပ်များ:session_started,adopted_by_push_to_talk,partial,finalized,send,dismiss,cancel,cooldown။
ပြဿနာရှာဖွေရန် စစ်ဆေးရန် စာရင်း¶
- sticky overlay ကို ပြန်လည် ဖြစ်ပေါ်စေသည့်အချိန်တွင် logs များကို stream လုပ်ပါ:
bash
sudo log stream --predicate 'subsystem == "bot.molt" AND category CONTAINS "voicewake"' --level info --style compact
-
active session token တစ်ခုတည်းသာ ရှိကြောင်း စစ်ဆေးပါ; stale callback များကို coordinator က ပယ်ချထားရပါမည်။
-
push-to-talk လွှတ်သည့်အချိန်တိုင်း active token နှင့်အတူ
endCaptureကို ခေါ်ကြောင်း သေချာစေပါ; စာသားမရှိပါက chime သို့မဟုတ် send မပါဘဲdismissဖြစ်လာမည်ဟု မျှော်လင့်ရပါသည်။
Migration steps (အကြံပြုထားသည်)¶
VoiceSessionCoordinator,VoiceSession, နှင့်VoiceSessionPublisherကို ထည့်သွင်းပါ။VoiceWakeRuntimeကို refactor လုပ်ပြီးVoiceWakeOverlayControllerကို တိုက်ရိုက် ထိတွေ့မည့်အစား session များကို create/update/end လုပ်ပါ။VoicePushToTalkကို refactor လုပ်၍ ရှိပြီးသား session များကို adopt လုပ်စေပြီး လွှတ်ချိန်တွင်endCaptureကို ခေါ်ပါ; runtime cooldown ကို အသုံးချပါ။VoiceWakeOverlayControllerကို publisher နှင့် ချိတ်ဆက်ပြီး runtime/PTT မှ တိုက်ရိုက်ခေါ်မှုများကို ဖယ်ရှားပါ။- session adoption, cooldown, နှင့် empty-text dismissal အတွက် integration tests များ ထည့်သွင်းပါ။