From b86134858b48566b33a310f2ef5a64f766eccf12 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BE=90=E5=8B=A4=E6=B0=91?= Date: Mon, 20 Apr 2026 10:25:55 +0800 Subject: [PATCH] =?UTF-8?q?fix(asr):=20=E4=BF=AE=E5=A4=8D=E8=AF=AD?= =?UTF-8?q?=E9=9F=B3=E8=AF=86=E5=88=AB=E8=BF=9E=E6=8E=A5=E7=8A=B6=E6=80=81?= =?UTF-8?q?=E7=AE=A1=E7=90=86=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 添加 isAsrConnecting 状态避免重复连接 - 添加 pendingStartMic 队列机制处理延迟启动 - 连接成功后自动执行等待中的麦克风启动请求 - 在错误和关闭回调中重置连接状态 - 修复未连接时直接返回导致的功能缺失 --- .../com/nova/brain/glass/helper/AsrHelper.kt | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/com/nova/brain/glass/helper/AsrHelper.kt b/app/src/main/java/com/nova/brain/glass/helper/AsrHelper.kt index 9d41e50..ae598ce 100644 --- a/app/src/main/java/com/nova/brain/glass/helper/AsrHelper.kt +++ b/app/src/main/java/com/nova/brain/glass/helper/AsrHelper.kt @@ -54,6 +54,8 @@ object AsrHelper : OfflineCmdListener { private var isConnected = false private var isMicRunning = false private var isTtsConnected = false + private var isAsrConnecting = false + private var pendingStartMic = false private const val WAKE_RESPONSE = "在呢,您请说" private const val LISTENING_TIMEOUT_MS = 30_000L @@ -136,13 +138,17 @@ object AsrHelper : OfflineCmdListener { } private fun asrConnect() { + if (isConnected || isAsrConnecting) return + isAsrConnecting = true asr?.connect() Log.d(TAG, "ASR connect() called") } private fun asrStartMic() { if (!isConnected) { - Log.w(TAG, "ASR startMic ignored: not connected") + pendingStartMic = true + asrConnect() + Log.w(TAG, "ASR not connected, queue startMic after reconnect") return } if (isMicRunning) { @@ -153,6 +159,7 @@ object AsrHelper : OfflineCmdListener { runCatching { asr?.startAsrWithMic() } .onSuccess { isMicRunning = true + pendingStartMic = false Log.d(TAG, "ASR startAsrWithMic()") } .onFailure { Log.e(TAG, "ASR startAsrWithMic failed: ${it.message}") } @@ -261,7 +268,11 @@ object AsrHelper : OfflineCmdListener { asrClient.setListener(object : AsrClient.Listener { override fun onOpen() { isConnected = true + isAsrConnecting = false Log.d(TAG, "ASR websocket open") + if (pendingStartMic) { + asrStartMic() + } } override fun onStart(taskId: String) { @@ -315,12 +326,15 @@ object AsrHelper : OfflineCmdListener { override fun onError(code: Int, message: String) { Log.e(TAG, "ASR error code=$code msg=$message") + isConnected = false + isAsrConnecting = false isMicRunning = false dismissListeningDialog() } override fun onClosed(code: Int, reason: String) { isConnected = false + isAsrConnecting = false isMicRunning = false dismissListeningDialog() Log.d(TAG, "ASR closed code=$code reason=$reason") @@ -363,6 +377,7 @@ object AsrHelper : OfflineCmdListener { return } showListeningDialog() + pendingStartMic = true if (isTtsConnected) { tts?.speak(WAKE_RESPONSE) } else {