Case study · OneStroke 一拍

用手機影片
看懂每一拍的網球分析產品

我在球機場自主練球,市面的分析工具給了分數,卻說不出差在哪、下一步練什麼。我把這個困擾做成一個可以拿去試賣的產品:上傳一段練習影片,自動切出每一拍、打分數、像教練一樣診斷,再把人還原成 3D。

角色
產品負責人(定義、研究、驗證、設計決策)
階段
可試賣的 MVP
團隊
我+AI 編碼代理(Claude Code)
形態
手機網頁+本機運算,PDF 報告與分享影片
48 秒產品介紹影片;點「開聲音」從頭聽原創配樂。
0 元每場的運算成本,影片不離開自己的電腦
107次提交,每一步都能單獨驗收
13版評分模型,歷史紀錄一鍵重算
158 拍8 分半影片自動切出,本人逐拍確認
0.91轉肩速度與 OptiSwing 的逐拍相關
Problem

分數很多,但不知道下一步該練什麼

現有工具的缺口

  • 我用 OptiSwing 分析同一段影片:「手臂旋轉」直接 100 分,分數飽和、失去區分度
  • 只給每項數字,看不出「最該改的是哪一個」
  • 沒有練習方法,也不會在下一次幫你驗收有沒有進步

替代方案的成本

  • 一對一私人課每小時約 NT$800–1,600(PRO360 行情),教練也很少拿數據說明
  • 國外人工影片分析單次 £35–55,要等好幾天
  • 機會:手機錄影已經很普及,姿態估計模型也成熟到可以在一般電腦上跑
Users & context

先服務一個非常具體的情境

第一版只鎖定我自己的使用情境,讓每個假設都能用真實資料檢查;架構上預留教練帶學員的延伸。

主要使用者:自主練球的業餘球員

室內球機場、一個人打、手機固定在場邊。一次練 10 分鐘左右、100 拍以上。想知道今天哪裡打得好、哪裡要改、下次練什麼。

延伸使用者:帶學員的教練

要分開管理每位學員的資料、給學員只看得到自己的連結,並交出一份正式的報告。這是核心流程驗證過之後才加進來的,作為之後帳號系統的基礎。

Principles

我先寫下的五條規則

這些規則寫在專案規格的最前面,後面每一個取捨都回頭對照它們。

授權先行

保留商業化的可能,所以選型一律優先可商用授權。主流的 SMPL 系 3D 人體模型不能商用,直接排除;每引入一個模型,就把版本、授權、能不能商用記下來。

原始值是資料,分數是衍生層

永遠只存角度、速度、位移這些原始指標,分數在產生報告時才算,評分公式標版本。公式改了,所有歷史練習可以重算,趨勢不會斷。

每個數字都有出處

評分的參考值來自運動生物力學文獻:高水準選手的平均換算成 80 分、平均減兩個標準差是 50 分;出處逐條記在評分說明文件裡。

比排序,不比絕對值

單一鏡頭的 3D 跟實驗室動作捕捉有系統性偏差。驗證時不要求數字一樣,只要求哪幾拍高、哪幾拍低的排序和趨勢一致。

像教練說話

報告的讀者是打球的人。內文用白話和身體的比喻,例如「三球有一球」「一個拳頭」;原始數字收進可以展開的「看數據」,當作證據。

Product architecture

一個閉環:診斷 → 練習 → 驗收

產品的核心不是「給分數」,而是讓每一次練習都接到下一次。上傳之後的每個畫面,都在這個閉環的某一步上。

Technical architecture

本機運算、網頁介面,預留帳號與雲端

第一版刻意不上雲:影片留在自己的電腦,運算成本是零,又能在手機上看。每一層都留了往雲端與帳號系統走的接口。

Model architecture

聲音+動作找出每一拍,2D 為主、3D 補強

每個模型都有明確的分工與授權。2D 每一幀都跑、成本低;3D 只跑關鍵的拍與關鍵的幾格,補 2D 量不到的轉動與手臂。

Decision log

七個關鍵取捨

決策 01

3D 人體要用哪個模型

情境
要量轉肩、手臂旋轉,2D 不夠;但準確度最好的幾個模型都是 SMPL 系,授權不能商用。
選項
WHAM / GVHMR(SMPL)SAM 3D Body只用 2D
決定
3D 用 Meta 的 SAM 3D Body,2D 用 Apache-2.0 的 RTMPose 與 MediaPipe;把商用前仍需律師確認的條款列成清單。
結果
保住商業化的路,同時拿到手臂旋轉、腕部這些 2D 量不到的指標。
決策 02

2D 量不準的指標怎麼辦

