# 旅聽 0.2.6：翻譯失敗復原測試版

這次修正「已辨識日文在翻譯失敗後消失」：收音中的第一次失敗會保留日文、等 2 秒自動重試一次；仍失敗或處理累積過多時停止收音，保留已辨識文字。按「重試未完成翻譯」可在不開麥克風的情況下重送。空白回覆不會當作翻譯成功，停止後遲到的結果也不會覆蓋新結果。未完成日文和最近完成的中文分開顯示，並顯示有無收到聲音、是否尚未分出句子。

**這是翻譯失敗復原測試版，尚未完成新版本手機驗收。** 原本的漏句／辨識品質仍須改善；新增收音狀態提示不代表已修好分句。VibeVoice 先以本機錄音比較，沒有直接換進 APK、上傳錄音或增加雲端服務。沿用手機內建麥克風、既有模型、ChatGPT 訂閱與原簽章。

未完成日文只保留於本次 App 程序的記憶體；關閉程序會消失。停止仍會丟棄尚未辨識的音訊，因此畫面不是完整錄音逐字稿。重新開始收音會先接續未完成的文字翻譯。

VibeVoice Streaming 已完成本機錄音實跑：真實手機錄音有嚴重錯字／錯誤語言，加入日文提示仍不合格，這次未採用為 APK 引擎。修正、測試與模型比較證據見 [本次驗證報告](interpreter/QUALITY_REPAIR_2026-09-30.md)。

0.2.5 的既有實測：Pixel 5 收聽 25 秒博物館日語時，已產生歡迎、文化部及 1952 年等中文，畫面顯示的句尾延遲包含 4.3、4.7、8.8 秒。另一組十句純文字翻譯控制測試約 2.9–22 秒，速度仍有波動。提供影片開頭 65 秒仍有漏句與錯字；短句、較小聲及專名也會漏掉或認錯。這版不能當作可靠的完整即時口譯；eSIM、耳機及長時間使用尚未驗收。詳見 `interpreter/PIXEL_PERSISTENT_VALIDATION_2026-09-15.md` 與 `interpreter/CAPTURE_ROOT_CAUSE_2026-09-16.md`。

沿用約 170 MB 的 ReazonSpeech 日文專用模型，並依時間戳補辨識被跳過的前段聲音。Pixel 5 的同一段 6.7 秒音檔，含補辨識約 1.2 秒，前版約 15.7 秒；合成圖、提示卡及原先漏掉的前句已在這個案例恢復。這是純音檔測試，不能當作收音到中文字幕的完整延遲。人名、樓層及重複語句仍可能錯，尚未達可靠完整口譯。詳見 `interpreter/REAZON_SPEED_2026-09-15.md`。

保留「Google 翻譯備援」入口：不用準備旅聽模型或設定帳號，即可查看步驟、開啟或安裝／更新官方 Google 翻譯。它是另一個 App；切換時旅聽會停止收音與播報，Google 字幕不會回傳旅聽，也不表示旅聽接上 Google 模型。

## 先用 Google 即時字幕

1. 安裝 `TourListen-0.2.6-quality-preview.apk`，按「Google 翻譯備援」。
2. 按「開啟 Google 翻譯」，選 **日文 → 中文（繁體）**。
3. 開啟「即時翻譯」，選「僅文字／Text only」，按開始。手機麥克風朝向說話者。
4. 沒有即時翻譯時先更新 Google 翻譯；仍沒有可使用一般語音輸入分段翻譯。

需要網路，不需要 API 金鑰，也沒有啟用付費 API。Google 翻譯的收音與資料處理由 Google App 負責，旅聽的本機錄音規則不適用於它。

Pixel 5 / Android 14 已實測手機收音與繁體中文字幕：影片開頭 65 秒及博物館導覽約 107 秒。主要年代與展品數量部分正確，但仍有專名錯譯、數字錯誤及漏句，尚不能當作可靠的完整口譯。Google App 的耳機播報尚未驗證。

## 旅聽內建月租翻譯（仍為實驗功能）

手機麥克風收現場日文，ReazonSpeech k2-v2 在手機辨識，再由手機上的 Codex Termux 使用 ChatGPT 訂閱翻成繁體中文。畫面顯示字幕，系統中文語音可透過一般藍牙／有線耳機播放，播報期間仍持續收音。Android 10 以上、ARM64；Pixel 與 Xperia 均為目標，Pixel 已完成安裝、帳號與收音分段測試，完整口譯仍未通過；Xperia 尚未實測。

