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 59cc346..a04a9a9 100644 --- a/app/src/main/java/com/k2fsa/sherpa/onnx/MainActivity.kt +++ b/app/src/main/java/com/k2fsa/sherpa/onnx/MainActivity.kt @@ -2077,7 +2077,13 @@ class MainActivity : AppCompatActivity() { "^(`{3,}\\s*[A-Za-z]*>?||\\.?html?>)", RegexOption.IGNORE_CASE) - private fun cleanTrans(raw: String?): String? { + // 小写 ASCII 残片(aby/nope/fewest 族):2~6 个小写字母+空白/标点后随 + // CJK/假名。必须"原文里没有该片段"才剥——原件含 iPhone/PDF 等真词时 + // 不误伤;大写开头(AI/OK)天然不在此列 + private val transAsciiNoise = Regex( + "^([a-z]{2,6})[\\s,、,。!!??]+(?=[\\u4e00-\\u9fff\\u3040-\\u30ff])") + + private fun cleanTrans(raw: String?, src: String? = null): String? { if (raw.isNullOrBlank()) return null val ls = raw.trim().lines().toMutableList() while (ls.isNotEmpty() && transLabelLine.matches(ls.first().trim())) @@ -2089,6 +2095,14 @@ class MainActivity : AppCompatActivity() { s = transLabelPrefix.replaceFirst(s, "").trim() val s1 = s s = transNoisePrefix.replaceFirst(s, "").trim() + if (s == s1 && src != null) { + transAsciiNoise.find(s)?.let { m -> + val frag = m.groupValues[1] + if (!src.contains(frag, ignoreCase = true)) { + s = s.removeRange(m.range).trim() + } + } + } if (s != s1) { Log.i(TAG, "TAP-NOISE stripped: " + s1.take(16).replace("\n", " ")) @@ -2214,7 +2228,7 @@ class MainActivity : AppCompatActivity() { maxNewTokens = (src.length * 2 + 96).coerceAtMost(1200), temperature = 0.2f, repeatPenalty = 1.1f, ) - val tr = cleanTrans(out) + val tr = cleanTrans(out, src) when { tr.isNullOrBlank() || isEcho(src, tr, echoJaccardTh(src)) || !targetLangOk(tr) -> { @@ -2344,7 +2358,7 @@ class MainActivity : AppCompatActivity() { } catch (t: Throwable) { Log.w(TAG, "TRANSLATE single failed: " + t.message); null } - val tr = cleanTrans(one) + val tr = cleanTrans(one, segKeys[0].second) if (!tr.isNullOrEmpty()) got[segKeys[0].first] = tr if (got.isEmpty()) return null } else { @@ -2370,7 +2384,7 @@ class MainActivity : AppCompatActivity() { } val byIdx = extractNumberedPairs(out) segKeys.forEachIndexed { i, st -> - byIdx?.get((i + 1).toString())?.let { cleanTrans(it) } + byIdx?.get((i + 1).toString())?.let { cleanTrans(it, st.second) } ?.takeIf { it.isNotBlank() } ?.let { got[st.first] = it } } @@ -2399,7 +2413,7 @@ class MainActivity : AppCompatActivity() { temperature = 0f, ) } catch (t: Throwable) { null } - cleanTrans(one)?.let { got[st.first] = it } + cleanTrans(one, st.second)?.let { got[st.first] = it } } } if (got.isEmpty()) return null