情境
做了兩個姿態模型互相比對的資料稽核,發現髖肩分離角在 2D 下兩個模型對不起來。
決定
把它移出計分,只當參考;之後每個指標依拍攝角度標「可信/參考/不可信」。
結果
寧可少一項分數,也不給使用者錯的數字;後來支援正面、背後等角度時,這張可信度表直接沿用。
決策 03

3D 太慢,要不要上雲端

情境
SAM 3D 在 Mac 上每拍 13–25 秒,一場 150 拍要 40 分鐘以上;雲端 GPU 的成本還沒實測。
選項
全部上雲端全部本機關鍵幀+插值,只跑關鍵的拍
決定
只算關鍵幀再插值;上傳後自動挑 5 拍(本場最佳、典型、方案的目標拍與問題拍、待改進),其他拍按需補跑,並記下每次用量。
結果
每場的 3D 從 40 分鐘以上降到約 2 分鐘;用量紀錄直接成為「基本 5 拍、全場加購」收費方案的計費依據。
決策 04

沒有 3D 時,骨架常把手腳前後弄反

情境
2D 只看得到平面,四肢前後顛倒的比例在不同角度有 11–28%。
決定
用 SAM 3D 的結果當老師,訓練一個只吃 2D 的小模型判斷前後,混合進原本的骨架;同時確認 SAM 授權沒有禁止用輸出訓練。
結果
顛倒率降到正面 2%、右後 3%、側面 9%、背後 14%,而且不用多付 3D 的運算成本。
決策 05

分享影片要長什麼樣子

情境
使用者想把好球分享出去,這也是最便宜的獲客管道;需求是「要高級、能病毒傳播、展示厲害的東西」。
決定
預設樣式做成「3D 子彈時間」:原片播一次 → 擊球瞬間定格 → 本人變成 3D 雕塑繞一圈 → 回原片收拍;片尾品牌畫面固定、不能關。
結果
每一支分享影片都是一則產品示範;之後的「最佳 vs 典型」對比影片也沿用同一套 3D 舞台。
決策 06

要不要在手機端先壓縮再上傳

情境
一場原片約 580 MB,手機上傳很慢。
實驗
手機端先切片:仍要上傳 79–84%,不划算。壓成 720p 2Mbps:大小降到 1/4,拍數、正反手幾乎一樣,但壓縮雜訊讓速度類指標偏高 3–17%。
決定
先不上線。偏高的數字混進歷史紀錄,會讓使用者誤以為自己進步了;等決定好歷史資料怎麼銜接再做。
結果
把一個看起來簡單的優化,變成一份有數據的取捨紀錄,避免傷到最核心的「趨勢可信」。
決策 07

要給學員用,資料要怎麼分

情境
準備找球友試用,之後可能要做帳號系統。
選項
在現有資料上加標記每位球員一個資料夾+路徑層
決定
做最徹底的版本:所有路徑集中到一層,每位球員各自的設定、基線、趨勢與首頁;學員有專屬連結,只看得到、只能上傳自己的資料;刪除先進回收區,30 天內可復原。
結果
端對端測試通過(上傳、3D、自動分析都落在學員自己的資料夾);之後換成帳號系統,只要改路徑那一層。
Validation

怎麼知道它是對的

每個開發階段都先訂好驗收標準,再拿真實資料檢查。第一段測試影片是我在球機場錄的 8 分半正手練習。

項目方法結果
自動切拍驗收標準:與人工計數差距小於 5%;我逐拍看過縮圖158 拍,本人確認
正手/反手分類10 場、110 拍逐拍目視標註;另做留一場交叉驗證108 / 110 判對
跟 OptiSwing 對照同一段影片的前 10 拍,逐拍比較高低排序轉肩 0.91、手速 0.90
單項數值抽查第 10 拍擊球瞬間的屈膝角25° vs OptiSwing 26°
整體分數最佳 5 拍平均的力量/技術分73 / 62 vs 71 / 62
畫面類功能每場、每種拍攝角度、有沒有 3D,至少實際產生一支再交付成為固定的交付規則

做不到的也照實記下:手臂旋轉、抖腕跟 OptiSwing 的定義還沒對上;準確度目前只在我一個人的資料上驗證過,是商業化前最大的風險。

Product

做出來的產品

以下都是實際畫面,用的是我 10/20 那一場(158 拍)。手機框裡的長圖可以直接往下捲;畫面中的人臉都模糊處理過。

01

首頁與計畫:打開就知道今天練什麼

首頁只放一件事:本週重點與最新一場。計畫頁把診斷翻成練法、組數和驗收標準;進步頁看分數趨勢與「跟上次比」。

