--deploy-only 部署既有 image。板上使用 host network 與 NVIDIA RuntimeClass。--deploy-only 均已實作並由 focused tests
驗證。完整離線套件仍有 8 個既有 UX 規格 failure,本報告不把 focused 結果宣稱為 full-suite green。依據重建後 C-X1 板況:Pod 必須 hostNetwork: true;DNS 使用
ClusterFirstWithHostNet;GPU 使用 runtimeClassName: nvidia,但不宣告
nvidia.com/gpu;同板服務走 127.0.0.1;入口掛既有
default/kitt-lab Gateway。STT runtime、模型與其他平台 manifest 不在本輪修改範圍。
| ID | 條件 | 結果 |
|---|---|---|
CXAC1 | host network、cluster DNS、NVIDIA RuntimeClass、無 GPU resource claim | ✓ PASS |
CXAC2 | 無 privileged、nvlibs/device mount、/app/models volume | ✓ PASS |
CXAC3 | 版本與無版本 URI 經既有 Gateway 路由至 kitt-stt:9242 | ✓ PASS |
CXAC4 | 預設 build/push/deploy;--deploy-only 只部署既有 image | ✓ PASS |
deployment/k3s-cx1/ 對齊板端 RuntimeClass、DNS、Gateway 與 port 9242。get-kubeconfig.sh 取得 /data/k3s.yaml 並建立 cx1 context。deploy.sh 預設沿用 Thor profile build/push,再以 kubectl 套用 CX1 manifests;--deploy-only 跳過建置。SW-OPS-07、docs/spec.md、design 與 plan 同步為最終行為。| 範圍 | 結果 | 限制 |
|---|---|---|
tests/test_cx1_deployment.py + tests/test_spec_traceability.py | 8 passed | focused offline checks |
bash -n deploy.sh get-kubeconfig.sh + git diff --check | PASS | syntax and whitespace |
./tests/test.sh | 8 existing failures observed | 收集 938 項(另 1 skip);後段原生 ASR 測試未完成 |
| C-X1 live | Deployment 1/1 Ready | v5.8.0-thor:CUDA provider、9242、Gateway 與連線路徑已驗證 |
本輪只改部署、manifest 與操作文件,src/ 與 Frame 路由沒有變更。下圖先呈現 C-X1
部署流程,再完整保留目前 STT stack、Frame 流程與 Frame I/O 契約,讓報告可獨立審閱。
圖 1 · C-X1 部署流程。預設命令在操作端建立並推送 Thor image,再由 C-X1 拉取;
--deploy-only 從 registry 部署既有 image,不執行 DVC 或 Skaffold。
2026-08-31-aspect-a-model-inference,該輪未改動這條資料流)。今天的資料流:一個 offline SenseVoice、一把鎖,interim 與 final 走不同後處理但共用同一條 stream——綠色虛線是那一輪新增的路(final 沿用 interim 已抽好的 fbank,代號 #3)。#3 的 stream 生命週期是那一輪唯一改變資料流的東西,所以它的重置點必須列全(該輪沿用,未動):一條 stream
絕不可跨 utterance(fbank 的內部狀態會汙染下一句),所以每一個「buffer 被清空」或「新 utterance 開始」
的地方都要把它設回 None。
| 位置 | 行 | 為什麼要重置 |
|---|---|---|
_restart_stream_from_now | 682 | 手動喚醒中途按鍵:buffer 被重置,殘留 stream 必須丟棄 |
_handle_vad_user_started_speaking | 775 | 新 utterance 開始——上一句的 fbank 歷史絕不能帶進來 |
_finalize_utterance_impl(第一條 finalize 路徑) | 870 | 先交棒給 final,再設 None——交棒讓 final 沿用已抽好的 fbank,設 None 讓它不會跨到下一句 |
process_frame(第二條 finalize 路徑) | 1080 | 同上 |
_interim_redecode_body(IncrementalFeedError 復原) | 1350 | 餵入失敗、stream 內容不明:丟掉整個 stream 並歸零游標,下一次 interim 從整個 buffer 重抽——
寧可多付一次 fbank,也不能帶著半餵的 stream 繼續用(見設計規格 2026-08-31-aspect-a-model-inference-design.md §14) |
final_reuse_stream = incremental_stream
再 incremental_stream = None。反過來就是 final 沿用不到,也就是這個優化悄悄失效——
而它不會有任何錯誤訊息,只是 prep 變慢。交棒本身還有第二個守衛:只在
not session.interim_in_flight 時才真的把 stream 交出去——VAD stop 撞上 interim 正在餵入的
那個窄窗,交棒會拿到一個內容不明的半餵 stream,若照樣沿用會讓 final 重複解出同一段音訊(2026-08-31 那一輪的 live 抓到過)。
實機驗證沿用是否生效的方式是那一行 DEBUG log
([Final][prep] reused the interim stream: fed only the tail (0.16s of 11.00s))。src/kitt_stt_service.py 直接讀出
(experiments/frame_flow_fig.py),不是手打的。| Frame | 方向 | 觸發 case | 動作/條件 | 位置 |
|---|---|---|---|---|
StartFrame | IN | pipeline 啟動 | 建 session manager、載入 wake 設定、preload 模型 | :323 |
AudioRawFrame | IN | 每 20 ms 一塊 | utterance 進行中則 append 到 segment buffer,否則只進 preroll;接著決定要不要觸發 interim 重解 | :908 |
VADUserStartedSpeakingFrame | IN | VAD 判定開始說話 | 開 turn、重置 per-utterance 狀態(含把持續 stream 設回 None) | :687 |
VADUserStoppedSpeakingFrame | IN | VAD 判定停止說話 | turn 邊界:在同一把 buffer_lock 內快照音訊、清空 buffer、把 stream 交棒給本句 final,然後跑 final 與 TurnSense | :789 |
UserStarted/StoppedSpeakingFrame | IN | 上游非分區 VAD | 轉成對應的 zonal 事件由同一條路徑處理(kitt-core 基底類別的行為,不在本檔案內,故無 kitt_stt_service.py 行號可核) | kitt-core |
BotStartedSpeakingFrame | IN | TTS 開始播 | barge-in 仲裁所需的狀態 | :922 |
BotStoppedSpeakingFrame | IN | TTS 播完 | 同上,並重新武裝 idle 計時 | :955 |
InterruptionFrame | IN | 下游宣告 agent 開始/結束說話 | 更新喚醒狀態與 KWS 共用計時器(agent_active/agent_standby) | :1008 |
STTUpdateSettingsFrame | IN | 執行期改設定 | 套用 STT 設定差異並回報實際生效值 | :1196 |
EndFrame | IN | 連線收尾 | 結束未完成的 turn 並清理 session | :1048 |
ASRMetadataFrame | OUT | 連線建立時 + 每個 final | 本服務自訂 frame,帶模型資訊與延遲/RTF/total_inference_time_ms 等量測欄位 | :359 |
InterimTranscriptionFrame | OUT | 每次 interim 重解完成且文字有變 | 顯示文字(只過 s2t,不過完整 ITN) | :1386 |
TranscriptionFrame ★ | OUT | final 解碼完成且 _should_emit_final 通過 | 權威文字(HR → ITN 之後),並在 metadata["eot"] 帶 EOT 判定 | :1698 |
InterruptionFrame | OUT | 喚醒成功 → agent_active | 通知下游進入 active | :595 |
InterruptionFrame | OUT | 解除喚醒 / idle timeout / 離開詞 → agent_standby | 通知下游回 standby(三種 case 共用同一個 frame) | :500 |
TTSSpeakFrame | OUT | 純喚醒詞(wake-only) | 播固定招呼語,該 turn 以空的語意 stop 收掉 | :1819 |
TranscriptionFrame ★ 是唯一的權威文字載體——
EOT 判定也掛在它的 metadata["eot"] 上,而不是另外送 frame。
InterruptionFrame 出現三次:一次是收(下游宣告 agent 狀態),兩次是送
(agent_active 與 agent_standby,後者涵蓋解除喚醒/idle timeout/離開詞三種 case)。格式依 docs/spec.md 附錄 A 第 4 點:以 PRD Feature(F_id)為主軸,
只增不減(機械檢查 tests/test_report_integrity.py/SW-DOC-02)。本表原樣沿用
2026-09-05 循環報告的 115 個 SW_id:本輪不新增 SW_id、不新增測試檔,
唯一的內容變更是 SW-FT-04 一列的預設值(AUG_RATIO 0 → 0.25,
隨出貨模型切換),並依 SW-DOC-09 把 SW-HW-01–08 列的「本輪新增」高亮與日期章
清除(那是 2026-09-05 的 current-state 標記,不屬本輪)。
uv run --group test python -m pytest):887 passed / 8 failed / 38 skipped
8 個 FAIL 全部是 tests/test_ai_agent_ux_spec.py(2026-09-04 ai-agent-ux 循環刻意留下的
spec↔實作 RED,與本輪出貨模型切換無關)——git stash 對 baseline d302068 重跑,
同樣 8 個、同樣的測項,本輪零新增失敗。下表結果欄的逐列 PASS/FAIL 沿用 2026-09-05 循環的實跑
(本輪 src/ 零改動,行為未變)。38 skipped 含本機無 model bundle 而略過的
tests/test_offline_stream_incremental.py/tests/test_sensevoice_hotword_python_api.py
(MODEL_DIR 已改指 …-v2)。live 套件不在本輪;建議部署前對 v2
image 跑一次 ./tests/docker-test.sh smoke。每個 PRD Feature 是否有 STT SW_id 與測試(累積,本輪離線+live 全套重新執行,見下方各表「結果」欄)。
| PRD F_id | Feature | 有 STT SW_id? | SW_id | 條數 | 覆蓋(綠/總) |
|---|---|---|---|---|---|
| F_1 | 多音區識別/控制 | ✗ 下游/OOS | — | — | 下游 + STT per-user_id hook |
| F_2 | One-shot(喚醒詞+指令連說) | ✓ | SW-W-03/04/05/08/09/13/14/15/16/17/18 · SW-WM-01 | 12 | 6 / 12 ✓ |
| F_3 | 聆聽等待 / 智慧斷句 / 解除喚醒時機 | ✓ | SW-W-01/02/07/09/10/11/12/13 · SW-WM-02 · SW-B-03/08/10/11 · SW-X-01/02/05/06/07 · SW-TURN-01/02/03 · SW-EOT-01/02/05/06/07 | 26 | 15 / 26 ✓ |
| F_4.1 | 語音打斷_背景併行 | ✗ 下游/OOS | — | — | 下游(DM/TTS) |
| F_4.2 | 語音打斷_後令壓前令 | ✗ 下游/OOS | — | — | 下游(DM 仲裁) |
| F_4.3 | 語音打斷 Barge-in / 解除喚醒詞 | ✓ | SW-X-04 · SW-WM-03 · SW-EOT-02 | 3 | 2 / 3 ✓ |
| F_5 | 連續指令 | ✗ 下游/OOS | — | — | 下游(NLU 拆解) |
| F_6 | 上下文理解 | ✗ 下游/OOS | — | — | 下游(DM 快取) |
| UX | UX 專有(PRD 無對應 F_id) | ✓ | UX§10.2 拒識後維持聆聽 · UX§11 多語言 | 3 | 0 / 3 ✓ |
| STT_EXTRA | STT_EXTRA(PRD 未描述,STT 已具備,含本輪 SenseVoice CTC 熱詞/Context-biasing SW-HW-01–08) | ✓ | 免喚醒 / WebUI / 自定義 / 多使用者 / 效能 / ITN / 運維 / 追溯把關 / 熱詞 | 69 | 57 / 69 ✓(9 條無自動化測項) |
| SW_id | 行為(規格) | 測試 | 結果 |
|---|---|---|---|
SW-W-03 | Standby→Active(喚醒詞在句首):喚醒詞+指令連說,辨識其後之指令;喚醒詞不得出現在 final,且不得因前期聽歪而誤顯示喚醒詞 | test_wake.py | ✓ PASS |
SW-W-04 | 喚醒詞 <停頓> 指令 亦能喚醒,final 無喚醒詞 | test_wake.py | ✓ PASS |
SW-W-05 | 喚醒詞不在句首不觸發 | test_standby.py | ✓ PASS |
SW-W-08 | Active 期間:喚醒後任何話都辨識並往後送;句首喚醒詞於 final 過濾、非句首喚醒詞保留;interim 出現喚醒詞可接受 | test_active.py | ✗ FAIL |
SW-W-09 | Active 句首喚醒詞 + smart-turn,仍不顯示喚醒詞 | test_active.py | ✗ FAIL |
SW-W-13 | Standby 第一句未命中 → turn 關閉,故第二句句首的喚醒詞是新 turn 的句首,正常觸發喚醒 | test_smart_turn_wake.py | ✓ PASS |
SW-W-14 | 英文出廠喚醒詞 Hi Foxtron 須觸發(大小寫無關),且喚醒詞不得留在 final | test_wake_factory_words.py | ✓ PASS |
SW-W-15 | 第一次主動問候的時機(UX§1.3.2):喚醒成立後須送出問候的 TTSSpeakFrame,STT 側上界 500ms | test_active_greeting.py · test_wake_latency.py | ✗ FAIL |
SW-W-16 | 喚醒成立後 <550ms 內有人說話 → 不觸發第一次主動問候。窗的起點是 InterruptionFrame(agent_active) 送出的那一刻——下游能觀測到的「喚醒成功」就是這個 frame | test_active_greeting.py | ✗ FAIL |
SW-W-17 | 喚醒詞+指令連說須觸發喚醒:連讀成一句時同樣要送出 InterruptionFrame(agent_active),不因喚醒詞未單獨成句而不通知下游 | test_active_greeting.py | ✗ FAIL |
SW-W-18 | 喚醒詞+指令連說不得出現問候語:使用者在喚醒當下就把指令說完了,等同已在抑制窗內說過話 | test_active_greeting.py | ✗ FAIL |
SW-WM-01 | 喚醒詞比對與剝除:latin 大小寫無關、分隔字元先剝除、喚醒詞後可直接接指令、剝除喚醒詞後指令完整保留 | tests/test_wake_matcher.py | ✓ PASS |
| SW_id | 行為(規格) | 測試 | 結果 |
|---|---|---|---|
SW-W-01 | 非喚醒(Standby):說喚醒詞以外任何句子,STT 不出任何文字、不往後送;相似音喚醒詞不得觸發 | test_standby.py | ✓ PASS |
SW-W-02 | 非喚醒下說無關長語音,需立即 smart-turn stop | test_standby.py | ✓ PASS |
SW-W-07 | smart-turn 斷句不因 VAD 誤判過度斷句 | test_smart_turn_wake.py | ✓ PASS |
SW-W-09 | Active 句首喚醒詞 + smart-turn,仍不顯示喚醒詞 | test_active.py | ✗ FAIL |
SW-W-10 | Active 期間 smart-turn 功能正常(跨段黏合) | test_active.py | ✗ FAIL |
SW-W-11 | Active 第二句開頭喚醒詞不過濾(正常顯示) | test_smart_turn_wake.py | ✓ PASS |
SW-W-12 | 斷句前後不得因雜音產生語助詞(嗯/啊/喔) | test_active.py | ✗ FAIL |
SW-W-13 | Standby 第一句未命中 → turn 關閉,故第二句句首的喚醒詞是新 turn 的句首,正常觸發喚醒 | test_smart_turn_wake.py | ✓ PASS |
SW-WM-02 | alias 只能買回實測誤聽,不得擴大誤觸發:全中文 alias 與 canonical 距離 ≤1 字;普通語句不得誤觸發 | tests/test_wake_matcher.py | ✓ PASS |
SW-B-03 | Prefix + smart-turn 正常合併 | test_bypass_prefix.py | ✗ FAIL |
SW-B-08 | 特定指令於 smart-turn 第一句句首觸發,只傳「關閉空調」 | test_bypass_cmd.py | ✓ PASS |
SW-B-10 | Standby 第一句未命中 → turn 關閉,故第二句句首的 Prefix 是新 turn 的句首,正常觸發 | test_smart_turn_bypass.py | ✓ PASS |
SW-B-11 | 同上,第二句句首的特定指令正常觸發 | test_smart_turn_bypass.py | ✓ PASS |
SW-X-01 | Timeout 15s:TTS 說完起算,15s 無人說話 → 回 Standby | test_timeout.py | ✓ PASS |
SW-X-02 | 重新喚醒後 timeout 重新計時 | test_timeout.py | ✓ PASS |
SW-X-05 | 第二次主動問候的時機(UX§1.3.3):喚醒起算 =10秒 任何座位都沒說話 → 播「你好,需要我為你做什麼呢?」 | test_active_greeting.py · test_remaining_ux_gaps.py | ✗ FAIL |
SW-X-06 | 10 秒內有人說話 → 不觸發第二次主動問候 | test_active_greeting.py | ✗ FAIL |
SW-X-07 | 退出聆聽路徑一(UX§1.3.4):第二次問候播完後再 =5秒 無人說話 → 回 Standby | test_active_greeting.py | ✗ FAIL |
SW-TURN-01 | 一個 turn 內只有第一個 VAD segment 是 turn head;其餘為續段,不跑喚醒/免喚醒偵測 | tests/test_turn_arbitration.py | ✓ PASS |
SW-TURN-02 | 續段的送出權依 bypass 種類授權:prefix 授予(SW-B-03 需要),exact 不授予(SW-B-07 的語意) | tests/test_turn_arbitration.py | ✓ PASS |
SW-TURN-03 | 新 turn head 清除上一個 turn 的指令送出權,續段則保留 | tests/test_turn_arbitration.py | ✓ PASS |
SW-EOT-01 | STT 是唯一 EOT authority:每個 VAD stop 以語尾模型評分 turn tail(跨 segment,最後 8 秒),COMPLETE 立即結束 turn,INCOMPLETE/INVALID 等固定秒數,上限 500ms(UX§3.1 的 command_wait_timeout;可由狀態頁調整,見 SW-OPS-04);等待內有新語音則延續同一 turn。立即完成且有非空 final 時,文字與 eot.decision(action=commit + reason)必須由同一個 TranscriptionFrame 原子傳遞;timeout 或無 final 時才以 UserStoppedSpeakingFrame 承載同一 commit contract | tests/test_eot_state.py、tests/turnsense/test_policy.py、tests/test_eot_kws_precedence.py、tests/test_ai_agent_ux_spec.py · live:test_remaining_ux_gaps.py | ✗ FAIL |
SW-EOT-02 | KWS 事件(standby 無匹配/離開詞/agent_standby/連線結束)一律丟棄 turn,優先於強制停止與模型判定;被丟棄的 turn 永不進 LLM。ASR final 失敗不屬 KWS cancel:該段不送 transcription,改以 asr_error 結束 turn | 離線:tests/test_eot_kws_precedence.py · live(wire contract):test_forced_stop.py | ✓ PASS |
SW-EOT-05 | 拒識門檻一:連續語音 >15 秒 → 不得往下游送 | test_rejection_thresholds.py | ✗ FAIL |
SW-EOT-06 | 拒識門檻二:連續語音 >50 字 → 不得往下游送 | test_rejection_thresholds.py | ✗ FAIL |
SW-EOT-07 | 兩門檻皆未越過者必須照常送出(拒識的反向對照) | test_rejection_thresholds.py | ✗ FAIL |
| SW_id | 行為(規格) | 測試 | 結果 |
|---|---|---|---|
SW-X-04 | 說解除喚醒詞 → 切 Standby(UX§2.1 指定 13 個:謝謝/再見/退出/退下/滾蛋/滾/Thank you/Thanks/Goodbye/ByeBye/Dismiss/Quiet/Shut up) | live:test_exit_words.py · test_btn_control.py · 離線比對層:tests/test_exit_word.py、tests/test_ai_agent_ux_spec.py | ✗ FAIL |
SW-WM-03 | 退出詞 alias 必須錨定到已設定的退出詞:alias 群組的 canonical 不在 exit_words 內則整組忽略 | tests/test_wake_matcher.py | ✓ PASS |
SW-EOT-02 | KWS 事件(standby 無匹配/離開詞/agent_standby/連線結束)一律丟棄 turn,優先於強制停止與模型判定;被丟棄的 turn 永不進 LLM。ASR final 失敗不屬 KWS cancel:該段不送 transcription,改以 asr_error 結束 turn | 離線:tests/test_eot_kws_precedence.py · live(wire contract):test_forced_stop.py | ✓ PASS |
| SW_id | 行為(規格) | 測試 | 結果 |
|---|---|---|---|
SW-X-08 | 拒識之後必須維持聆聽(UX§10.2):越過 UX§8.2 門檻的語句丟棄不往下送,但不得因此離開 Active——拒識是「裝沒聽到」,不是「結束這一輪」 | test_rejection_thresholds.py | ✗ FAIL |
SW-LANG-01 | 整句英文指令須被辨識,且不需切換任何語言設定 | test_bilingual.py | ✗ FAIL |
SW-LANG-02 | 同一句內中英夾雜時兩種文字都要保留:辨識器須在句中換文字系統,不是為整句選一種語言 | test_bilingual.py | ✗ FAIL |
| SW_id | 行為(規格) | 測試 | 結果 |
|---|---|---|---|
SW-B-01 | Prefix(default「冷氣溫度*」「導航到*」):非喚醒下前綴符合即整句往後送 | test_bypass_prefix.py | ✗ FAIL |
SW-B-02 | Prefix 不在句首不觸發 | test_bypass_prefix.py | ✗ FAIL |
SW-B-05 | 特定指令(exact,default「關閉空調」):非喚醒下整句相符即往後送 | test_bypass_cmd.py | ✓ PASS |
SW-B-06 | 特定指令 不在句首不觸發 | test_bypass_cmd.py | ✓ PASS |
SW-B-07 | 特定指令句中夾雜其他話不觸發 | test_bypass_cmd.py | ✓ PASS |
SW-X-03 | 按 WebUI 綠色 active 按鈕 → 回 Standby | test_btn_control.py | ✓ PASS |
SW-UI-01 | WebUI Standby 按鈕可啟動喚醒(灰→綠),之後任何話都辨識往後送 | test_btn_control.py | ✓ PASS |
SW-UI-02 | 每次 connect 後狀態不壞:Connect→喚醒→disconnect ×5 都正常 | test_btn_control.py | ✓ PASS |
SW-UI-03 | 頻繁切換穩定:連點喚醒按鈕 ≥10 次後,切換仍正常 | test_btn_control.py | ✓ PASS |
SW-UI-04 | 連點後於 Standby 說「嗨鴻華」仍能觸發 | test_btn_control.py | ✓ PASS |
SW-UI-05 | 講話中瞬間切 Standby,WebUI 不得有灰字卡住 | test_btn_control.py | ✓ PASS |
SW-UI-06 | 講話中瞬間切靜音(mic),WebUI 不得卡住 | STT_EXTRA | — |
SW-MU-01 | 同車多 user 喚醒狀態同步(按鈕同開同關) | —(歸屬:web-ui) | — |
SW-MU-02 | 多 user 按鈕/語音喚醒穩定度(交互點擊 ≥5 次仍正常) | —(歸屬:web-ui) | — |
SW-MU-03 | UserA 講話中(final 未送),UserB 切 standby → STT 立即停聽、WebUI 無卡字 | —(歸屬:web-ui + STT) | — |
SW-MU-04 | 新 connect 的 user 同步當前喚醒狀態 | —(歸屬:web-ui) | — |
SW-MU-05 | 開關 mic 不影響喚醒狀態同步 | —(歸屬:web-ui) | — |
SW-MU-06 | 多 user timeout 穩定:長句期間不得誤切 standby | —(歸屬:web-ui + STT) | — |
SW-MU-07 | 自定義喚醒詞在多 user 間同步(含刪除同步) | —(歸屬:web-ui) | — |
SW-MU-08 | 多車隔離:Car1 喚醒/自定義詞不影響 Car2 | —(歸屬:web-ui(STT 以 ?car= 分段)) | — |
SW-CFG-01 | 可經 WebUI 客製化喚醒詞/免喚醒詞,行為與原廠一致 | test_stt_config.py | ✓ PASS |
SW-CFG-02 | 刪除客製化詞後不再觸發 | test_stt_config.py | ✓ PASS |
SW-PERF-01 | 連續長句(≥90 秒)講話期間,interim 重新解碼排程不得因緩衝區持續變長而失控卡住 | test_audio_stress.py | ✓ PASS |
SW-PERF-02 | 反應式 interim 重解碼排程的設定解析:間隔由上一次解碼延遲 × 安全係數決定,並受下限約束 | tests/test_audio_cfg.py | ✓ PASS |
SW-PERF-03 | 整車多人同時講話(1 條連線、4 個座位帶不同 user_id):interim 重新解碼排程不得因共用辨識器的鎖爭用而卡住;每個座位都必須拿到自己的 final,且不得有非本車座位的 user_id(不串話) | tests/functional/live/test_multiuser_concurrency.py(5 條)|離線機制測試 tests/test_interim_concurrency.py(13 條)、tests/test_itn_off_frame_path.py(3 條) | ✓ PASS |
SW-PERF-04 | 喚醒通知須在 200ms 內送出(UX§1.3.1):UI 動效由此 frame 觸發 | test_wake_latency.py | ✗ FAIL |
SW-PERF-05 | 喚醒率回歸下限 ≥90%(UX§1.1) | test_wake_rate.py | ✓ PASS |
SW-EOT-03 | 語尾模型的音訊前處理必須與訓練時逐位元相同(fbank 80 → LFR 7/6 → CMVN,裁到最後 8 秒),否則三分類機率不成立 | tests/turnsense/test_frontend.py | ✓ PASS |
SW-EOT-04 | 語尾模型只在 CUDA 上執行(與 SW-OPS-06 同一原則,見 kitt-stt-sw-spec.md §10):provider 未生效時伺服器拒絕啟動而非降級到 CPU;行程內單例、推論序列化且不佔用 event loop | tests/turnsense/test_runtime.py | ✓ PASS |
SW-ITN-01 | final 的 ITN:中文數字正規化 + 繁簡轉換 | tests/test_text_converter.py | ✓ PASS |
SW-ITN-02 | interim 與 final 的 ITN 刻意不同:interim 只做 s2t(),final 做完整 itn();故兩者在數字上可以不同,這是設計不是 bug | tests/test_batch_asr_manager_itn_split.py | ✓ PASS |
| SW-ITN-03 | 「這個數字字元是不是數字」由詞庫決定而非執行期斷詞器;緊鄰受保護詞的真數字仍必須轉換;執行期不得持有斷詞器(jieba 不在 runtime 依賴內) | tests/test_itn_lexicon.py(43,offline) | ✓ PASS |
| SW-ITN-04 | 整數與小數(含正負號)轉阿拉伯數字:一→1、負十→-10、負三點一四一六九九九九九→-3.141699999 | test_text_converter.py::test_all(pytest -k "G1- or G2- or G12-") | ✓ PASS |
| SW-ITN-05 | 百分比(含正負號)轉阿拉伯數字:百分之一→1%、百分之負零點五→-0.5% | test_text_converter.py::test_all(pytest -k G3-) | ✓ PASS |
| SW-ITN-06 | 分數(含正負號)轉阿拉伯數字:二分之一→1/2、負三分之一→-1/3 | test_text_converter.py::test_all(pytest -k G4-) | ✓ PASS |
| SW-ITN-07 | 日期/時間:數字轉阿拉伯數字,單位詞維持中文:一月五號→1月5號、十一點五十九分五十九秒→11點59分59秒 | test_text_converter.py::test_all(pytest -k "G5- or G8-") | ✓ PASS |
| SW-ITN-08 | 程度副詞維持全中文、不得數字化:一點點、一些、十分滿意 等 40+ 慣用語 | test_text_converter.py::test_all(pytest -k G7-) | ✓ PASS |
| SW-ITN-09 | 完整車內出貨指令語料 495 列、29 個產品功能分類,逐句 100% 正確;分類本身不得靜默缺漏 | test_itn_lexicon.py::test_every_incar_command_normalises_as_adjudicated/test_every_product_category_is_represented | ✓ PASS |
SW-OPS-01 | 模型解析:get_local_model_path 維持純函式(不觸發下載);ensure_local_model_path 只在 bundle 真的缺失時 pull、且只 pull 自己那個 .dvc;失敗訊息必須指名該跑的指令 | tests/test_model_manager.py | ✓ PASS |
SW-OPS-02 | 出貨模型的五處必須一致:config-basic.yaml 的 model.key、utils/model_manager.py 註冊表、三個 Dockerfile* 的 COPY、deploy.sh 的 MODEL_DVC_FILES、.dockerignore 的 build context 白名單 | tests/test_augment.py | ✓ PASS |
SW-OPS-03 | Per-turn debug log 檢索端點(GET ,2026-08-20):features.enable_debug_log_endpoint 關閉時回 404;開啟時可依 trace_id(來自 WS 握手 ?trace_id=,經 logger.contextualize 標記,比照既有 ?car= 機制)與時間窗(since_ms/until_ms/minutes)篩選 in-memory ring buffer(debug.debug_log_buffer_lines 筆數上限);零筆符合回 200 而非錯誤 | tests/test_debug_log_buffer.py、tests/test_debug_log_config.py、tests/test_debug_log_endpoint.py、tests/functional/live/test_debug_logs.py | ✓ PASS |
SW-OPS-04 | 狀態頁設定介面:EOT 等待秒數以滑桿呈現,其上下界與步進即 clamp() 實際夾制的範圍;整頁只有一個儲存動作,任一欄位驗證失敗則全部不送出。上界必須低於 kitt-core 的 user_turn_stop_timeout,否則該 fallback 會搶在語尾判定之前結束 turn | tests/test_status_page_settings.py | ✓ PASS |
SW-OPS-05 | live 測試 harness 不得產生 false pass:tests/docker-test.sh 重用映像的新鮮度檢查,必須涵蓋 Dockerfile 所有 COPY 進映像的路徑。清單以 Dockerfile 為來源推導驗證,不得手工維護——漏一個路徑就會讓套件對著不是受測版本的程式碼跑出綠燈 | tests/test_augment.py::test_docker_test_rebuilds_when_any_baked_in_path_changes | ✓ PASS |
SW-OPS-06 | provider=trt 不得靜默降級成 CUDA(與 SW-EOT-04 是同一原則的兩個實例:指定的 provider 沒生效就拒絕啟動),兩層:① 註冊層——TensorRT EP 註冊失敗時(onnxruntime build 沒有 TRT、libnvinfer 不在載入路徑、ORT 退回選項),vendored sherpa-onnx 中止行程而非 fallback;② 執行層——recognizer 建好之後,若 model.provider 要的是 trt 而 libnvinfer 未常駐於本行程,服務啟動必須失敗。①擋不到②:engine 因 sm 或 TRT 版本不符而無法反序列化時 EP 仍註冊成功,ORT 可以把節點丟回 CUDA。兩者的共同理由是該降級在執行期不可見——服務照常啟動、答案正確,只是慢數倍,該輪就因此量到一組標著 TensorRT 卻跑在 CUDA 的數字 | tests/test_trt_provider_guard.py | ✓ PASS |
SW-OPS-07 2026-09-07 | C-X1 部署契約:host network、ClusterFirstWithHostNet、NVIDIA RuntimeClass、既有 Gateway 與 localhost 服務互連;預設 CLI 在操作端 build/push Thor image 後部署,--deploy-only 只部署既有 image | tests/test_cx1_deployment.py(5 項) | ✓ PASS |
SW-FT-01 | 訓練語料建構:目標詞以 config-basic.yaml 為單一事實來源;句型展開不污染標籤;音色池與配額可重現;AISHELL-3 全程只當評估、永不進訓練 | tests/test_finetune_corpus.py | ✓ PASS |
SW-FT-02 | 量測與判定:MODEL/PRODUCT 雙軸(別名不計入模型能力)、三軸判定須同時成立、checkpoint 選擇規則(A4 失敗者不得被選中、全 NO-GO 時不得回傳贏家) | tests/test_finetune_eval.py | ✓ PASS |
SW-FT-03 | LoRA 接線:不可達目標必須拋錯而非靜默不啟用;可訓練集合非空且只含 lora;merge 後鍵集合=base 且權重確實改變 | tests/test_finetune_lora.py | ✓ PASS |
SW-FT-04 | 波形增強:SNR 精度、訓練/評估池不相交、確定性、不削波;預設 AUG_RATIO=0.25(波形增強,與出貨模型一致;2026-09-07 由 0 改) | tests/test_augment.py | ✓ PASS |
SW-FT-05 | 論文基準計分不得與 A4 計分共用程式碼;中英文正規化分流、論文目標值釘住;精度以 --model-file 選擇(預設 model.onnx,歷史呼叫方式不變),且寫進 report JSON 讓每個數字帶著它的精度來源 | tests/test_paper_bench.py | ✓ PASS |
SW-FT-06 | 模型量化匯出:sherpa-onnx 的 metadata_props(model_type / lfr_window_size / neg_mean / inv_stddev / lang_* / with_itn …)在 INT8 與 FP16 轉換後必須逐鍵存活——少一個,sherpa-onnx 就載不起來;FP16 圖必須保持 fp32 的 graph I/O(keep_io_types),否則餵 fp32 waveform 會型別不符;INT8 的量化參數(op_types_to_quantize / weight_type)只允許存在一份,exporter 與獨立量化工具共用同一個函式,不得各寫一份而漂移 | tests/test_quantize_bundle.py | ✓ PASS |
SW-FT-07 | 量測後端可換為 ONNX:--onnx-dir(sherpa-onnx)與 --init-param(PyTorch)互斥,避免報告出現一個不知道用哪個後端量的數字;--require-cache 時,付費 TTS 語料只要有一個 clip 不在快取裡就在發出任何 TTS 請求之前失敗(Google TTS 按字計費,一次誤觸就是真實支出) | tests/test_eval_onnx_backend.py | ✓ PASS |
SW-FT-08 | 運算子的裝置可攜性:量化會把 MatMul 換成 MatMulInteger/MatMulNBits 等運算子,而目標裝置的 execution provider 未必實作它們——未實作時 ORT 會靜默指派回 CPU,模型照跑、文字照樣正確,只是速度不是部署時假設的那個。工具須:①列出圖中所有運算子;②列出某個量化方案新增/移除了哪些運算子;③以 ORT profiler 的實際節點指派回答「哪些落在目標 provider、哪些退回 CPU」;④把「provider 根本沒載入」與「部分運算子退回」分開報告(前者是環境問題,後者才是運算子支援問題)。輸入由圖的簽章合成,所以在沒有語料的邊緣裝置上也能重跑 | tests/test_op_support.py | ✓ PASS |
SW-DOC-01 | 新增測試檔必須在本規格留下紀錄:掛在某個 SW_id 之下,或明示「刻意不給 ID」與理由。反向亦然——本規格不得引用已不存在的測試檔(重新命名或刪除後留下的空指向,比未覆蓋更危險,因為它看起來有覆蓋)。§8/§9 兩區與其 ID 前綴不得被靜默移除 | tests/test_spec_traceability.py | ✓ PASS |
SW-DOC-02 | cycle 報告的累積 ledger 只增不減:最新一份報告必須涵蓋歷輪聯集的所有 SW_id(不只是對前一輪比對——那會讓某個 ID 消失一輪後就永遠消失,因為下一次比的是兩份都已缺它的報告)。報告檔名須與 docs/dev-specs/ 的 cycle stem 對應 | tests/test_report_integrity.py | ✓ PASS |
SW-DOC-03 | 報告要定義自己用的技術名詞(CLAUDE.md Rule 5):凡讀者需要查才看得懂、且結論依賴其意義的名詞(sm89/RTF/MatMulInteger/CMVN…),必須在報告的名詞定義節裡說明「是什麼」與「該輪為何重要」。⚠️ 機械檢查的範圍是「有名詞表的報告,其涵蓋必須完整」;「報告有沒有名詞表」判不了誰是該輪的 cycle,故列入 close-out checklist | tests/test_report_glossary.py | ✓ PASS |
SW-DOC-04 | 報告的圖表要能被讀懂(CLAUDE.md §6 item 4b):每張圖需有 aria-label;每張數據圖需有 caption,且 caption 要寫出結論而非重複標題(架構/流程圖屬 item 4,豁免)。⚠️ 規則不追溯——報告以「至少有一張帶 caption 的圖」表示採用此慣例,之後其圖才受檢;該輪之前無任何報告為圖加 caption | tests/test_report_charts.py | ✓ PASS |
SW-DOC-05 | 報告的章節交叉引用必須指得到(CLAUDE.md §6 item 7e):報告是獨立閱讀的文件,§N 是讀者從結論走到證據的唯一途徑;重新編號章節時,引用它的文字必須同步改。⚠️ 檢查只驗指得到,無法判斷「§9 其實該寫 §10」。既有 4 份報告的 12 個懸空引用列成 KNOWN_DANGLING 明帳,只能減不能加 | tests/test_report_crossrefs.py | ✓ PASS |
SW-DOC-06 | 報告的 ID 對照表要逐項定義(CLAUDE.md Rule 3):報告引用的每一個 A/D/E/F/R 都要在表裡有自己一列——只定義「家族」與範圍不算數,那回答的是「A 是什麼」不是「其中某一個 id 是什麼」。⚠️ 規則不追溯:以報告是否含「ID 對照」章節判定是否受檢;既有 2 份報告的 18 個未定義 ID 列成 KNOWN_UNDEFINED 明帳,只能減不能加 | tests/test_report_ids.py | ✓ PASS |
SW-DOC-07 | 報告的小節要掛在自己的章節底下(CLAUDE.md §6 item 7f):不得有 <h3> 排在本節 <h2> 之前;編號 N.M 的小節必須位於編號 N 的 <section> 內;站內連結必須指得到錨點。該輪發生兩次——插入時以「下一個 h2」定位,內容落進下一節,而 HTML 解析/標籤平衡/錨點檢查全部看不出來 | tests/test_report_structure.py | ✓ PASS |
SW-DOC-08 | 報告引用的測試檔必須存在(CLAUDE.md §3 懸空引用原則):ledger 是審閱者判斷「這個需求有沒有人守」的依據,指向不存在的檔案讀起來和有覆蓋一模一樣,比空白更糟——空白至少會促使人去查。SW-DOC-01 守的是規格↔測試,這條守的是報告↔測試,而後者才是審閱者實際會讀的。⚠️ 只驗檔名;函式是否存在、結果是否與實跑相符,仍是收尾檢查表的工作 | tests/test_report_test_refs.py | ✓ PASS |
| SW-DOC-09 | 累積 ledger 裡「本輪新增」的高亮必須跟著換手:沒被本輪新增的列要清掉 class="hl",只有本輪自己新增的列能保留,且要帶明確日期(CLAUDE.md §6 rule 7g)。原編號 SW-DOC-08,rebase 到 2026-09-04-ai-agent-ux-alignment 時撞號而改號 | test_report_highlighting.py(1) | ✓ PASS |
| SW_id | 行為(規格) | 測試 | 結果 |
|---|---|---|---|
SW-HW-01 | from_sense_voice(decoding_method="modified_beam_search") 在未提供 hotwords_file 時必須正常建構並解碼,不得因無條件呼叫熱詞載入而 hard-exit | tests/test_sensevoice_hotword_python_api.py | ✓ PASS |
SW-HW-02 | 載入 hotwords_file 後,對已知因該詞彙被誤聽的音檔,解碼輸出必須改變並更接近正確答案 | tests/test_sensevoice_hotword_python_api.py | ✓ PASS |
SW-HW-03 | hotword_debug 預設 False,此時 hotword_debug_json 維持空字串 | tests/test_sensevoice_hotword_python_api.py | ✓ PASS |
SW-HW-04 | hotword_debug=True 時,解碼結果必須帶有逐 frame 的真實除錯軌跡 | tests/test_sensevoice_hotword_python_api.py | ✓ PASS |
SW-HW-05 | 除錯軌跡的每個 frame 必須額外帶 beams:依 total_score 排序的候選路徑分數拆解 | tests/test_sensevoice_hotword_python_api.py;C++ 側 offline-ctc-prefix-beam-search-decoder-test.cc::DebugRankedBeamsExposeWhyTheFlipHappened | ✓ PASS |
SW-HW-06 | add_hotwords_dict({phrase: weight_or_None}):執行期純新增熱詞,不重建 recognizer、不讀檔案,且不覆寫既有詞 | tests/test_sensevoice_hotword_python_api.py;C++ 側 offline-ctc-prefix-beam-search-decoder-test.cc::SetContextGraphAffectsOnlySubsequentDecodes | ✓ PASS |
SW-HW-07 | 建構時的 hotwords_file 參數維持既有行為:讀取純文字檔轉成 C++ 端可用的熱詞資料結構 | tests/test_sensevoice_hotword_python_api.py | ✓ PASS |
SW-HW-08 | features.enable_hotwords 與 hotwords.{file,score,max_active_paths} 正式接進 BatchASRManager._build()/KittSttService:只有熱詞檔含真正內容時才切到 modified_beam_search,否則(含空檔)維持 greedy_search;出貨檔案本身自 A24 起含 9 行真實內容(A26 起在建構前動態轉為簡體,見 2026-09-05 報告 §10.5/§10.6),零風險保證改由「空/純註解才 no-op」承接,非「出貨檔案是空的」 | tests/test_batch_asr_manager_hotwords.py(6)、tests/test_config_hotwords.py(2)、tests/test_hotwords_default_file.py(3) | ✓ PASS |
sherpa-onnx/build/
先前全套重跑時,SW-HW-01–07 曾因為熱詞解碼器只存在於本輪自己隔離的
sherpa-onnx/build.hotword-baseline/(用來避免可行性研究階段意外弄髒服務用的建置)而出現
測試隔離缺口:兩份 build 在同一個 pytest 行程裡互相競速,輸的一方會拿到缺少 max_active_paths
/add_hotwords_dict 的舊模組。往根因再推一步:這代表服務實際載入的 build 從未真的擁有這個
解碼能力——若當時直接在 hotwords.txt 填入真實內容上線,服務會在建構期壞掉。./sherpa-onnx/
build-sherpa-onnx.sh gpu(與服務現行建置管線同一支腳本)重新編譯 sherpa-onnx/build/ 後,
只有 _sherpa_onnx.*.so/libsherpa-onnx-c-api.so/offline_recognizer.py
三個檔案改變(git diff --stat 核對,其餘 onnxruntime 函式庫逐位元不變),隔離建置與
sys.path 插入都已移除,SW-HW-01–07 現在跟本套件其他測試一樣直接對著
sherpa-onnx/build/ 跑,9/9 全綠。
| SW_id | 行為(規格) | 測試 | 結果 |
|---|---|---|---|
SW-W-06 | ~~smart-turn 第二句開頭說喚醒詞不觸發喚醒~~ · 2026-08-17 廢止,與 SW-W-02 互斥,見[附錄·廢止紀錄](#附錄--廢止紀錄2026-08-17)。由 SW-W-13 取代 | — | — |
SW-B-04 | ~~Prefix 出現在 smart-turn 第二句句首不觸發~~ · 2026-08-17 廢止,與 SW-W-02 互斥,見[附錄·廢止紀錄](#附錄--廢止紀錄2026-08-17)。由 SW-B-10 取代 | — | — |
SW-B-09 | ~~特定指令於 smart-turn 第二句句首不觸發~~ · 2026-08-17 廢止,與 SW-W-02 互斥,見[附錄·廢止紀錄](#附錄--廢止紀錄2026-08-17)。由 SW-B-11 取代 | — | — |
SW-TURN-04 | 幽靈 ID(未註冊)——2026-09-05 循環的後續驗證方向指出 tests/functional/live/test_remaining_ux_gaps.py 的 docstring 引用了 SW-TURN-04(UX§3.1 490/510 ms 斷句邊界),但 kitt-stt-sw-spec.md 從未登記此 ID。與本輪出貨模型切換無關;carried forward 以滿足 SW-DOC-02 只增不減,交由熟悉 EOT/turn 仲裁的循環判斷歸屬 | test_remaining_ux_gaps.py(live,docstring 引用) | —(未註冊) |
| —(已移除) | —(已移除) |
| F_id / SW_id | Feature / 行為 | 歸屬 |
|---|---|---|
| F_1 | 多音區識別/控制(權限·AreaID·多區並行) | 下游 + STT per-user_id hook |
| F_4.1 | 語音打斷_背景併行處理 | 下游 DM/TTS |
| F_4.2 | 語音打斷_後令壓前令 | 下游 DM 仲裁 |
| F_5 | 連續指令 | 下游 NLU 拆解(UX§4.2.1 拆解成功率同歸此列) |
| F_6 | 上下文理解 | 下游 DM 快取(UX§5 保留輪數同歸此列) |
| F_3.4c | 最大錄音時限自動停止 | kitt-web-ui——✓ 已實作,設定 20s(2026-09-04 使用者確認) |
| SW-UI-06 | 講話中切 mic 靜音、WebUI 不卡字 | web-ui(無 STT 測試) |
| SW-MU-01..08 | 多使用者/多車喚醒同步、隔離 | web-ui(STT 提供 per-user_id / ?car= hook) |
UX§1.3.1/UX§7/UX§9/UX§10(除 11.3) | 問候語 UI/Guardrail/回復策略/顯示策略 | 下游 UI/LLM/TTS |
| ID | 定義 | 結果 |
|---|---|---|
CXAC1 | hostNetwork、cluster DNS、NVIDIA RuntimeClass,且不宣告 GPU resource | ✓ 達成 |
CXAC2 | 不使用 privileged、GPU device/nvlibs mount 或模型 volume | ✓ 達成 |
CXAC3 | 版本與無版本 STT URI 透過既有 Gateway 路由至 9242 | ✓ 達成 |
CXAC4 | 預設 build/push/deploy;--deploy-only 只部署既有 image | ✓ 達成 |
本輪自有命名空間。§7 累積追溯表中沿用歷輪的 A1–A6(2026-07-29 反應式排程)、
B*(ITN 拆分/併發)屬各自循環,與下表不同輪、不同定義。
| ID | 定義 | 結果 |
|---|---|---|
A1 | config-basic.yaml 的 model.key = …-kitt-wake-lora-v2 且已註冊、.dvc 存在 | ✓ 達成(§5) |
A2 | 出貨五處(config/3×Dockerfile*/.dockerignore/deploy.sh)一致指向 …-v2(SW-OPS-02) | ✓ 達成(§5) |
A3 | 註冊 local key 皆在 docs/models.md;…-v1 改標「回退用」 | ✓ 達成(§5) |
A4 | run_pipeline.sh 的 AUG_RATIO 預設 = 0.25;AUG_RATIO=0 路徑保留 | ✓ 達成(§5) |
A5 | spec.md §6 門檻由 2026-08-12 報告 §11・AUG-25 既有量測承接,不重量 | ✓ 達成(§5;docs/spec.md 附錄 B、docs/models.md) |
R1 | 風險:v2 bundle 未在 DVC remote → image build 在 COPY 失敗,錯誤像忘了 dvc pull | 緩解:2026-08-12 已 dvc push;部署前 dvc pull 或 docker-test.sh 驗證。本輪未在本機驗證(§5.1) |
R2 | 風險:spec.md §6 門檻用既有量測承接,未在部署硬體上重驗 | 緩解:「乾淨條件零損失」=零劣化、安全邊際足;rollback = model.key 改回 v1 + rebuild |
R3 | 風險:訓練端 AUG_RATIO=0.25 讓下一次訓練帶噪聲(本輪要的),但需乾淨基準時可能忘記關 | 緩解:註解寫明「Set 0 for a clean-only run」;meta-test 只鎖預設、不鎖死 0 路徑 |
R4 | 風險:切模型意外改變 interim/final 文字管線 | 緩解:src/ 零改動,載入路徑外與 v1 完全相同 |
沿用而非本輪定義的 ID(出現在 §6 圖說與 §7 累積追溯表的沿用內容裡,列此以滿足 SW-DOC-06 逐 ID 定義):
| ID | 定義 | 出處 |
|---|---|---|
A6 | 2026-07-29「反應式 interim 排程」循環的驗收 ID(ASR_INTERIM_SAFETY_MARGIN 覆寫)——與本輪 A6 命名空間無關 | §3 說明文字所指的歷輪命名空間 |
A21 | 2026-09-05 循環驗收:熱詞解碼器正式編譯進服務載入的 sherpa-onnx/build/ | §7 SW-HW 表下方 callout(沿用) |
A24 | 2026-09-05 循環驗收:熱詞對喚醒/退出詞準確度的影響分析+把 7 個詞加入出貨熱詞檔 | §7 SW-HW-08 列(沿用) |
A26 | 2026-09-05 循環驗收:熱詞檔來源保留繁體、啟動時動態轉簡體+高權重共用子詞條 | §7 SW-HW-08 列(沿用) |
--deploy-only。nvidia.com/gpu,因 CX1 上的分享行為尚未驗證。| 詞彙 | 定義 | 本輪重要性 |
|---|---|---|
| hostNetwork | Pod 共用主機網路 namespace | C-X1 kernel 無法建立 veth,所有服務共用 host ports。 |
| RuntimeClass | Kubernetes 選擇 container runtime handler 的欄位 | nvidia handler 提供 GPU runtime,不需 privileged 或手掛裝置。 |
| DVC | 大型模型資產的版本管理工具 | 預設流程在 build 前拉取 image 需要的模型。 |
| Skaffold | 本 repo 的 container build/deploy CLI | C-X1 build 沿用 Thor profile 產生 -thor image。 |
| HTTPRoute | Kubernetes Gateway API 的 HTTP 路由資源 | 把版本與無版本 STT URI 掛到板端既有 Gateway。 |
| ClusterIP | Kubernetes Service 的虛擬 IP | C-X1 kube-proxy 無法路由它,因此同板服務改走 localhost。 |
| STT | Speech to Text,將語音辨識為文字 | 本輪部署的服務本體。 |
| VAD | Voice Activity Detection,判斷語音開始與停止 | 累積 Frame 流程中的 turn 邊界來源。 |
| fbank | Filter-bank 語音聲學特徵 | 累積追溯表中的 ASR 與 EOT 前處理契約。 |
| LFR | Low Frame Rate,相鄰特徵幀堆疊與降採樣 | 累積追溯表記錄 TurnSense 前處理一致性。 |
| CMVN | Cepstral Mean and Variance Normalization | 累積追溯表記錄 TurnSense 輸入正規化。 |
| CER | Character Error Rate,字元錯誤率 | 累積品質驗收使用的中文辨識指標。 |
| WER | Word Error Rate,詞錯誤率 | 累積品質驗收使用的英文辨識指標。 |
| SNR | Signal-to-Noise Ratio,訊噪比 | 累積模型測試以此描述噪聲強度。 |
| RTF | Real-Time Factor,處理時間除以音訊長度 | 累積效能驗收使用的速度指標。 |
| RSS | Resident Set Size,行程常駐實體記憶體 | 累積效能驗收使用的記憶體指標。 |
| MatMulInteger / MatMulNBits | ONNX Runtime 的整數矩陣乘法運算子 | 累積量化契約用它判斷 provider 支援。 |
| QDQ | Quantize-Dequantize 節點表示法 | 累積量化契約用它驗證模型圖。 |
| bf16 | bfloat16 浮點格式 | 累積模型精度比較使用的資料型別。 |
| EP context model | ONNX Runtime 將 provider 編譯結果保存成可載入模型 | 累積 TensorRT 可攜性記錄使用。 |
| deserializeCudaEngine | TensorRT 載入序列化 engine 的 API | 累積 engine 相容性診斷使用。 |
| IExecutionContext | TensorRT 執行已載入 engine 的 context | 累積 GPU 記憶體分析使用。 |
| IGpuAllocator | TensorRT 可插拔 GPU allocator 介面 | 累積記憶體分析使用。 |
| trtexec | TensorRT 官方 engine 建置與量測 CLI | 累積 provider 驗證使用。 |
| malloc_trim | glibc 嘗試把 allocator 空閒頁面歸還 OS 的函式 | 累積主機記憶體分析使用。 |
| smaps | Linux 的 process memory mapping 明細 | 累積共享與私有記憶體拆解使用。 |
| model proto | ONNX 模型的 protobuf graph 表示 | 累積模型載入記憶體分析使用。 |
| sm89 | NVIDIA CUDA compute capability 8.9 | TensorRT engine 綁定 compute capability,跨機搬移可能需要重建。 |