**這是可安裝的整合預覽版，還不是已驗收的旅行口譯工具。** 文字翻譯的 10 組導覽測試通過；提供影片的開頭 65 秒仍有辨識錯字與專名錯誤。桌面測試不能證明手機上的速度、耗電或藍牙路由。

## 手機第一次設定

1. 安裝本次本機產出的 `TourListen-0.2.6-quality-preview.apk`，沿用原測試版簽章，可覆蓋原版。更新中心目前仍是 0.2.5。
2. 開啟「連接月租帳號」，由畫面下載官方 F-Droid 版 Termux 並安裝、開啟一次。本流程需要它的 RUN_COMMAND 功能；已安裝其他來源且有資料時，不要直接解除安裝。
3. 回旅聽按「複製安裝指令並開啟 Termux」，長按貼上、按 Enter。安裝完成會開啟官方 ChatGPT 登入。只登入，不輸入 API 金鑰。
4. 回旅聽按「授權並檢查連線」，允許旅聽呼叫 Termux。登入保存在 Termux 私有的 `.tourlisten-codex`，不放進 APK、GitHub 或更新站。
5. 回字幕畫面，用 Wi-Fi 按「準備日文模型」。首次約 170 MB，至少保留 500 MB 空間；中斷可續傳。需保持 App 開啟。
6. 系統文字轉語音設定下載中文離線語音，連上耳機，按「重新檢查語音」及「測試耳機」。沒有語音時可用字幕。
7. 按「開始聽導覽」，允許麥克風，讓手機朝向導覽者。收音期間建議保持旅聽開啟；Termux 須允許背景執行。

不需要電腦或自行架伺服器。這版需要網路翻譯，不能全程離線。使用 Codex 訂閱額度；不是無上限，額度不足、登入失效或網路失敗就停止送譯，不會改走付費 API。Google AI Pro 尚未接入。

原始錄音只在手機記憶體處理，不存檔、不上傳；辨識文字送到 OpenAI 翻譯。畫面保留本次最多 200 段字幕，程序結束即消失。

## 出發前驗收

以另一裝置播放日文，連續至少 10 分鐘：確認中文意思、句尾至字幕的時間，以及待辨識／待翻譯是否持續增長。用實際 eSIM 再測一次，不能用家中 Wi-Fi 的結果代替國外連線。

開啟耳機播放後確認手機仍持續收音；斷開耳機應停止播報，不能切回手機喇叭。停止／重新開始不應接受已取消請求的遲到結果；保留的日文則可明確接續重試。另測鎖定畫面、切換 App、背景限制、耗電與溫度。

辨識出日文後暫時斷網：應顯示未完成日文，自動重試最多一次後停止；恢復連線後按重試，應產生中文且不開啟麥克風。重試中按停止、立刻再重試，舊回覆不能覆蓋新結果。這些流程已通過程式測試，仍需手機與 Termux 實測。

辨識等待超過 3 段或翻譯等待超過 4 段會停止並提示不完整；已排隊的短句會合併送譯。耳機播報過慢會停用播報，字幕繼續。不能把停止前的字幕視為完整導覽。

## 建置與來源

需要 JDK 17、Android SDK 35、Python 3。

```sh
python3 scripts/prepare-phone-runtime.py
python3 -m pip install opencc==1.4.2
python3 -m unittest discover -s interpreter -p 'test_*.py'
./gradlew :app:testDebugUnitTest :app:lintDebug :app:assembleRelease
```

CI APK 未簽章；更新中心 APK 使用原測試版的簽章，可覆蓋安裝。GitHub 執行建置與測試，語音處理在手機、文字翻譯在 OpenAI，不把 GitHub Actions 當成即時語音伺服器。

- 原程式：[RTranslator 2.1.5](https://github.com/niedev/RTranslator/tree/2.1.5)，Apache-2.0。
- 辨識：[ReazonSpeech k2-v2](https://huggingface.co/reazon-research/reazonspeech-k2-v2)，Apache-2.0；[Silero VAD](https://github.com/snakers4/silero-vad)，MIT。
- 推論：[sherpa-onnx 1.13.8](https://github.com/k2-fsa/sherpa-onnx)，Apache-2.0；ONNX Runtime，MIT。
- 訂閱工具：[codex-termux v0.153.3](https://github.com/DioNanos/codex-termux)，OpenAI Codex 的 Android ARM64 移植，Apache-2.0。安裝包固定版本且驗證 SHA-256。第三方移植並非 OpenAI 官方 Android App。
- GenSen Rounded TW 字體與 OFL 授權隨 APK 提供。

舊 NLLB 程式與授權仍保留，0.2.0 主流程不再載入。所有新模型固定大小與 SHA-256 見 `app/src/main/assets/phone-models.json`。