首頁:本週重點、追蹤指標、最新一場的分數
↕ 可捲動
今天本週重點、最新一場
計畫頁:下一次正手練法、每組的提示、追蹤目標
↕ 可捲動
計畫練法、組數、驗收標準
進步頁:各項分數隨時間的變化與跟上次比較
↕ 可捲動
進步趨勢與跟上次比
紀錄頁:每一場練習的分數、拍數與拍攝提醒
紀錄每一場、拍攝提醒
02

一場練習的報告:診斷 → 數據 → 每一拍

先講一個最主要的問題和證據拍,再給完整數據,最後是每一拍的切片。三頁都是整頁長圖,可以在手機框裡往下捲。

報告的診斷頁:一句話診斷、證據拍、做到與沒做到、總結與動作階段
↕ 可捲動
診斷主要問題、證據拍、教練的話
報告的數據頁:各項分數、最佳 5 拍、分佈範圍與檢查點
↕ 可捲動
數據分數、分佈、檢查點
報告的每一拍頁:自動切出的每一拍縮圖、分數與 3D 標記
↕ 可捲動
每一拍158 拍切片、標註
03

單拍 3D 與分享影片

每一拍都能用 3D 從任何角度看;一鍵產生直式分享影片:子彈時間、揮拍光軌、最佳拍 vs 典型拍並排繞一圈。

單拍頁:3D 人體與原片同步播放、擊球點標記
單拍3D 人體+原片同步
分享影片:3D 人體與綠色揮拍光軌、手腕速度
子彈時間3D 揮拍光軌
分享影片:擊球瞬間的原片與準備、引拍、擊球、隨揮四個階段
擊球瞬間四個階段
分享影片:最佳拍與典型拍的 3D 並排,下方是差最多的三項
最佳 vs 典型3D 並排、差最多的三項
分享影片:做到與沒做到的兩拍上下並排,標出屈膝角度
做到 vs 沒做到兩拍定格、標出角度
分享影片:最佳拍與典型拍的原片,標出擊球時屈膝
最佳 vs 典型原片標線

04做到 vs 沒做到:骨架標線與數據

同一場、同一個角度的自己,停在關鍵的那一瞬間;左邊做到、右邊沒做到,骨架上直接標出角度與位移。

擊球時屈膝:做到的第 95 次屈膝 36 度,沒做到的第 24 次只有 16 度,骨架上標出前腳角度
擊球時屈膝 做到 36° vs 沒做到 16° · 130 拍有 93 拍沒做到
引拍時重心下沉:做到的第 17 次骨盆下沉 6.4 公分,沒做到的第 83 次只有 0.9 公分
引拍時重心下沉 做到 6.4 cm vs 沒做到 0.9 cm · 虛線是引拍最高點
05

教練與上傳

教練登入後先看到自己的學員;上傳是分段續傳,斷線也能接著傳。

教練的首頁:列出底下的學員與最近一次練習
教練首頁我的學員
上傳面板:拖放影片、拍攝角度提醒
上傳拖放影片、拍攝提醒

給學員的正式 PDF 報告(9 頁)

深色正式版,報告頁一鍵匯出:封面、摘要、分析、指標與動作檢查點、做到 vs 沒做到、最佳拍 vs 典型拍、練習方案;每頁有頁碼。

PDF 報告全部 9 頁的拼圖:封面、摘要、分析、指標、做到與沒做到、最佳與典型、練習方案
10/20 那一場的實際輸出,9 頁全部攤開。
How I worked

我跟 AI 怎麼分工

程式由 AI 編碼代理實作,我負責「做對的東西」:定義問題、訂驗收標準、在選項之間做決定,並且審查每一個結果。讓這件事能穩定推進、不走偏的,是幾條工作規則:

規則

  • 開發順序拆成可以單獨驗收的步驟:切片 → 2D 指標與評分 → 3D → 分析與趨勢
  • 畫面類功能交付前,每場、每種角度都要實際產生一次(來自一次交付失誤)
  • 視覺決定先出效果圖讓我選,不直接改
  • 好幾個對話同時改同一個專案時,各自只提交自己的改動

我做的判斷

  • 先限定一個具體情境,再一步步擴大(球機場 → 任何角度 → 學員)
  • 拒絕看起來很快的優化,當它會傷到「趨勢可信」
  • 把分享影片當成獲客管道來設計,而不只是附加功能
  • 為還沒做的帳號系統先把資料結構做對
What's next

下一步

  • 用 60fps 影片重新校對速度類指標與手臂旋轉、抖腕
  • 用同一套流程跑高水準球員的參考影片,修正單鏡頭的系統性偏差(評分 v2 校正)
  • 雲端 GPU 實測成本與速度,接上帳號與付款
  • 擴大試用到不同程度、慣用手、拍攝角度的球員
onestroke

一拍 · 手機拍一段,看懂每一拍

Aron · 產品經理。本頁的產品畫面、數字與日期皆來自這個專案的實際資料與開發紀錄。