fix(asr): 修复语音识别连接状态管理问题
- 添加 isAsrConnecting 状态避免重复连接 - 添加 pendingStartMic 队列机制处理延迟启动 - 连接成功后自动执行等待中的麦克风启动请求 - 在错误和关闭回调中重置连接状态 - 修复未连接时直接返回导致的功能缺失
这个提交包含在:
父节点
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 {
|
||||
|
||||
正在加载...
在新工单中引用
屏蔽一个用户