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 {