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 6c9afb2..9d41e50 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 @@ -56,10 +56,18 @@ object AsrHelper : OfflineCmdListener { private var isTtsConnected = false private const val WAKE_RESPONSE = "在呢,您请说" + private const val LISTENING_TIMEOUT_MS = 30_000L private val mainHandler = Handler(Looper.getMainLooper()) private var listeningDialog: AlertDialog? = null private var noNetworkDialog: AlertDialog? = null + private val listeningTimeoutRunnable = Runnable { + if (!isMicRunning) return@Runnable + runCatching { asr?.stopAsrWithMic() } + isMicRunning = false + dismissListeningDialog() + Log.d(TAG, "ASR listening timeout after ${LISTENING_TIMEOUT_MS}ms") + } private val networkCheckRunnable = object : Runnable { override fun run() { if (isNetworkAvailable()) { @@ -141,6 +149,7 @@ object AsrHelper : OfflineCmdListener { Log.w(TAG, "ASR startMic ignored: mic already running") return } + restartListeningTimeout() runCatching { asr?.startAsrWithMic() } .onSuccess { isMicRunning = true @@ -149,6 +158,15 @@ object AsrHelper : OfflineCmdListener { .onFailure { Log.e(TAG, "ASR startAsrWithMic failed: ${it.message}") } } + private fun restartListeningTimeout() { + mainHandler.removeCallbacks(listeningTimeoutRunnable) + mainHandler.postDelayed(listeningTimeoutRunnable, LISTENING_TIMEOUT_MS) + } + + private fun cancelListeningTimeout() { + mainHandler.removeCallbacks(listeningTimeoutRunnable) + } + private fun showListeningDialog() { mainHandler.post { listeningDialog?.dismiss() @@ -185,6 +203,7 @@ object AsrHelper : OfflineCmdListener { listeningDialog?.dismiss() listeningDialog = null } + cancelListeningTimeout() } private fun showNoNetworkDialog() { @@ -247,12 +266,14 @@ object AsrHelper : OfflineCmdListener { override fun onStart(taskId: String) { currentPartial = "" + restartListeningTimeout() Log.d(TAG, "ASR started: $taskId") } override fun onPartialResult(taskId: String, text: String) { // 滚动更新当前识别中间结果 currentPartial += text + restartListeningTimeout() Log.d(TAG, "ASR partial: $text") }