Update app.py
Browse files
app.py
CHANGED
|
@@ -1,17 +1,23 @@
|
|
| 1 |
import gradio as gr
|
| 2 |
import time
|
| 3 |
|
| 4 |
-
# --- 1. 深度強化版知識庫 (
|
| 5 |
-
# 這裡的建議經過深化,更簡潔、更具指導性,符合互動查詢的特性。
|
| 6 |
knowledge_base_deep = {
|
| 7 |
-
|
| 8 |
-
"
|
| 9 |
-
"
|
| 10 |
-
"
|
| 11 |
-
"
|
| 12 |
-
|
| 13 |
-
|
| 14 |
-
"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 15 |
}
|
| 16 |
|
| 17 |
# 模擬 AI 姿勢分析的函式
|
|
@@ -48,90 +54,82 @@ def generate_training_plan(goal, hours, focus_areas):
|
|
| 48 |
|
| 49 |
# --- 3. 建立 Gradio Blocks 介面 ---
|
| 50 |
with gr.Blocks(theme=gr.themes.Soft(), title="智慧羽球教練") as demo:
|
| 51 |
-
gr.Markdown("# 🏸 智慧羽球教練
|
| 52 |
|
| 53 |
-
with gr.Accordion("
|
| 54 |
-
|
| 55 |
-
|
| 56 |
-
這份指南旨在打破您的技術瓶頸,引導您從「會打球」提升到「懂比賽」的層次。
|
| 57 |
-
---
|
| 58 |
-
### 1. 基本功 (Fundamentals)
|
| 59 |
-
#### 基礎概念
|
| 60 |
-
握拍、發球、步法是羽球的入門三要素。
|
| 61 |
-
#### 進階深化
|
| 62 |
-
基本功的精髓在於「**放鬆**」與「**效率**」。高手並非更用力,而是更懂得在對的時機發力,並用最少的體力完成最高效的移動。
|
| 63 |
-
> **握拍的精髓:靈活的手指**
|
| 64 |
-
> - **「虛握實打」**:非擊球時,應以姆指、食指、小指輕扣球拍,掌心是中空的。只有在擊球的瞬間,手指才發力抓緊,產生「甩鞭效應」,這就是爆發力的來源。
|
| 65 |
-
> - **食指與拇指的角色**:食指如「油門」,控制正手拍面的角度與力量;拇指如「方向盤」,主導反手球的方向與變化。
|
| 66 |
-
|
| 67 |
-
> **步法的核心:啟動步與回位**
|
| 68 |
-
> - **啟動步 (Split Step)**:這不是一個普通的墊步,而是**預判與反應的連結**。在對手揮拍**即將觸球的瞬間**,雙腳需輕微跳起並分開落地。
|
| 69 |
-
> - **效率至上的回位**:每次擊球後,第一時間想的不是欣賞自己的出球,而是如何用最高效的路線回到場中央,為下一拍做準備。
|
| 70 |
-
|
| 71 |
-
### 2. 技術 (Techniques)
|
| 72 |
-
#### 基礎概念
|
| 73 |
-
高、殺、吊、抽、網前是主要的擊球技術。
|
| 74 |
-
#### 進階深化
|
| 75 |
-
高階技術的對決,比的是「**一致性**」與「**變化性**」。您的所有擊球動作,在引拍階段看起來都應該是幾乎一樣的。
|
| 76 |
-
> **高遠球的分化:進攻型 vs 防守型**
|
| 77 |
-
> - **防守型高遠球**:當您失位時使用。球的飛行弧度要**高**���落點要**深**,為自己爭取回位時間。
|
| 78 |
-
> - **進攻型平高球**:當對手站位靠前時使用。球的飛行弧度要**平**、速度要**快**,快速壓到對手後場。
|
| 79 |
|
| 80 |
-
> **殺球的再思考:力量、角度與落點**
|
| 81 |
-
> - **力量來自傳遞**:真正的殺球力量來自**蹬地 -> 轉體 -> 揮臂 -> 閃腕**的動力鏈傳遞。
|
| 82 |
-
> - **角度比力量更致命**:練習將殺球的落點控制在**邊線**與**追身**,並追求更**尖、更陡**的擊球角度。
|
| 83 |
-
|
| 84 |
-
### 3. 戰術 (Tactics)
|
| 85 |
-
#### 基礎概念
|
| 86 |
-
拉吊結合、殺上網是常用戰術組合。
|
| 87 |
-
#### 進階深化
|
| 88 |
-
戰術的本質是「**創造並利用空間**」,以及「**控制對手的時間與體力**」。
|
| 89 |
-
> **控制節奏,而非被節奏控制**
|
| 90 |
-
> - 主動利用**快節奏**(平抽、突擊)或**慢節奏**(高遠球、吊球)來破壞對手的習慣。
|
| 91 |
-
|
| 92 |
-
> **穩定性本身就是一種終極武器**
|
| 93 |
-
> - 在業餘比賽中,超過70%的分數來自於對手的失誤。**將球穩定地回到對手場內,本身就是一種極具壓迫性的戰術**。
|
| 94 |
-
|
| 95 |
-
### 4. 體能 (Physical Fitness)
|
| 96 |
-
#### 基礎概念
|
| 97 |
-
需要肌力、耐力、敏捷性。
|
| 98 |
-
#### 進階深化
|
| 99 |
-
羽球的體能需求是「**持續性的無氧爆發**」。訓練也應以此為核心。
|
| 100 |
-
> **最高效的耐力訓練:間歇訓練 (Interval Training)**
|
| 101 |
-
> - **高強度間歇訓練 (HIIT)**,例如:30秒的快速折返跑接15秒休息,重複10組,更能模擬比賽的真實情況。
|
| 102 |
-
|
| 103 |
-
### 5. 心態 (Mentality)
|
| 104 |
-
#### 基礎概念
|
| 105 |
-
保持專注、自信、抗壓。
|
| 106 |
-
#### 進階深化
|
| 107 |
-
強大的心態不是與生俱來的,而是可以透過刻意練習來培養的「**精神肌肉**」。
|
| 108 |
-
> **建立「儀式感」來重置心態**
|
| 109 |
-
> - 為自己建立一個簡單的儀式(例如:深呼吸三次),當您感到緊張或懊悔時,執行這個儀式能幫助您的大腦脫離負面情緒,重新回到當下。
|
| 110 |
-
|
| 111 |
-
> **專注於過程,而非結果**
|
| 112 |
-
> - 當您腦中想著「我一定要贏下這一分」時,壓力會讓您的肌肉僵硬。相反,您應該將注意力放在**可控的過程**上,例如:「我要做好啟動步」。
|
| 113 |
-
"""
|
| 114 |
-
)
|
| 115 |
|
| 116 |
with gr.Tabs():
|
| 117 |
with gr.TabItem("📚 互動訓練建議"):
|
| 118 |
gr.Markdown("## 互動式進階訓練建議")
|
| 119 |
-
gr.Markdown("從下面的選單中選擇您想加強的項目,系統會提供**可執行的進階訓練提示**!")
|
| 120 |
|
| 121 |
skill_dropdown = gr.Dropdown(
|
| 122 |
choices=list(knowledge_base_deep.keys()),
|
| 123 |
label="我想深化我的...",
|
| 124 |
-
value="
|
| 125 |
)
|
| 126 |
advice_output = gr.Markdown(label="您的專屬訓練建議")
|
| 127 |
|
| 128 |
-
# 互動邏輯
|
| 129 |
def update_advice(skill_area):
|
| 130 |
return knowledge_base_deep.get(skill_area)
|
| 131 |
|
| 132 |
skill_dropdown.change(fn=update_advice, inputs=skill_dropdown, outputs=advice_output)
|
| 133 |
demo.load(fn=update_advice, inputs=skill_dropdown, outputs=advice_output)
|
| 134 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 135 |
with gr.TabItem("🚀 創新 AI 功能"):
|
| 136 |
with gr.Accordion("🤖 AI 姿勢分析 (功能模擬)", open=True):
|
| 137 |
gr.Markdown("**操作說明:** 請上傳一段您的揮拍或步法影片,AI 將進行分析並提供回饋。(此為功能模擬,會回傳一個範例報告)")
|
|
@@ -142,9 +140,9 @@ with gr.Blocks(theme=gr.themes.Soft(), title="智慧羽球教練") as demo:
|
|
| 142 |
|
| 143 |
with gr.Accordion("📅 個人化智慧訓練計畫", open=False):
|
| 144 |
gr.Markdown("**操作說明:** 請輸入您的目標與狀況,系統將為您生成一份客製化的週訓練計畫。")
|
| 145 |
-
plan_goal = gr.Radio(choices=["健康娛樂", "球技精進", "業餘比賽準備"], label="您的主要目標是?", value="
|
| 146 |
plan_hours = gr.Slider(minimum=1, maximum=10, value=3, step=1, label="每週可訓練幾小時?")
|
| 147 |
-
plan_focus = gr.CheckboxGroup(choices=
|
| 148 |
plan_button = gr.Button("生成我的訓練計畫", variant="primary")
|
| 149 |
plan_output = gr.Markdown(label="您的專屬訓練計畫")
|
| 150 |
plan_button.click(fn=generate_training_plan, inputs=[plan_goal, plan_hours, plan_focus], outputs=plan_output)
|
|
|
|
| 1 |
import gradio as gr
|
| 2 |
import time
|
| 3 |
|
| 4 |
+
# --- 1. 深度強化版知識庫 (已加入雙打專項) ---
|
|
|
|
| 5 |
knowledge_base_deep = {
|
| 6 |
+
# --- 單打基礎 ---
|
| 7 |
+
"單打: 握拍 (Grip)": "#### 💡 進階提示:練習「虛握實打」\n**訓練建議:**\n1. **對牆練習:** 對牆連續擊球,專注感受非擊球狀態下「掌心懸空」的放鬆感。\n2. **發力練習:** 僅在球拍即將觸球的0.1秒,才用手指與手腕發力抓緊,製造清脆的「鞭擊」聲。這是提升所有球質(尤其是殺球)的關鍵。",
|
| 8 |
+
"單打: 步法 (Footwork)": "#### 💡 進階提示:掌握「啟動步」的時機\n**訓練建議:**\n1. **無球模仿:** 觀看高手比賽影片,在對手即將擊球的瞬間,跟著同步做出「雙腳微跳、分開落地」的啟動步。\n2. **節奏訓練:** 和球友對練時,有意識地將自己的啟動步節奏與對方的擊球節奏同步。這是從被動防守轉向主動預判的第一步。",
|
| 9 |
+
"單打: 高遠球 (Clear)": "#### 💡 進階提示:分化「防守型」與「進攻型」\n**訓練建議:**\n1. **防守練習:** 要求自己打出的每一拍高遠球,都必須高到讓你有充足時間「回到場中央並完成啟動步」。\n2. **進攻練習:** 練習「平高球」,要求球的飛行弧度更平、速度更快,目標是讓球在對手來不及完全側身的情況下,就壓到其後場。",
|
| 10 |
+
"單打: 殺球 (Smash)": "#### 💡 進階提示:追求「角度」而非蠻力\n**訓練建議:**\n1. **殺邊線練習:** 在對面場地的兩側邊線附近放置羽球筒,練習將殺球精準地打向目標。\n2. **殺追身練習:** 練習將球殺向陪練員的持拍手肩膀與身體軀幹位置,這種追身球往往比殺空檔更讓對手難受。",
|
| 11 |
+
|
| 12 |
+
# --- 雙打專項 ---
|
| 13 |
+
"雙打: 輪轉換位 (Rotation)": "#### 💡 進階提示:以球路決定走位\n**訓練建議:**\n和搭檔進行「攻防轉換」演練:一人在後場殺球/吊球,一人上網封網(形成前後);接著前場搭檔故意挑高球,兩人應瞬間向兩側退回「左右防守」站位。重複此循環,培養輪轉的肌肉記憶。",
|
| 14 |
+
"雙打: 平抽擋 (Drive)": "#### 💡 進階提示:保持拍頭在前\n**訓練建議:**\n1. **半場對抽:** 與搭檔在半場範圍內進行連續快速的平抽對打,目標是比誰能維持更長的回合數。\n2. **保持舉拍:** 在練習中,強制要求自己無論在準備還是回球後,拍頭始終要舉在身體前方,縮短下次出手的反應時間。",
|
| 15 |
+
"雙打: 發接發搶攻 (Serve/Return)": "#### 💡 進階提示:第三拍決定權\n**訓練建議:**\n1. **發球人練習:** 在你發完小球後,不要原地站著,立刻舉拍準備封網,練習撲、推、放網前的第三拍回球。\n2. **接球人練習:** 練習多種接發球路,包括輕推網前兩腰、快推後場底線,目標是破壞對方發球上網的連貫性。",
|
| 16 |
+
"雙打: 封網意識 (Net Kill)": "#### 💡 進階提示:不出手也是一種威脅\n**訓練建議:**\n1. **舉拍壓迫:** 當搭檔在後場進攻時,你在前場的主要任務是「舉起球拍、重心壓低」,光是這個動作就能給對手極大的回球壓力。\n2. **封直線優先:** 對手在被動情況下,最常回直線網前球。練習優先封鎖直線路線,是最高效的得分手段。",
|
| 17 |
+
|
| 18 |
+
# --- 通用項目 ---
|
| 19 |
+
"通用: 體能 (間歇訓練)": "#### 💡 進階提示:模擬「比賽強度」\n**訓練建議:**\n1. **全場米字步間歇:** 快速跑動完成一組全場米字步 (約30-40秒),休息20秒,重複8-10組。\n2. **多球組合訓練:** 讓教練或球友從多點餵球給你,模擬「殺上網」、「吊上網」等連續組合球路,一組持續1分鐘,休息30秒,重複5-8組。",
|
| 20 |
+
"通用: 心態 (建立儀式感)": "#### 💡 進階提示:用「儀式」重置大腦\n**訓練建議:**\n1. **設計你的儀式:** 建立一個屬於你的、在得分或失分後執行的簡單動作。例如:走到後場、轉動球拍、深呼吸一次。\n2. **刻意練習:** 在平時練習中,每次發球前或重要分數練習時,都刻意執行你的儀式,直到它成為自動化的習慣。這能在高壓下幫你保持冷靜。"
|
| 21 |
}
|
| 22 |
|
| 23 |
# 模擬 AI 姿勢分析的函式
|
|
|
|
| 54 |
|
| 55 |
# --- 3. 建立 Gradio Blocks 介面 ---
|
| 56 |
with gr.Blocks(theme=gr.themes.Soft(), title="智慧羽球教練") as demo:
|
| 57 |
+
gr.Markdown("# 🏸 智慧羽球教練 v4.0 (雙打專區強化版)")
|
| 58 |
|
| 59 |
+
with gr.Accordion("點此展開/收合:羽球實力進階深度指南 (單打為主)", open=False):
|
| 60 |
+
# ... (此處省略上一版的單打詳細內容,以保持程式碼簡潔,實際運行時應保留)
|
| 61 |
+
gr.Markdown("此處為v3.0版本的單打深度指南內容...")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 62 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 63 |
|
| 64 |
with gr.Tabs():
|
| 65 |
with gr.TabItem("📚 互動訓練建議"):
|
| 66 |
gr.Markdown("## 互動式進階訓練建議")
|
| 67 |
+
gr.Markdown("從下面的選單中選擇您想加強的項目,系統會提供**可執行的進階訓練提示**!(已加入雙打選項)")
|
| 68 |
|
| 69 |
skill_dropdown = gr.Dropdown(
|
| 70 |
choices=list(knowledge_base_deep.keys()),
|
| 71 |
label="我想深化我的...",
|
| 72 |
+
value="雙打: 輪轉換位 (Rotation)"
|
| 73 |
)
|
| 74 |
advice_output = gr.Markdown(label="您的專屬訓練建議")
|
| 75 |
|
|
|
|
| 76 |
def update_advice(skill_area):
|
| 77 |
return knowledge_base_deep.get(skill_area)
|
| 78 |
|
| 79 |
skill_dropdown.change(fn=update_advice, inputs=skill_dropdown, outputs=advice_output)
|
| 80 |
demo.load(fn=update_advice, inputs=skill_dropdown, outputs=advice_output)
|
| 81 |
|
| 82 |
+
# --- 全新的雙打專區 ---
|
| 83 |
+
with gr.TabItem("🏸 雙打專區"):
|
| 84 |
+
gr.Markdown(
|
| 85 |
+
"""
|
| 86 |
+
## 雙打核心觀念:從入門到進階
|
| 87 |
+
雙打的精髓在於**創造機會給搭檔**,並透過**快速、連貫的進攻**壓制對手。它更強調反應速度、平抽快擋以及默契配合。
|
| 88 |
+
---
|
| 89 |
+
### 1. 雙打戰略 (Strategy)
|
| 90 |
+
雙打的基本戰略思維是「**向下出球**」,盡一切可能避免被動起高球。
|
| 91 |
+
> **進攻是最好的防守**
|
| 92 |
+
> - **主動進攻**: 透過殺、吊、點、撲等技術,迫使球頭向下,讓對手只能被動地從低位防守挑球。
|
| 93 |
+
> - **避免挑球**: 除非萬不得已,不要輕易挑高球。每一次挑球,都意味著將進攻權拱手讓給對手。
|
| 94 |
+
|
| 95 |
+
> **發接發決定開局**
|
| 96 |
+
> - **發球**: 雙打發球以**高品質的小球**為主,要求貼網、過網即墜,不給對手撲球的機會。
|
| 97 |
+
> - **接發球**: 接��球要極具攻擊性,目標是**搶攻第三拍**。可以透過推撲兩腰、輕放網前、或偷推後場等方式直接破壞對方的進攻隊形。
|
| 98 |
+
|
| 99 |
+
---
|
| 100 |
+
### 2. 雙打技術 (Techniques)
|
| 101 |
+
雙打需要的技術更講求**速度、簡潔、突然性**。
|
| 102 |
+
> **平抽擋 (Drive)**
|
| 103 |
+
> - **描述**: 雙打中使用頻率最高的技術,在中前場進行快速、平直的來回擊球。
|
| 104 |
+
> - **要點**: 動作小、引拍快、發力集中,以手腕和手指的力量為主,身體保持穩定。
|
| 105 |
+
|
| 106 |
+
> **推擋 (Push/Block)**
|
| 107 |
+
> - **描述**: 在防守時,用柔和的力量將對方的殺球或重擊,精準地擋回到網前或場地空檔。
|
| 108 |
+
> - **要點**: 用拍面控制角度,借力使力,目的是破壞對方的連續進攻節奏。
|
| 109 |
+
|
| 110 |
+
> **點殺與抽壓 (Half-Court Smash)**
|
| 111 |
+
> - **描述**: 在中場位置,使用快速、短促的發力,將球以尖銳的角度向下打。
|
| 112 |
+
> - **要點**: 不求全力,但求突然性與落點精準,目的是為搭檔創造封網機會。
|
| 113 |
+
|
| 114 |
+
---
|
| 115 |
+
### 3. 雙打走位 (Rotation)
|
| 116 |
+
雙打的靈魂在於兩位球員如齒輪般精確地輪轉換位。基本站位有兩種:
|
| 117 |
+
> **前後進攻站位 (Attacking Formation)**
|
| 118 |
+
> - **時機**: 當我方取得進攻權時(例如:殺球、吊球)。
|
| 119 |
+
> - **站位**: 一人位於網前(通常是T字線附近),負責封網、做球;另一人位於後場,負責下壓進攻。
|
| 120 |
+
> - **原則**: 前場隊員為後場隊員創造殺球機會,後場隊員的殺球為前場隊員創造封網機會。
|
| 121 |
+
|
| 122 |
+
> **左右防守站位 (Defensive Formation)**
|
| 123 |
+
> - **時機**: 當我方被迫挑起高球,失去進攻權時。
|
| 124 |
+
> - **站位**: 兩人平行站位,各守半場,共同分擔防守區域。
|
| 125 |
+
> - **原則**: 保持移動,準備接殺。誰接到球,誰就負責回球,另一人則補位保護。
|
| 126 |
+
|
| 127 |
+
> **輪轉換位 (The Rotation)**
|
| 128 |
+
> - **守轉攻**: 當處於左右防守的球員,將對方的殺球**擋出一個高品質的網前球**時,該球員應**立刻向前跟進**,轉為前場球員,其搭檔則自動後移補上後場,形成「前後進攻」。
|
| 129 |
+
> - **攻轉守**: 當處於前後進攻的前場球員,**被迫挑起高球**時,該球員應**立刻向自己所在的半場後退**,其後場搭檔則向前微調,形成「左右防守」。
|
| 130 |
+
"""
|
| 131 |
+
)
|
| 132 |
+
|
| 133 |
with gr.TabItem("🚀 創新 AI 功能"):
|
| 134 |
with gr.Accordion("🤖 AI 姿勢分析 (功能模擬)", open=True):
|
| 135 |
gr.Markdown("**操作說明:** 請上傳一段您的揮拍或步法影片,AI 將進行分析並提供回饋。(此為功能模擬,會回傳一個範例報告)")
|
|
|
|
| 140 |
|
| 141 |
with gr.Accordion("📅 個人化智慧訓練計畫", open=False):
|
| 142 |
gr.Markdown("**操作說明:** 請輸入您的目標與狀況,系統將為您生成一份客製化的週訓練計畫。")
|
| 143 |
+
plan_goal = gr.Radio(choices=["健康娛樂", "球技精進", "業餘比賽準備"], label="您的主要目標是?", value="球技精進")
|
| 144 |
plan_hours = gr.Slider(minimum=1, maximum=10, value=3, step=1, label="每週可訓練幾小時?")
|
| 145 |
+
plan_focus = gr.CheckboxGroup(choices=list(knowledge_base_deep.keys()), label="本週想特別加強的項目?(可多選)", value=["雙打: 輪轉換位 (Rotation)"])
|
| 146 |
plan_button = gr.Button("生成我的訓練計畫", variant="primary")
|
| 147 |
plan_output = gr.Markdown(label="您的專屬訓練計畫")
|
| 148 |
plan_button.click(fn=generate_training_plan, inputs=[plan_goal, plan_hours, plan_focus], outputs=plan_output)
|