From 8a83ec8054bdb3db8a55e48b0bdf8b77e250533a 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:18:19 +0800 Subject: [PATCH] =?UTF-8?q?feat(asr):=20=E6=B7=BB=E5=8A=A0=E8=AF=AD?= =?UTF-8?q?=E9=9F=B3=E8=AF=86=E5=88=AB=E8=B6=85=E6=97=B6=E6=9C=BA=E5=88=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 添加 30 秒监听超时常量配置 - 实现监听超时后的自动停止功能 - 添加超时回调和日志记录机制 - 在开始录音时启动超时计时器 - 在部分结果返回时重置超时时间 - 在停止录音时取消超时任务 --- .../com/nova/brain/glass/helper/AsrHelper.kt | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) 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") }