diff --git a/app/src/main/java/com/k2fsa/sherpa/onnx/MainActivity.kt b/app/src/main/java/com/k2fsa/sherpa/onnx/MainActivity.kt index ce6c269..d62312c 100644 --- a/app/src/main/java/com/k2fsa/sherpa/onnx/MainActivity.kt +++ b/app/src/main/java/com/k2fsa/sherpa/onnx/MainActivity.kt @@ -314,7 +314,15 @@ class MainActivity : AppCompatActivity() { private val initialPending = ArrayList>() private var initialBatchTimer: Runnable? = null private val translatedSids = HashSet() // 每槽只翻一次 - private val retriedSids = HashSet() // 失败仅重试一次 + // 失败重试预算:每句最多 2 次,温度递进(0→0.3→0.7),贪心死路可被跳出。 + // 仅在翻译线程读写,无并发。 + private val translateAttempts = HashMap() + + private fun bumpAttempt(sid: Long): Int { + val n = (translateAttempts[sid] ?: 0) + 1 + translateAttempts[sid] = n + return n + } companion object { private val SUMMARY_THREADS = 6 // 空闲时:大核全用 @@ -519,6 +527,15 @@ class MainActivity : AppCompatActivity() { sessionTranscript?.close() sessionTranscript = SessionTranscript.begin(filesDir) } + // 预热翻译引擎:把模型文件读进 OS 页缓存后即释放(每批仍按防污染 + // 协议重建),消除开头几批的冷加载失败 + translateHandler.post { + val e = ensureTranslateEngine() + if (e != null) { + translateEngine = null + runCatching { e.release() } + } + } recordingThread = thread(true) { processSamples() } @@ -2026,18 +2043,21 @@ class MainActivity : AppCompatActivity() { } // 翻译线程执行:直出/编号批 → 逐条质检(空/复读/语言漂移)→ 主线程应用。 - // 生成失败或语言漂移 → 带温度重试一次(每句仅一次,retriedSids 全部在本线程读写)。 + // 生成失败或语言漂移 → 温度递进重试(每句最多 2 次,translateAttempts 仅在本线程读写)。 private fun runTranslateBatch(batch: List>, temp: Float) { val map = translateNumbered( batch.map { Pair(it.first.toString(), it.second) }, temp ) if (map == null || !plausibleTranslations(map.values)) { - Log.i(TAG, "MISS reason=genfail sids=" + - batch.joinToString(",") { it.first.toString() }) - if (temp == 0f) { - val retry = batch.filter { retriedSids.add(it.first) } - if (retry.isNotEmpty()) translateHandler.post { - runTranslateBatch(retry, 0.3f) + val retry = ArrayList>() + for ((sid, src) in batch) { + val att = bumpAttempt(sid) + Log.i(TAG, "MISS sid=" + sid + " reason=genfail attempt=" + att) + if (att <= 2) retry.add(Pair(sid, src)) + } + if (retry.isNotEmpty()) { + translateHandler.post { + runTranslateBatch(retry, if (temp < 0.5f) 0.3f else 0.7f) } } return @@ -2052,8 +2072,9 @@ class MainActivity : AppCompatActivity() { isEcho(src, tr, echoJaccardTh(src)) -> Log.i(TAG, "MISS sid=" + sid + " reason=echo") !targetLangOk(tr) -> { - Log.i(TAG, "MISS sid=" + sid + " reason=langdrift") - if (temp == 0f && retriedSids.add(sid)) drift.add(Pair(sid, src)) + val att = bumpAttempt(sid) + Log.i(TAG, "MISS sid=" + sid + " reason=langdrift attempt=" + att) + if (att <= 2) drift.add(Pair(sid, src)) } else -> good[sid] = tr }