# 專案概覽與目標 ![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):以事件(如通話結束)觸發後端邏輯的整合方式