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 c354998..f692f1e 100644 --- a/app/src/main/java/com/k2fsa/sherpa/onnx/MainActivity.kt +++ b/app/src/main/java/com/k2fsa/sherpa/onnx/MainActivity.kt @@ -2382,6 +2382,7 @@ class MainActivity : AppCompatActivity() { } private fun ensureTranslateEngine(): LlmEngine? { + translateEngine?.let { return it } val f = File(File(externalModelDir, summarizeModelDirName), summarizeGgufName) if (!f.isFile) { Log.i(TAG, "translate model missing at ${f.absolutePath}; tap-translate off") @@ -2400,18 +2401,17 @@ class MainActivity : AppCompatActivity() { } } - // 一批 = 一个全新引擎(nativeGenerate 不清 KV 的 workaround)。 // items: key(通常是 sid 字符串) × 原文;返回 key × 译文,失败 null。 - // 直译模式(2026-09-16):不再携带同轮上下文 + // 直译模式(2026-09-16):不携带同轮上下文;引擎复用(JNI 每次生成前清 KV) private fun translateNumbered( items: List>, temp: Float = 0f, ): Map? { if (items.isEmpty()) return emptyMap() val targetName = transTargetName() val langHint = transLangHint() - translateEngine?.let { runCatching { it.release() } } - translateEngine = null - val engine = ensureTranslateEngine() ?: return null + // 引擎复用(2026-09-16,JNI 已加 KV 清除):不再按批重建—— + // "每批重建"曾让每次尝试都重载 E2B ~4-6s,是翻译单句 30~40s 的主因 + val engine = translateEngine ?: ensureTranslateEngine() ?: return null // 长句拆段:小模型对短输入才稳定;长句译到中途会"掉语言" // (简体→繁体→别的语言)。拆 ≤140 字段一次 generate,段序拼回。 val segKeys = ArrayList>() diff --git a/tools/llama-jni/src/summarize_llm_jni.cpp b/tools/llama-jni/src/summarize_llm_jni.cpp index e32a130..2742c33 100644 --- a/tools/llama-jni/src/summarize_llm_jni.cpp +++ b/tools/llama-jni/src/summarize_llm_jni.cpp @@ -165,6 +165,12 @@ Java_com_k2fsa_sherpa_onnx_LlmEngine_nativeGenerate( std::lock_guard lock(e->mu); e->abort.store(false); + // KV 清除(2026-09-16 根治):原实现不清 KV,同引擎连续 generate 会复读 + // 上一条输出 -> Kotlin 侧被迫"每次尝试重建引擎"(E2B 每次重载 4~6s, + // 是翻译单句 30~40s 的主因)。每次生成前清空内存,引擎即可安全复用; + // 顺带修复纪要流水线多块共享引擎的潜在污染。 + llama_memory_clear(llama_get_memory(e->ctx), true); + const std::string prompt = jstringToUtf8(env, jPrompt); if (prompt.empty()) { throwJava(env, "nativeGenerate: empty prompt");