KikiTore 日文聽力 App:技術清單與開發過程
KikiTore(聞き取れ)是一款練日文聽力的 iOS App。一開始只考數字,後來陸續加上時間、日期、五十音,以及便利商店、車站、飯店等旅遊情境。這篇整理它用到的技術和開發過程。
基本資料
- 平台:iPhone / iPad,iOS 17 以上
- 規模:Swift 82 個檔案、約 2 萬行
- 內容:數字、時間、日期、五十音、24 個旅遊情境(便利商店、拉麵、車站、計程車、飯店、溫泉等)
- 語音:3,835 個預錄音檔,約 57 MB
- 介面語言:繁中、英文、日文、韓文
App 端
- SwiftUI:所有畫面
- AVFoundation:播放預錄音檔;沒有預錄的內容用 iOS 內建語音(
AVSpeechSynthesizer)念 - StoreKit 2:「移除廣告」內購
- Google Mobile Ads(AdMob):橫幅廣告;答錯 5 次看一支獎勵廣告
- Firebase Analytics:各玩法的使用數據
- UserNotifications:每日練習提醒(本機排程,內文隨機帶 3 個單字)
- Firebase Messaging:遠端推播
- CryptoKit:音檔檔名用讀音的 SHA-256;每日優惠碼用 HMAC 算,不需要後端
- 全部存本機:熟練度、錯題本、連續天數都存在手機上,不用註冊帳號
語音
- VOICEVOX:免費的日文語音合成引擎,用 Docker 跑在本機,聲音是「四国めたん」(App 內有標示授權)
- Python 腳本:列出 App 會用到的所有讀音,呼叫 VOICEVOX 批次產生音檔,再刪掉沒用到的舊檔
- 同音異義字:箸、橋、端讀音一樣但重音不同,檔名加上重音資訊,各自產生一個音檔
玩法
- 聽寫測驗:聽數字、時間、日期,輸入答案
- 五十音:五十音表練習,聽單字後用拼字磚拼出來
- 情境單字:聽音四選一,每個情境一份單字表
- 對話:便利商店、咖啡廳、計程車等場景的店員與客人對話,附振假名
- 地圖方位:聽方向指示,在地圖上點出位置
- 廣播撈資訊:聽車站、飯店的廣播,挑出月台、時間等重點
- 金額結帳:聽店員報金額,越答越快
- 每日挑戰、無盡挑戰:數字限時挑戰,完成蓋朱印
學習系統
- 熟練度:每個單字分 新 → 學習中 → 熟悉 → 精通,依最近幾天的答對率升降,太久沒練會降一級
- 錯題本:答錯的字自動收進來,隔天以後再答對才會移出,同一場馬上答對不算
- 加權出題:不熟的字、最近比較少出現的字,出題機率比較高
- 每日單字卡、連續天數:首頁顯示
開發過程
| 版本 | 日期 | 重點 |
|---|---|---|
| 1.0 | 2026-02 | 只有數字聽力測驗 |
| 1.1 | 2026-03 | 加入 AdMob、Firebase Analytics |
| 1.2 | 2026-03 | 音量控制;介面四種語言 |
| 1.3 | 2026-04 | 時間模式(時鐘、星期、日期) |
| 1.4~1.5 | 2026-06 | 改用 VOICEVOX 預錄語音;移除廣告內購;新使用者前 10 分鐘不跳廣告 |
| 2.0 | 2026-06 | 首頁改版、練習模式、五十音、情境單字 |
| 2.1 | 2026-06 | 便利商店、餐廳、神社情境;可選語音 |
| 2.2 | 2026-06 | 單字熟練度、錯題本、每日單字卡;車站、飯店情境 |
| 2.3 | 2026-06 | 地圖方位、便利商店對話、相對時間快答;每日練習推播 |
| 2.4 | 2026-06 | 形容詞情境、換句話說測驗 |
| 2.5 | 2026-07 | 熟練度改成看最近幾天的答對率;JLPT 等級標籤 |
| 2.6 | 2026-07 | 數字挑戰模式、每日挑戰、自製數字鍵盤 |
| 2.7 | 2026-07 | 計程車、餐廳對話、廣播撈資訊;挑戰紀錄 |
| 之後 | 2026-10~11 | 溫泉、金額結帳、咖啡廳情境 |
踩過的坑
- 廣告可以被跳過:載入廣告設了 5 秒逾時,逾時就直接放行,使用者斷網就能一直跳過。改成只看廣告有沒有載好,沒載好(離線)才放行
- 推播一直收不到:Firebase 後台註冊的 bundle id 是小寫
kikitore,App 實際是KikiTore。APNs 比對大小寫,推播就靜靜地失敗,沒有任何錯誤 - 清理音檔把數字全刪了:產生音檔的腳本會刪掉「沒用到」的檔案,但它列清單時漏了數字,1,998 個數字音檔被當成沒用到刪光,數字聽力全部退回 iOS 內建語音。從 git 救回,並把數字補進清單
- 短音檔開頭被吃掉:播放前沒先預熱音訊,開頭幾十毫秒被吞掉,「まえ」聽起來像「あえ」
工具
- Xcode、XCTest
- VOICEVOX(Docker)、Python
- Claude Code:寫程式、code review、App Store 文案