---
# System prepended metadata

title: Tech With Tim - AI Voice Assistant Project Full Tutorial
tags: [ASR, AI]

---

# 專案概覽與目標
![image](https://hackmd.io/_uploads/S1LMFaLeZg.png)

* 要打造一個 AI 語音助理，可以用電話打進來，或直接在瀏覽器裡對話
* 先示範「完全不用寫程式」就從雲端介面建立助理並接到電話號碼
* 接著示範給開發者看，如何用 React／JavaScript 在前端按一個按鈕就連到語音助理
* 再來說明如何從後端伺服器發出請求、控制語音助理，做到更完整的生產級整合
* 使用的服務是 Vy（Voice API），透過邀請連結註冊可拿到約 10 美元免費額度，不需輸入信用卡

# 使用場景：導入到申請表流程
![image](https://hackmd.io/_uploads/BJ2QYTLxbl.png)

* 真實場景是導入到一個付費導師計畫（Dev Launch）的申請流程
* 原本流程是長表單，要填年齡、程度、收入、是否願意投資、是否能馬上開始等多個欄位
* 很多人不想打字填長表單，更希望直接講電話或用說的
* 透過語音助理，可以改成用講的方式回答同樣問題，甚至額外追問表單沒設計到的資訊
* 語音助理會蒐集資料、判斷是否「合格」，前端再根據結果決定要導向預約頁、降階產品等

# Demo 流程重點
![image](https://hackmd.io/_uploads/SyD3YpIe-g.png)

* 使用者在簡單 Landing Page 填寫姓名、電話、Email，按「開始通話」
* 頁面會接上語音助理，直接在瀏覽器裡通話，不需真的拿手機
* 助理會依腳本問一串問題：年齡、居住國家、月收入、是否能投資某個金額、程式程度、是否能即刻開始等
* 使用者回答後，助理會根據條件判斷是否適合這個計畫
* 通話結束後，前端會顯示「通話報告」，包含摘要與是否合格等資訊
* 可利用這些輸出在前端自動做後續導流或流程分支

# Vy 平台與帳號設定
![messageImage_1763264987914](https://hackmd.io/_uploads/Bkeeqp8xWx.jpg)


* 到 Vy 網站註冊帳號，透過連結可取得免費額度
* 登入後進入 Dashboard，可以看到延遲、成本、選用模型等資訊

![image](https://hackmd.io/_uploads/r1BzcTLxbe.png)
* 在側邊選單中進入 Assistants，按「Create new assistant」建立新的語音助理
* 建立時給助理命名，可選用範本（客服、遊戲 NPC、Q&A 等）或空白範本，範例使用空白

# 建立 Voice Assistant 基本流程
 

* 建立完成後即可在網頁上用「Talk with assistant」直接測試對話
* 也可以將助理綁定到電話號碼，讓使用者「打電話」進來（之後再設定）
* 主要要設定的項目包括：模型提供者、模型版本、溫度、情緒偵測、Prompt 等
* 所有設定修改完成後，需要按 Publish 才會生效

# 模型與語音設定

* 模型提供者可選多家，如 OpenAI、DeepSeek 等，範例使用 OpenAI
* 模型例子：選用類似 GPT-4o / GPT-4 Turbo cluster，平衡成本與延遲
* 溫度調低到約 0.3，使回答更穩定、較少亂跑
* 可選擇啟用情緒辨識，使助理依情緒更自然反應
* 語音提供者有多家選擇，範例使用 ElevenLabs 的「Nigel」語音
* 也可以輸入自訂 Voice ID，或從清單中挑選其他預設聲音

# 語音轉文字與音訊處理

* Transcriber 區塊用來設定語音轉文字的細節，範例採用預設值
* 啟用「背景降噪」，減少通話環境雜音對辨識品質的影響
* 啟用降噪後，成本與延遲不會顯著增加

# 工具、函式與結束通話邏輯

* 平台支援自訂工具與函式，讓助理在對話中觸發外部系統
* 可以連接到像 GoHighLevel、Make.com，或是自寫的程式（如查資料庫、建立紀錄等）
* 可以啟用「讓助理自行結束通話」的功能，並在 Prompt 中描述何時應該掛斷，以控制成本
* 若不啟用由助理掛斷，則由使用者手動結束通話

# 進階設定與錄音

* 進階設定中可選擇是否保留通話錄音，方便之後回放
* 啟用 Smart Endpointing，讓系統自動判斷使用者何時講完，而不用微調各種細節參數
* 這些設定主要是為了提升體驗與穩定性

# 訊息與 Webhook 設定

* Messaging 區塊可以設定要把通話相關事件送到哪裡（後端／前端）
* 可設定後端 Webhook URL，接收通話開始、結束、分析結果、錯誤等事件
* 前端也能透過客戶端事件取得通話中的資訊，用來更新 UI
* 可以選擇要傳哪些類型資料，例如逐步轉寫、結束報告等

# 通話結束分析與結構化輸出

* Analysis 區塊負責「通話結束後要做的事」
* 可設定「摘要 Prompt」，要求模型生成通話摘要
* 可設定「成功與否判斷 Prompt」，讓模型依條件判斷這通電話是否達成目標
* 最重要的是可以定義「結構化資料 Schema」，例如 JSON 格式
* 助理會在通話結束時依 Schema 輸出：例如是否合格、年齡、國家、收入區間、是否可以投資、是否能立即開始等
* 這些結構化資料可送到後端或前端，作為下一步自動流程的依據

# Prompt 設計與對話腳本
![Uploading file..._77ilahzt0]()

* 有兩大部分：第一句開場白（first message）、主系統 Prompt（系統說明與流程腳本）
* 開場白範例：說明「從哪裡打來」、「你先前申請了什麼」、「現在要開始申請流程」並問是否準備好
* 主 Prompt 裡描述助理的角色、語氣（溫暖、專業、不要像強硬業務）、對話節奏等
* 逐條列出需要詢問的問題：年齡、居住國家、收入水準、是否願意投資多少金額、程式能力、是否能立刻開始等等
* 在 Prompt 中明確描述「什麼條件算合格」，例如限定國家、最低收入、基礎程式能力要求等
* 對合格者要說的話、不合格者要說的話都事先寫好，讓助理按分支回覆
* 最後指示助理在問完所有必要問題後，簡短確認是否有其他問題，然後讓使用者自行結束通話
* 可在 Prompt 中使用變數占位（例如使用者名稱等），稍後從自家程式碼注入實際值

# 當前階段成果

* 到這一步為止，已在 Vy 介面完成助理建立、模型與語音選好、Prompt 寫好、分析邏輯設好
* 已可直接在 Vy 後台用「Talk with assistant」測試整個問答流程
* 後續步驟才會進到「接到實際電話」以及「用自家前端、後端程式碼來串接」


---
# 分析區塊的核心目的

* 分析區塊用來從通話內容中萃取真正有用的資訊
* 範例情境是用電話確認潛在客戶是否符合高價導師計畫資格
* 若符合資格就導向預約通話，不符合則導向低價課程或免費資源
* 通話結束後會呼叫 LLM 進行分析，因此分析結果會在通話結束後數秒才產生

# 設定摘要與結構化資料 Schema

* 摘要部分可以給簡單指示，例如「寫一個簡短通話摘要」，也可以加入更具體需求
* 成功與否（Success evaluation）在此案例中不是重點，重點是結構化資料
* 透過提示詞說明：會給一段與潛在客戶的通話轉錄，目的是評估是否符合資格
* 在提示中要求模型依照指定 Schema 給出輸出，並保持摘要簡潔
* 在 Schema 中可以為每個欄位設定名稱、類型（例如 Boolean、字串、enum）、描述與是否必填

# 結構化輸出欄位設計示例

* 設定欄位如：是否有程式開發經驗（Boolean），並透過描述明確定義 true / false 判準
* 加入補充欄位如「coding_experience_extra_details」用於補充文字說明
* 月收入欄位設為 enum，列出收入區間選項，方便固定輸出值並利於後端使用
* 在 enum 中加入「not_provided」選項，以處理使用者拒絕提供收入的情況
* 其他欄位包括 country、age、is_qualified、ready_to_start 等評估相關資訊
* 由於單層最多只能有 10 個欄位，可建立 object 欄位來嵌套更多資料
* 以 contact_details 物件包住 first_name、last_name、phone_number、email 等聯絡資訊，節省欄位名額

# 實際測試一通資格審核電話

* 啟動助理後，助理自我介紹並說明是用來評估是否適合加入導師計畫
* 問使用者年齡與所在國家，例如：24 歲、住在澳洲
* 詢問月收入或收入區間，使用者可選擇不透露
* 說明導師計畫需要投入 2000–4000 美金，確認對方是否願意投資
* 使用者覺得金額過高，助理保持同理心，仍繼續了解狀況
* 詢問目前程式程度，使用者表示是完全新手
* 助理根據條件判斷該計畫只適合已有紮實基礎的人，告知目前不適合
* 提出可以改推薦免費或入門資源，若使用者拒絕則結束通話並祝福

# 在後台檢視通話紀錄與分析結果

* 通話結束後，在 Logs 中可看到錄音檔與完整逐字稿
* 在 Analysis 分頁中可以看到依 Schema 填好的結構化資料欄位
* 範例結果包含 country、coding_experience、ready_to_start、monthly_income、is_qualified 等欄位
* 依輸出可清楚得知：沒開發經驗、不準備投入金額、不符合資格等狀態
* 同一區塊也會顯示由模型生成的通話摘要，方便快速瀏覽重點
* 可查看此通話消耗的成本金額，方便追蹤每通電話的費用
* Logs 中還能檢視所有對話訊息細節與助理設定相關資訊

# 將語音助理綁定到實體電話號碼

* 在 Phone numbers 頁面可以申請最多 10 組免費電話號碼（目前限美國與加拿大區碼）
* 建立號碼時可選擇區碼並命名，例如命名為 main
* 將某個電話號碼綁定到指定的語音助理（例如改綁到 tutorial 助理）
* 綁定後即可用實體手機撥打該號碼，助理會自動接聽並開始對話
* 可設定備援電話號碼，若 AI 號碼失敗可轉接到真人電話
* 可設定 outbound 電話號碼，讓助理主動撥出電話而不是被動接聽
* 通話同樣會進入 Logs 與 Analysis，可用於後續分析與自動化流程

# 整體系統架構與流程說明
![image](https://hackmd.io/_uploads/BJpOYAIxbe.png)

* 使用者先造訪前端 Landing Page（例如導師計畫申請頁），按下「Apply now」
* 前端顯示表單與「電話申請」選項，使用者選擇電話申請後輸入姓名、電話、Email 等資訊
* 前端提示使用者即將接到 AI 電話，通話可以發生在實體手機或網頁內通話介面
* AI 助理撥打電話或接通網頁通話，與使用者對話並依問題逐步評估資格
* 通話結束後，前端可顯示通話摘要、是否合格、下一步動作等結果
* 助理根據 is_qualified 結果決定導向：若合格則跳轉到預約通話頁面，不合格則導向低價產品或免費資源頁
* 後端伺服器負責與 AI 助理直接溝通，可讀取通話分析結果與 Logs
* 後端可接收完整 call report，依結果執行後續流程，例如寫入資料庫、發送 Email、觸發自動化工作流等
* 若使用者未接電話，可擴充為讓助理留言語音或簡訊，作為後續跟進的一部分

---

# 初始化 React + Vite 專案
![image](https://hackmd.io/_uploads/B1vD908gWg.png)

* 使用 `npm create vite@latest` 建立專案，專案名稱為 `frontend`
* 選擇框架為 React，語言使用 JavaScript 而非 TypeScript
* `cd frontend` 後執行 `npm install` 安裝依賴
* 之後透過 `npm run dev` 啟動前端開發伺服器

# 安裝 Vapi Web SDK 與環境變數設定

* 依官方文件安裝 Web SDK：`npm install @vapi-ai/web`
* 在專案根目錄建立 `.env` 檔案
* 定義前端用的環境變數（需以 `VITE_` 開頭）：
* `VITE_VAPI_API_KEY`：前端專用（Public）API Key
* `VITE_ASSISTANT_ID`：在 Vy 後台某個 Assistant 的 ID
* 到 Vy Dashboard 的 API Keys 頁面取得 Public API Key（前端只用 Public，不用 Private）
* 到 Assistants 頁面找到目標 Assistant，複製其 ID 填入 `.env`

# 清理預設檔案與結構

* 刪除 `src/assets` 資料夾與內含 React logo 等預設資源
* 刪除 `App.css`，不再使用預設樣式
* 將 `App.jsx` 清空，只保留元件骨架與 `useState` import，從零開始寫 UI

# 建立 AI 控制模組（ai.js）

* 在 `src` 目錄建立 `ai.js` 檔案
* 匯入 SDK：`import Vapi from '@vapi-ai/web'`
* 從環境變數讀取金鑰與 Assistant ID：
* `const apiKey = import.meta.env.VITE_VAPI_API_KEY`
* `const assistantId = import.meta.env.VITE_ASSISTANT_ID`
* 建立並匯出單一 Vapi 實例：`export const vapi = new Vapi(apiKey)`
* 匯出啟動語音助理的函式 `startAssistant`：
* 非同步函式，接收 `firstName`、`lastName`、`email`、`phone` 四個參數
* 呼叫 `vapi.start(assistantId, { assistantOverrides: { variables: { firstName, lastName, email, phone } } })`
* 透過 `assistantOverrides.variables` 將表單資料傳給後端語音助理，用於 Prompt 變數與分析輸出
* 匯出停止語音助理的函式 `stopAssistant`，內部只呼叫 `vapi.stop()`

# 官方文件與進階覆寫說明

* 官方 Web SDK 文件示範兩種使用方式：
* 使用既有 Assistant ID 啟動既有設定
* 直接在程式碼中傳入完整 Assistant 設定 JSON（不使用 Dashboard 預設設定）
* `assistantOverrides` 可以覆寫幾乎所有配置，例如：
* 是否錄音、轉寫設定、模型、語音設定等
* SDK 也支援發送「背景訊息」給助理，用於動態更新上下文或指令

# 在 App.jsx 測試啟動語音助理

* 在 `App.jsx` 匯入：`vapi`、`startAssistant`、`stopAssistant` 自 `./ai`
* 匯入 `useEffect` 以便在元件載入時測試啟動
* 用 `useEffect` 搭配空依賴陣列，在首次渲染時呼叫 `startAssistant()` 測試是否能連線與開麥
* 開啟 `npm run dev`，瀏覽器載入後會自動啟動語音助理並開始對話
* 確認無誤後，移除這段 `useEffect` 測試程式，避免每次載入就自動撥通

# 加入樣式與狀態管理

* 在 `index.css` 貼入事先寫好的樣式（表單、按鈕、波形、容器布局等）
* 在 `App.jsx` 新增多個 `useState` 管理前端狀態：
* `started`：通話是否已啟動
* `loading`：是否正在啟動或處理中
* `assistantIsSpeaking`：助理是否目前正在說話
* `volumeLevel`：目前音量數值，用於畫出波形動畫
* `callId`：通話 ID，之後用來查詢結果或報告
* `loadingResult`：是否正在載入通話結果
* 表單欄位狀態：`firstName`、`lastName`、`phoneNumber`、`email`
* 暫時設定 `const showForm = true`，先強制顯示表單區塊

# 註冊 Vapi 事件監聽（call / speech / volume / message）

* 在 `useEffect` 中使用 `vapi.on(...)` 註冊各種事件
* `call-start`：
* 將 `loading` 設為 false
* 將 `started` 設為 true
* `call-end`：
* 將 `started` 設為 false
* 將 `loading` 設為 false，避免卡在載入狀態
* `speech-start`：
* 每次助理開始說話時觸發
* 將 `assistantIsSpeaking` 設為 true
* `speech-end`：
* 助理每次說完一句時觸發
* 將 `assistantIsSpeaking` 設為 false
* `volume-level`：
* 帶入 `level` 參數
* 將 `volumeLevel` 更新為目前音量，用來驅動波形動畫 UI
* `message`（選用）：
* 每次有訊息事件觸發時拿到 `message`
* 可 `console.log(message)`，用於顯示即時逐字稿或除錯

# 建立使用者表單 UI

* 在 `App.jsx` 回傳 JSX 結構，最外層使用 `.app-container` 容器
* 使用 `showForm && (...)` 條件渲染表單區塊
* 表單區塊內容：
* 標題 `<h1>` 顯示「Contact details」等文字
* 多個輸入欄位：First name、Last name、Phone number、Email 等
* 輸入欄位使用：
* `type="text"` 或適當類型
* `placeholder` 顯示欄位名稱
* `value` 綁到對應的 state（例如 `firstName`）
* `className="input-field"` 使用預先定義的樣式
* `onChange={handleInputChange(setFirstName)}` 這種寫法來更新狀態
* 實作 `handleInputChange` 工具函式：
* 接收一個 Setter，例如 `setFirstName`
* 回傳一個事件處理函式 `event => setter(event.target.value)`
* 透過這個工具函式，所有輸入欄位可以共用相同 onChange 模式，減少重複程式碼

---

# 建立聯絡資料表單欄位

* 從「名字」欄位複製結構，依序改成「姓氏」、「Email」、「電話」四個欄位
* 每個欄位各自綁定 state：firstName / setFirstName、lastName / setLastName、email / setEmail、phoneNumber / setPhoneNumber
* Email 欄位 input type 設為 `email`，電話欄位設為 `tel`，其餘欄位使用一般文字輸入
* 完成後得到一個包含姓名、Email、電話的基本聯絡表單

# 表單送出按鈕與欄位檢查

* 在 form 內加入按鈕，文字例如「Start application call」
* 按鈕 onClick 綁定 `handleStart` 函式，初期可先定義為空函式避免錯誤
* 使用 `allFieldsFilled = firstName && lastName && email && phoneNumber` 判斷是否全部填寫
* 按鈕的 disabled 綁定 `!allFieldsFilled`，確保所有欄位填完才能啟動通話
* 手動輸入測試資料可確認按鈕啟用與否，驗證表單邏輯正常

# 開始與結束通話的核心流程

* `handleStart` 設為 async，進入時先設定 loading 為 true
* 呼叫 `startAssistant`，傳入 firstName、lastName、email、phoneNumber 等參數啟動語音助理通話
* 從回傳結果中取得通話 ID（例如 `data.id`），並以 state `callId` 保存，供後續查詢通話分析結果使用
* `handleStop` 呼叫 `stopAssistant` 結束通話，之後再補上「取得通話結果並顯示」的邏輯
* 整體由 `handleStart` 負責啟動與記錄通話，由 `handleStop` 負責結束與清理狀態

# 控制畫面：表單、載入中與通話中顯示

* `showForm` 條件為「非 loading、尚未開始助理、未載入結果、沒有 callResult」，只在初始階段顯示表單
* loading 或載入結果時不顯示表單，改顯示一個帶有 `loading` class 的載入指示區塊
* 開始通話後隱藏表單，改顯示通話相關 UI（例如音量條、助理狀態、掛斷按鈕）
* 通話結束後預計改為顯示通話結果，而不是再出現表單

# VolumeLevel：音量視覺化元件

* VolumeLevel 元件接收 volume 參數，內部預設 `numBars = 10` 代表 10 個音量條
* 透過 `Array.from({ length: numBars })` 產生多個 bar 元素
* 每個 bar 的 className 包含 `volume-bar`，並依「索引 / numBars 是否小於 volume」決定是否加上 `active`
* CSS 依 `volume-bar` 和 `volume-bar active` 決定顯示樣式，形成動態的音量高低效果

# AssistantSpeechIndicator：助理說話狀態顯示

* AssistantSpeechIndicator 元件接收 `isSpeaking` 布林值判斷助理是否正在說話
* 外層 div 使用 `assistant-speech-indicator` class 包住整個狀態區塊
* 內部狀態 div className 組成 `speech-indicator speaking` 或 `speech-indicator not-speaking`
* 顯示文字例如「Assistant speaking」或「Assistant not speaking」，樣式交由 CSS 控制

# ActiveCallDetails：整合視覺化與掛斷操作

* ActiveCallDetails 元件接收 `assistantIsSpeaking`、`volumeLevel`、`endCallCallback` 三個參數
* 內部先渲染 AssistantSpeechIndicator 顯示助理目前說話狀態
* 接著渲染 VolumeLevel 顯示即時音量條變化
* 底部放置「End call」按鈕，onClick 綁定 `endCallCallback`，讓使用者可以結束通話
* 作為通話進行階段的主視覺與控制區塊

# 在主頁中整合通話 UI 與流程

* 在 App 中匯入 ActiveCallDetails，並以 `started && <ActiveCallDetails ... />` 方式條件渲染
* 將追蹤助理說話狀態的 state 傳給 `assistantIsSpeaking`，音量狀態傳給 `volumeLevel`
* 將 `handleStop` 傳入 `endCallCallback` 讓「End call」按鈕真正觸發結束通話流程
* 實際操作流程為：填好表單 → 按下「Start application call」→ 顯示載入動畫 → 接到 AI 通話並顯示波形與狀態 → 按下「End call」結束並回到初始畫面

# 前端完成度與尚未處理的部分

* 目前前端已能發起通話、顯示助理說話狀態與音量視覺化、並提供結束通話按鈕
* 前端尚未取得與顯示「通話分析結果」，例如是否符合資格、結構化欄位、通話摘要與完整轉錄
* 對於單純客戶支援用途目前功能已足夠，但無法根據通話內容自動執行後續動作
* 若要根據通話結果做決策（如導向預約頁或其他方案），需要接上後端取得分析資料並在前端顯示與處理

---

# 後端伺服器目的與角色
![messageImage_1763269179922](https://hackmd.io/_uploads/HkiHcRUlWl.jpg)


* 建立獨立的 Python Backend 來安全存取語音助理的「通話紀錄與結構化輸出」
* 前端只負責發起通話與顯示結果，不直接接觸敏感資料或後端 API key
* 後端負責：根據前端傳來的 call ID，向 Vy API 查詢完整通話詳情（包含分析與結構化資料）
* 避免任何人從前端隨意查詢所有通話紀錄，降低敏感資訊外洩風險

# Backend 專案初始化與依賴

* 在專案中建立 `backend` 資料夾，作為後端專案目錄
* 在 `backend` 內建立 `requirements.txt`，列出依賴：
* `requests`、`Flask`、`python-dotenv`、`Flask-Cors`
* 建立 `main.py` 作為主程式檔
* 建立 `.env` 檔案，定義 `VAPI_API_KEY`（這裡使用「後端私鑰」）

# 後端 API Key 設定

* 到 Vy Dashboard → API Keys 頁面
* 這次使用的是「Private / Backend API Key」，權限較高
* 將 Private Key 貼到 `backend/.env` 裡的 `VAPI_API_KEY`
* 不在影片或程式碼中顯示 Private Key，避免洩漏

# Python 虛擬環境與套件安裝

* 在 VS Code 開新 Terminal，切到專案根目錄後再進入 `backend`
* 建立虛擬環境：`python -m venv venv`
* Windows 啟用：`venv\Scripts\activate`
* macOS / Linux 啟用：`source venv/bin/activate`
* 啟用後執行：`pip install -r requirements.txt` 安裝所有依賴
* 下次重開機後要再啟用虛擬環境才能使用已裝的套件

# 查詢單一通話 API（呼叫 Vy 官方 API）

* 在 `main.py` 中匯入：`os`、`requests`、`load_dotenv`
* 呼叫 `load_dotenv()` 載入 `.env` 中的 `VAPI_API_KEY`
* 寫函式 `fetch_call_details(call_id)` 用來打 Vy 的 Get Call API
* API URL 格式：`https://api.vapi.ai/call/{call_id}`（實際以官方文件為準）
* 在 headers 裡設置 `Authorization: Bearer <VAPI_API_KEY>`
* 用 `requests.get(url, headers=headers)` 送出請求
* 以 `response.json()` 回傳 JSON 格式結果

# Flask 應用與 CORS 設定

* 建立 Flask app：`app = Flask(__name__)`
* 匯入 `Flask`、`jsonify`、`request` 以及 `Flask-Cors` 的 `CORS`
* 用 `CORS(app)` 包住 app，允許前端網頁以 AJAX 呼叫此後端 API
* 目的：避免前端向不同網域或不同 port 的後端發請求時遇到 CORS 錯誤

# /call-details API 路由設計

* 建立路由：`@app.route("/call-details", methods=["GET"])`
* 寫處理函式 `get_call_details()`
* 從 query string 讀取 `callId`：`call_id = request.args.get("callId")`
* 若 `callId` 缺失：
* 回傳 `jsonify({"error": "callId is required"}), 400`（Bad Request）
* 若 `callId` 存在：
* 呼叫 `fetch_call_details(call_id)` 向 Vy 取得完整通話資訊

# 從 Vy 回應中擷取重要欄位

* 接收 `response = fetch_call_details(call_id)` 的 JSON 物件
* 可 `print(response)` 方便開發時檢查返回格式
* 主要關注欄位：
* `summary = response.get("summary")`
* `analysis = response.get("analysis")`（結構化資料、成功與否判斷等）
* 後端回傳給前端：
* `return jsonify({"analysis": analysis, "summary": summary}), 200`

# 錯誤處理與例外情況

* 使用 `try...except Exception as e` 包住對 Vy API 的呼叫
* 若發生錯誤（API 掛掉、callId 無效、網路問題等）
* 回傳 `jsonify({"error": str(e)}), 500`（Internal Server Error）
* 讓前端可以根據錯誤訊息做相對應的 UI 顯示

# 啟動 Flask 後端伺服器

* 在檔案底部加入：
* `if __name__ == "__main__": app.run(debug=True)`
* 執行：`python main.py` 啟動後端伺服器
* 預設在 `http://127.0.0.1:5000` 或類似位址提供 API 服務

# 手動測試 /call-details API

* 在瀏覽器輸入：`http://127.0.0.1:5000/call-details?callId=1234`
* 若 `callId` 是假的或格式錯誤，後端會：
* 回傳 `{"analysis": null, "summary": null}` 或錯誤訊息
* 若未帶 `callId`，則回傳：
* `{"error": "callId is required"}`，HTTP 狀態碼 400
* 確認路由運作無誤後，即可在前端整合此 API

# 前後端資料流整體流程

* 通話開始與結束都由前端透過 Vapi Web SDK 控制
* 通話結束時，前端持有這通電話的 `callId`
* 前端呼叫自家後端 `/call-details?callId=...`
* 後端用 Private API Key 向 Vy 官方 API 查詢該通話詳細資訊
* 後端擷取 `summary` 與 `analysis` 等關鍵欄位後回傳給前端
* 前端顯示「結束報告」、判斷是否合格、或依結果導向下一步流程

---

# 在 Vite 前端設定 Proxy 解決 CORS
![image](https://hackmd.io/_uploads/BkqtcR8gWe.png)

* 在前端設定檔中加入 server.proxy 設定，將以 /call-details 開頭的請求轉發到後端伺服器
* 目標網址指向本機後端服務埠 5000
* 啟用變更來源設定，讓請求看起來像是直接發給後端
* 在開發模式下關閉憑證檢查以避免本機 https / http 設定造成錯誤
* 目的：前端呼叫 /call-details 時，實際會送到後端 API，而不會觸發瀏覽器的跨網域限制

# 在前端輪詢取得通話分析結果

* 新增 getCallDetails 函式，用來從後端取回單一通話的分析結果
* 設定輪詢間隔（例如 3 秒），持續重複請求直到分析完成
* 每次請求會帶上 callId 查詢對應那一通通話的分析資料
* 收到回應後將資料轉成 JSON，並檢查是否已包含分析結果與摘要
* 若尚未產出分析與摘要，使用計時器延遲一段時間後再次呼叫 getCallDetails

# 管理載入狀態與錯誤處理

* 呼叫 getCallDetails 前先將「載入結果中」的狀態設定為 true
* 一旦成功取得完整分析資料，將其儲存在前端狀態中，並把「載入結果中」改為 false
* 若請求或解析 JSON 過程中發生錯誤，會進入錯誤處理區塊
* 錯誤處理可簡單顯示錯誤訊息，方便除錯輪詢流程

# 在結束通話後觸發分析查詢

* 結束通話時的處理函式除呼叫停止助理外，也會呼叫 getCallDetails
* 通話一結束就開始輪詢後端，直到 LLM 分析完通話轉錄並產生結果
* 這樣使用者結束通話後，過幾秒就能在前端介面看到「這通通話的判定與摘要」

# 在畫面上顯示「資格判定」與摘要

* 當「正在載入結果」狀態為 true 時，在畫面顯示「正在載入通話資訊」之類提示文字
* 當不再載入且 callResult 有值時，顯示一個區塊用來展示分析結果
* 顯示是否合格：從 callResult 裡的分析資料中讀取結構化欄位（例如是否合格）
* 顯示摘要：從 callResult 裡的 summary 欄位呈現整通通話的總結
* 透過瀏覽器主控台可以看到完整的分析物件，包括結構化欄位與聯絡資料等

# 修正 JSON 與 Proxy 設定問題

* 一開始出現「解析 JSON 失敗」與 Proxy 錯誤，是因為目標網址誤用 https 而後端實際為 http
* 將 proxy 目標中的 https 改成 http 後，請求才能正常通過開發用 Proxy 並取得正確回應
* 修正後再次測試通話，結束後輪詢即可順利拿到分析結果與摘要

# 改善語音合成模型與聲音自然度

* 針對語音不自然的問題，改換文字轉語音供應商的模型版本（例如較新的 turbo 模型）
* 手動指定更自然的 voice id，使說話語調與口音更接近真人對話
* 更新語音設定並重新發布助理後，再次測試通話即可聽到更自然的語音回應
* 最終完成整體流程：前端表單與通話 UI、後端代理與分析、結構化結果顯示，以及自然的語音互動


---
# Terminology
* 語音助理（Voice Assistant）：透過語音與使用者互動、回答問題或執行任務的智慧系統
* 語音 API（Voice API）：提供開發者呼叫語音相關功能（通話、合成、辨識）的程式介面
* 大型語言模型（Large Language Model, LLM）：能理解與產生自然語言文字的 AI 模型
* 提示詞工程（Prompt Engineering）：設計與微調輸入文字來控制模型行為的技術
* 延遲時間（Latency）：從發出請求到收到回應所花費的時間
* 語音轉文字（Speech-to-Text, STT）：把人說的話轉成文字的技術
* 文字轉語音（Text-to-Speech, TTS）：把文字內容轉換成可聽語音的技術
* 溫度參數（Temperature）：控制模型輸出隨機性與創造性高低的設定值
* 情緒偵測（Emotion Detection）：從語音或文字判斷說話者情緒狀態的技術
* 背景降噪（Background Denoising）：去除通話或錄音中的環境雜音處理
* 語音模型提供商（Model Provider）：提供 AI 模型服務的公司或平台
* 集群服務（Cluster）：由多台伺服器組成、用來分擔模型運算負載的架構
* 前端應用程式（Frontend Application）：在瀏覽器中與使用者互動的畫面與程式碼
* 後端伺服器（Backend Server）：處理商業邏輯、資料庫與外部 API 呼叫的伺服器程式
* Webhook（Web Hook）：事件發生時主動把資料送到指定網址的回呼機制
* JSON 結構（JSON Schema）：定義 JSON 資料欄位格式與型別的規範
* 結構化資料輸出（Structured Output）：依固定欄位格式輸出的資料，方便程式解析
* 通話報告（Call Report）：通話結束後產生的摘要與分析結果文件
* 通話成功率評估（Call Success Evaluation）：判斷一次通話是否達成預期目標的過程
* 函式工具（Tool / Function）：模型在對話中可呼叫的外部功能或程式
* 自訂工具整合（Custom Tool Integration）：把自己寫的程式功能接入語音助理供其呼叫
* 事件回呼 URL（Callback URL）：用來接收平台推送事件資料的伺服器網址
* 響應串流（Streaming Response）：在資料尚未全部產生前，邊產生邊回傳的傳輸方式
* 通話錄音（Call Recording）：將通話語音內容存檔以便回放或分析
* 分析管線（Analysis Pipeline）：通話結束後一系列自動分析與處理的流程
* 使用者資格篩選（Lead Qualification）：評估使用者是否符合產品或服務條件的流程
* 申請流程自動化（Application Automation）：用系統自動收集與審核申請資料的做法
* 表單替代方案（Form Replacement）：用對話或語音流程代替傳統線上表單
* 入口頁面（Landing Page）：用來導入訪客並推動單一行動的網頁
* 互動式對話流程（Interactive Flow）：依使用者回答即時調整後續問題的對話設計
* 文字客製提示（Custom Prompt）：根據特定業務需求撰寫的模型指令文字
* 知識庫（Knowledge Base）：存放產品或公司相關資訊供模型查詢的資料集合
* 聊天上下文（Conversation Context）：目前與過去對話中可用來判斷狀況的所有資訊
* 狀態管理（State Management）：在對話過程中記錄與更新使用者相關資料的方式
* 呼叫路由（Call Routing）：根據條件把來電導向不同助理或流程的機制
* 自動結束通話（Auto Hangup）：由系統判斷並主動掛斷電話的功能
* 智慧端點偵測（Smart Endpointing）：自動偵測使用者何時說完話再開始回應的技術
* 參數調校（Parameter Tuning）：調整模型與語音系統各種設定以優化效果的過程
* 試用額度（Free Credit）：新用戶註冊後可免費使用的一定金額或使用量
* 音訊串流（Audio Streaming）：連續傳送語音資料到伺服器或從伺服器接收語音資料
* API 金鑰（API Key）：用來驗證身分並授權使用 API 的密鑰
* 回應模板（Response Template）：預先設計好的回覆句型或訊息結構
* 使用者屬性（User Attributes）：例如年齡、國家、收入等用於判斷與客製化的欄位
* 資料後處理（Post-processing）：對模型或語音輸出再進一步整理與修正的步驟
* 事件日誌（Event Log）：記錄系統在對話和通話中產生的各種事件與狀態
* 通話流程設計（Call Flow Design）：規劃通話中問題順序與決策分支的工作
* A/B 測試（A/B Testing）：比較兩種不同設定或提示詞效果的實驗方法
* 生產環境部署（Production Deployment）：將系統正式上線給真實使用者使用的過程
* 體驗優化（Experience Optimization）：持續調整系統以提升使用者互動感受與效率
* 轉換率（Conversion Rate）：從進入流程的使用者中，實際完成目標行為的比例
* 通話分析（Call Analysis）：對一通電話的內容做整理與判斷，找出重點與結果
* 結構化輸出（Structured Output）：用固定欄位與格式，把模型的答案變成規律的資料
* 結構化資料綱要（Structured Data Schema）：事先定義好「有哪些欄位、型別是什麼」的規則
* 欄位描述（Field Description）：用文字說明每個欄位代表什麼，要填什麼內容
* 布林值（Boolean）：只有「真」或「假」兩種可能的資料型別
* 列舉型別（Enumeration）：先列出幾個固定選項，只能從裡面選一個或幾個
* 必填欄位（Mandatory Field）：一定要有值的欄位，不能留白
* 巢狀物件（Nested Object）：在一個欄位裡面再放一個「小物件」，裡面還有更多欄位
* 聯絡資訊物件（Contact Details Object）：把姓名、電話、Email 等聯絡資料打包在同一個物件裡
* 月收入區間（Monthly Income Range）：用「收入落在哪個範圍」來描述一個人的月收入
* 資格評估（Eligibility Evaluation）：判斷對方符不符合某個專案或課程的條件
* 合格判定（Qualification Decision）：最後決定對方是「合格」還是「不合格」
* 潛在客戶（Prospect）：還沒成交，但有可能會成為客戶的人
* 資格審核通話（Qualification Call）：專門用來檢查對方適不適合的電話訪談
* 成功評估（Success Evaluation）：判斷這次通話有沒有達到預期目標的步驟
* 通話摘要（Call Summary）：用幾句話快速說明這通電話發生了什麼
* 超時設定（Timeout Setting）：設定最多等多久，超過時間就停止或放棄
* LLM 呼叫（LLM Invocation）：把文字丟給大型語言模型，請它運算並回覆的動作
* 通話文字稿（Call Transcription）：把電話講話內容完整變成文字的紀錄
* 響應綱要（Response Schema）：限制模型輸出必須符合的一組欄位與格式規則
* 欄位驗證（Field Validation）：檢查欄位裡填的值有沒有符合規定
* 枚舉選項（Enum Options）：列舉型別裡可以被選擇的那幾個固定值
* 預設選項（Default Option）：在沒特別指定時，自動使用的選項
* 未提供標記（Not Provided Flag）：用來表示使用者沒有提供這一項資訊的值
* 分析日誌（Analysis Logs）：記錄通話、分析與模型輸出細節的系統紀錄
* 通話成本（Call Cost）：這通電話在 API 與服務上實際花掉的金額
* 助理設定（Assistant Configuration）：調整語音助理行為與規則的各種設定
* 語音助理（Voice Assistant）：用聲音跟人對話的 AI 助理
* 電話號碼綁定（Phone Number Binding）：把一個電話號碼指定給某個助理或專案使用
* 回撥電話（Callback）：系統主動打電話給使用者，而不是等使用者先打進來
* 備援電話（Fallback Number）：主號碼失敗時，改打到的備用電話號碼
* 外呼電話（Outbound Call）：由系統主動撥出去的電話，而不是接聽進來的電話
* 來電路由（Call Routing）：控制來電要被導到哪個助理或哪個人員的流程
* 電話語音流程（Call Flow）：一通電話中問題、回答與分支路線的完整順序
* 銷售漏斗（Sales Funnel）：從認識你到成交，中間一層一層篩選與轉化的流程圖
* 低單價產品（Low-ticket Offer）：價格較低、比較容易入手的產品或課程
* 向下銷售（Downsell）：原本商品太貴時，改推薦價格更低的方案
* 著陸頁（Landing Page）：使用者點廣告或連結後，第一個看到的介紹頁面
* 申請表單（Application Form）：讓使用者填資料、申請加入某個計畫的表單
* 合格線索（Qualified Lead）：經過評估後，確定值得進一步跟進的潛在客戶
* 不合格線索（Unqualified Lead）：不符合條件，不適合繼續銷售流程的潛在客戶
* 呼叫報告（Call Report）：整理一通或多通電話結果與重點的報告資料
* 後端伺服器（Backend Server）：在伺服器上處理權杖、資料儲存與邏輯的程式
* 前端整合（Frontend Integration）：把 AI 助理與分析功能接到網頁或 App 上
* 系統架構圖（System Architecture Diagram）：畫出前端、後端與助理之間關係的圖
* 元件泳道圖（Swimlane Diagram）：用多條「泳道」分開不同角色在流程中的動作的流程圖
* 助理觸發（Assistant Trigger）：某個事件讓 AI 助理開始行動的那個動作
* 事件驅動流程（Event-driven Flow）：由「事件」帶動下一步要做什麼的系統設計方式
* 後端通知（Backend Notification）：把通話結果或分析資料送回後端的訊息
* 自動化後續動作（Automated Follow-up）：根據通話結果自動寄信、導頁或安排下一步的流程
* 程式碼編輯器（Code Editor）：用來撰寫與編輯程式碼的軟體工具
* VS Code 整合開發環境（VS Code IDE）：一套常用來開發前端與後端程式的免費編輯器
* React 前端框架（React Framework）：用來建立互動式使用者介面的 JavaScript 函式庫
* Vite 建置工具（Vite Build Tool）：幫助快速啟動與打包前端專案的開發工具
* npm 封包管理器（npm Package Manager）：用來安裝與管理 JavaScript 套件的系統
* 專案腳手架（Project Scaffold）：自動幫你生出基本專案結構的起始模板
* 相依套件安裝（Dependency Installation）：把專案需要用到的外部套件下載到本機的過程
* 前端開發伺服器（Dev Server）：在本機跑起來，用來即時預覽網頁變化的伺服器
* 前端 SDK（Frontend SDK）：讓前端程式方便呼叫某個服務功能的一組程式庫
* 網頁 SDK（Web SDK）：專門設計給瀏覽器環境使用的開發工具套件
* 官方文件（Official Documentation）：由產品或服務官方提供的使用說明與教學
* 環境設定檔（Env File）：用來存放專案機密或設定值的文字檔案
* 環境變數前綴（Env Prefix）：為了安全與規則，環境變數名稱需要加上的固定開頭字串
* 公開 API 金鑰（Public API Key）：可以放在前端使用、權限較小的識別金鑰
* 私密 API 金鑰（Private API Key）：只能放在後端、權限較大的機密金鑰
* 助理識別碼（Assistant ID）：用來指定啟動哪一個語音助理的唯一代碼
* 模組匯入（Import Statement）：把別的檔案或套件中的程式碼載入進來使用的語法
* 模組匯出（Export Statement）：把檔案中的函式或變數公開給其他檔案使用的語法
* 實例化物件（Object Instantiation）：用 new 關鍵字建立一個物件實體的動作
* 非同步函式（Async Function）：可以等待外部操作完成再繼續執行的函式
* Await 關鍵字（Await Keyword）：在非同步函式中，用來等待結果回來的語法
* 回傳 Promise（Return Promise）：表示這個函式會在未來某個時間點才給出結果
* 函式參數（Function Parameters）：呼叫函式時傳進去、讓函式使用的資料
* 前端表單資料（Frontend Form Data）：使用者在網頁上輸入的文字與資料集合
* 狀態管理 Hook（State Hook）：在 React 中用來記錄與更新畫面狀態的工具
* useEffect Hook（useEffect Hook）：在特定時機自動執行程式碼的 React 工具
* 相依陣列（Dependency Array）：告訴 useEffect 在哪些變數改變時才需要重新執行
* 事件監聽器（Event Listener）：當特定事件發生時，自動呼叫某個函式的機制
* 通話開始事件（Call Start Event）：語音通話一開始時觸發的系統事件
* 通話結束事件（Call End Event）：語音通話完全結束時觸發的系統事件
* 語音開始事件（Speech Start Event）：助理開始說話當下觸發的事件
* 語音結束事件（Speech End Event）：助理一句話說完時觸發的事件
* 音量變化事件（Volume Level Event）：音量高低變化時持續回報數值的事件
* 回呼函式（Callback Function）：被當成參數傳入，之後由系統在適當時機呼叫的函式
* 音量等級數值（Volume Level Value）：用數字表示當前聲音大小的資料
* 即時轉寫訊息（Live Transcript Message）：通話中即時產生的文字內容訊息
* 表單輸入欄位（Form Input Field）：讓使用者在網頁上輸入資料的小方框
* 佔位文字（Placeholder Text）：顯示在輸入框裡、提示要填什麼的淡色文字
* OnChange 事件處理（OnChange Handler）：在輸入內容改變時被呼叫來更新狀態的函式
* 事件物件（Event Object）：描述這次事件細節的資料，例如從哪個輸入框來
* 目標值（Target Value）：事件中實際輸入的文字內容值
* CSS 樣式表（CSS Stylesheet）：用來控制網頁外觀排版與顏色的設定檔
* 樣式類別名稱（CSS Class Name）：套在元素上讓它使用特定 CSS 樣式的名稱
* 版面容器（Layout Container）：用來包住其他元件、控制整體排版的外層區塊
* 輸入驗證（Input Validation）：檢查使用者輸入是否符合格式或必填規則的過程
* 載入狀態（Loading State）：表示系統正在處理中、尚未完成的畫面狀態
* 通話進行中狀態（Call Started State）：代表目前語音通話正在進行的布林值狀態
* 助理說話狀態（Assistant Speaking State）：代表現在是助理在說話中的布林值狀態
* 通話結果物件（Call Result Object）：用來存放這次通話分析與摘要結果的資料結構
* GitHub 原始碼倉庫（GitHub Repository）：用來存放與分享專案程式碼的線上空間
* 表單元件（Form Component）：用來收集使用者輸入資料的 React 元件
* 輸入框（Input Field）：讓使用者輸入文字或數字的欄位
* 電子郵件欄位（Email Field）：專門用來輸入 Email 並可自動做基本格式檢查的欄位
* 電話欄位（Telephone Field）：用來輸入電話號碼的輸入欄位
* onClick 處理函式（onClick Handler）：按鈕被點擊時要執行的函式
* handleStart 函式（handleStart Function）：在使用者按下開始通話時負責啟動助理的函式
* 非同步函式（Async Function）：可以搭配 await 等待非同步操作完成的函式
* await 關鍵字（await Keyword）：在非同步函式中等待 Promise 結果的語法
* 狀態鉤子（useState Hook）：在 React 中用來宣告與更新元件狀態的工具
* 效果鉤子（useEffect Hook）：在狀態或屬性改變時執行副作用程式碼的工具
* 載入狀態（Loading State）：表示目前系統正在處理中、尚未完成的狀態標記
* 送出按鈕（Submit Button）：用來觸發送出表單或啟動流程的按鈕
* 停用按鈕（Disabled Button）：暫時無法被點擊的按鈕狀態
* 表單驗證（Form Validation）：檢查欄位是否都有填寫或格式正確的過程
* 前端邏輯（Frontend Logic）：在瀏覽器端負責處理 UI 與互動的程式邏輯
* 聯絡資料表單（Contact Details Form）：用來收集姓名、Email、電話等基本資料的表單
* 應用程式通話（Application Call）：專門用來進行申請流程的語音通話
* 語音助理介面（Voice Assistant Interface）：顯示語音助理狀態、文字與控制的畫面
* 活動通話細節元件（Active Call Details Component）：顯示正在通話時狀態與按鈕的 React 元件
* 語音音量條（Volume Bars）：用多條長條顯示目前音量高低的視覺元素
* 音量等級（Volume Level）：用 0–1 或多格刻度表示的當前音量大小
* 助理發話指示器（Assistant Speech Indicator）：顯示助理目前是否正在說話的標示
* End Call 按鈕（End Call Button）：用來結束目前通話的按鈕
* 回呼函式（Callback Function）：當某事件發生時被呼叫執行的函式
* 陣列生成（Array.from）：用來依指定長度或來源建立新陣列的 JavaScript 函式
* 展開運算子（Spread Operator）：用 ... 展開陣列或物件內容的語法
* 條件渲染（Conditional Rendering）：依狀態決定要不要在畫面上顯示某個元件
* 三元運算子（Ternary Operator）：用 `條件 ? A : B` 寫成一行的條件判斷
* 類別名稱（Class Name）：指定給 HTML 元素，用來套用 CSS 樣式的名稱
* CSS 動畫（CSS Animation）：用 CSS 讓元素產生動態效果的技術
* 波形視覺化（Waveform Visualization）：把音訊以波形或條狀圖方式呈現出來的畫面
* 呼叫識別碼（Call ID）：用來唯一識別一通通話的 ID 值
* 結束通話處理（Handle Stop）：在使用者結束通話時負責停止助理與更新狀態的函式
* 語音助理狀態（Assistant State）：描述助理目前是閒置、通話中或結束等狀態的資料
* 結構化輸出結果（Structured Output Result）：從後端取得、符合預先定義欄位格式的分析結果
* 通話後分析（Post-call Analysis）：通話結束後對內容與結果做整理與判斷的流程
* 後端 API 呼叫（Backend API Call）：從前端向伺服器發出請求取得或送出資料的動作
* 開始助理函式（startAssistant Function）：向後端請求啟動語音助理與通話的函式
* 停止助理函式（stopAssistant Function）：通知後端停止目前語音助理通話的函式
* 假資料（Dummy Data）：用來測試或示範的隨意資料，不是真實使用者資訊
* 視覺化元件（Visualization Component）：專門負責呈現圖形或指示狀態的 UI 元件
* 通話流程控制（Call Flow Control）：管理通話開始、進行、結束各階段的邏輯
* 前端路由返回（Frontend Navigation Back）：通話結束後把使用者導回原本畫面或首頁的動作
* 使用者體驗（User Experience, UX）：使用者實際操作系統時感受到的整體順暢度與舒適度
* 按鈕樣式（Button Styling）：針對按鈕外觀做顏色、大小、圓角等設計的 CSS 設定
* 活動/非活動狀態（Active/Inactive State）：用來區分元件目前是否啟用或運作中的標記
* 錯誤訊息（Error Message）：在流程出錯時顯示給開發者或使用者看的問題說明
* 主題樣式表（Theme Stylesheet）：集中定義按鈕、背景、字體等整體風格的 CSS 檔
* 狀態旗標（State Flag）：用布林值記錄某個狀態是否成立的變數
* 前端元件庫（Component Library）：收集一組常用 UI 元件，方便在專案中重複使用的套件或設計系統
* 虛擬環境（Virtual Environment）：在專案中建立獨立的 Python 執行空間，隔離不同專案的套件與版本
* 相依套件（Dependencies）：程式運作時所需安裝的外部函式庫或套件集合
* 需求檔（requirements.txt）：列出專案所有相依套件與版本給 pip 安裝用的檔案
* 環境變數檔（.env File）：用來存放 API 金鑰等敏感設定、不直接寫在程式碼裡的檔案
* 私密金鑰（Private Key）：只能在後端保存、權限較高的機密 API 金鑰
* HTTP 要求（HTTP Request）：從用戶端送到伺服器的一筆網路請求
* HTTP 回應（HTTP Response）：伺服器處理完請求後回傳給用戶端的資料
* GET 請求（GET Request）：用來向伺服器「讀取」資料的一種 HTTP 方法
* 授權標頭（Authorization Header）：在 HTTP 請求中夾帶身分驗證資訊的標頭欄位
* 持有人權杖（Bearer Token）：以「Bearer XXX」形式附在授權標頭，用來驗證使用者或服務身分的字串
* 狀態碼（Status Code）：描述 HTTP 請求結果的三位數代碼（如 200、400、500）
* JSON 物件（JSON Object）：用鍵值對方式表示資料的文字格式，常用於 API 傳輸
* JSON 解析（JSON Parsing）：把 JSON 字串轉換為程式內可操作的資料結構的過程
* API 端點（API Endpoint）：對外提供服務的特定 URL 路徑
* 呼叫識別碼（Call ID）：用來唯一標示某一次語音通話記錄的 ID
* 通話紀錄（Call Log）：保存一通通話相關所有細節與訊息的資料
* 結構化輸出（Structured Output）：依固定欄位格式輸出的資料，方便前端或系統使用
* 錯誤處理（Error Handling）：在程式遇到錯誤時，優雅處理而不是直接崩潰的做法
* 異常捕捉（Exception Handling）：用 try/except 把執行時錯誤攔下來並做相對應處理
* 日誌輸出（Logging）：在後端持續記錄執行狀態與錯誤訊息，方便除錯與追蹤
* 代理伺服器（Proxy Server）：代替前端向外部服務發送請求、轉傳結果的中間伺服器
* 跨來源資源共用（CORS）：瀏覽器規範，限制與控制不同網域之間發送請求的安全機制
* Flask 框架（Flask Framework）：輕量級的 Python 網頁與 API 伺服器框架
* 路由裝飾器（Route Decorator）：用來標記某個函式對應哪一個 URL 路徑與方法的語法
* 路由處理函式（Route Handler）：實際處理特定 URL 請求邏輯的後端函式
* JSON 回應（JSON Response）：伺服器以 JSON 格式回傳給前端的資料
* 查詢參數（Query Parameter）：URL 中「?」後面用來傳遞額外參數的 key=value 配對
* 請求參數解析（Request Args Parsing）：從查詢參數中把需要的值取出來的過程
* 伺服器啟動（Server Run）：讓後端程式開始監聽某個埠號並接受請求的動作
* 偵錯模式（Debug Mode）：在開發時提供更詳細錯誤訊息與自動重啟功能的模式
* Python 請求套件（requests Library）：Python 中用來發送 HTTP 請求的常用套件
* 作業系統模組（os Module）：Python 中用來存取環境變數與檔案路徑等作業系統功能的模組
* 環境載入工具（python-dotenv）：專門用來載入 .env 檔案內容到環境變數的工具套件
* 伺服器 SDK（Server SDK）：提供後端使用者更方便操作 API 的官方程式庫
* API 參考文件（API Reference）：列出所有可用端點、參數與回應格式的技術文件
* 通話成本資訊（Call Cost Information）：描述某一次語音通話所產生費用的資料
* 分析結果（Analysis Result）：對通話內容進行 AI 分析後產生的結論與結構化資料
* 成功評估（Success Evaluation）：判定這次通話是否達成預期目的的評量結果
* 通話摘要（Call Summary）：對整通通話內容做簡短敘述與重點整理的文字
* 前後端分離架構（Frontend-Backend Separation）：前端與後端獨立開發、以 API 溝通的系統設計方式
* 安全性權限控制（Security Permissions）：限制哪些操作與資料只有授權方可以存取的機制
* 機密資訊保護（Sensitive Data Protection）：避免用戶資料與金鑰在前端或公開環境外洩的做法
* HTTP 查詢字串（Query String）：URL 中攜帶查詢參數的一整段文字部分
* 內部伺服器錯誤（Internal Server Error）：伺服器端發生未預期問題時回傳的 500 狀態碼
* 錯誤訊息回傳（Error Message Response）：在 API 回應中附帶描述錯誤原因的文字或欄位
* 參數驗證（Parameter Validation）：檢查請求中是否帶有必要的欄位與正確格式的過程
* API 呼叫流程（API Call Flow）：從前端發送請求、後端轉呼外部服務再回傳結果的整體步驟
* 伺服器埠號（Server Port）：用來區分同一台機器上不同網路服務的數字編號
* 本機開發環境（Local Development Environment）：在自己電腦上啟動伺服器與前端進行開發測試的環境
* 回傳格式設計（Response Schema Design）：規劃 API 回應中欄位名稱與資料結構的設計工作
* 跨來源資源共用（CORS, Cross-Origin Resource Sharing）：瀏覽器規則，限制前端向不同網域發送請求，避免安全問題
* 反向代理（Proxy）：由前端伺服器代替使用者把請求轉發到後端伺服器的中介層
* 開發伺服器（Dev Server）：在開發階段提供熱重載與本機預覽的伺服器
* 目標伺服器（Target Server）：代理要把請求真正轉送到的後端位址
* 更改來源標頭（Change Origin）：在代理時修改 HTTP Origin 標頭成為目標伺服器的網域
* 不安全連線（Insecure Connection）：未驗證憑證或未加密的 HTTP/SSL 連線
* HTTP 通訊協定（HTTP Protocol）：網頁用來傳輸請求與回應的應用層協定
* HTTPS 通訊協定（HTTPS Protocol）：在 HTTP 上加上 TLS/SSL 加密的安全通訊協定
* API 端點（API Endpoint）：後端提供服務的具體 URL 路徑
* 呼叫詳情路由（Call Details Route）：專門用來查詢單一通話詳細資訊的 API 路徑
* 前後端通訊（Frontend-Backend Communication）：瀏覽器與伺服器之間交換資料的過程
* 查詢字串參數（Query String Parameter）：URL 中 `?key=value` 形式附加的參數
* 呼叫識別碼（Call ID）：用來唯一識別每一通語音通話的 ID 值
* 週期輪詢（Periodic Polling）：固定間隔反覆向後端詢問最新狀態的技巧
* 輪詢間隔（Polling Interval）：兩次輪詢請求之間等待的時間長度
* 後處理分析（Post-call Analysis）：通話結束後，由模型分析通話內容的階段
* 結構化分析資料（Structured Analysis Data）：以固定欄位與型別呈現的分析結果資料
* JSON 回應（JSON Response）：後端以 JSON 格式回傳的資料物件
* JSON 解析（JSON Parsing）：把字串形式的 JSON 轉成可操作物件的過程
* 非同步請求（Asynchronous Request）：不會阻塞主執行緒、完成後再回報結果的網路請求
* Promise 鏈（Promise Chain）：連續使用 `then` 來依序處理非同步結果的寫法
* then 回呼（then Callback）：在 Promise 成功時被呼叫、處理回傳資料的函式
* catch 錯誤處理（catch Error Handling）：在 Promise 失敗時捕捉錯誤並處理的機制
* 設定逾時（setTimeout）：指定延遲一段時間後再執行某段程式碼的函式
* 遞迴呼叫（Recursive Call）：函式在自己內部再次呼叫自己的寫法
* 結構化資料欄位（Structured Data Field）：在 schema 中定義好的單一屬性欄位
* 合格旗標（Qualified Flag）：記錄使用者是否通過資格審核的布林欄位
* 摘要欄位（Summary Field）：儲存整通通話簡短文字摘要的欄位
* 結構化回應物件（Structured Response Object）：包含分析結果與摘要的完整 JSON 物件
* 載入結果狀態（Loading Result State）：代表目前正在等待後端分析結果的 UI 狀態標記
* 代理錯誤（Proxy Error）：前端代理請求時，轉發或連線失敗產生的錯誤
* 非預期 JSON 結尾（Unexpected End of JSON）：表示伺服器回傳的 JSON 資料不完整或壞掉的錯誤
* 主控台輸出（Console Logging）：用 `console.log` 在瀏覽器開發工具中印出偵錯資訊
* 開發模式設定（Development Configuration）：只在開發階段使用的 Vite 或建置工具設定
* 生產模式部署（Production Deployment）：把應用程式部署到正式環境讓真實使用者使用
* 結構化輸出欄位（Structured Output Field）：在 AI 分析設定裡定義要輸出的單一欄位
* 聯絡資訊欄位（Contact Fields）：像姓名、Email、電話等用來聯絡使用者的欄位
* 後端分析服務（Backend Analysis Service）：負責根據通話紀錄進行 LLM 分析的伺服器端程式
* 自動重試機制（Auto-Retry Mechanism）：在結果尚未準備好時，自動再次嘗試請求資料的流程
* 呼叫結果物件（Call Result Object）：前端儲存某通通話完整結果的狀態物件
* 狀態驅動 UI（State-driven UI）：依照 React 狀態變化自動更新畫面的設計方式
* 錯誤提示（Error Alert）：在畫面上用警示或彈窗呈現錯誤訊息的做法
* 語音提供者（Voice Provider）：像 11Labs 這類提供 TTS 語音服務的第三方平台
* 語音模型（Voice Model）：負責產生語音的特定模型版本設定
* 語音樣式 ID（Voice ID）：指定要使用哪一種聲音風格的識別字串
* 模型版本（Model Version）：同一服務下，不同世代或性能設定的模型編號
* 語音自然度（Speech Naturalness）：衡量語音聽起來像真人程度的品質指標
* 後端 webhook（Backend Webhook）：由外部服務主動回呼到你伺服器的通知端點
* 事件驅動整合（Event-driven Integration）：以事件（如通話結束）觸發後端邏輯的整合方式
