fix(asr): 修复语音识别连接状态管理问题

- 添加 isAsrConnecting 状态避免重复连接
- 添加 pendingStartMic 队列机制处理延迟启动
- 连接成功后自动执行等待中的麦克风启动请求
- 在错误和关闭回调中重置连接状态
- 修复未连接时直接返回导致的功能缺失
这个提交包含在:
徐勤民 2026-04-20 10:25:55 +08:00
父节点 8a83ec8054
当前提交 b86134858b

查看文件

@ -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 {