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 文案

下載