fix(asr): 修复语音识别连接状态管理问题
- 添加 isAsrConnecting 状态避免重复连接 - 添加 pendingStartMic 队列机制处理延迟启动 - 连接成功后自动执行等待中的麦克风启动请求 - 在错误和关闭回调中重置连接状态 - 修复未连接时直接返回导致的功能缺失
这个提交包含在:
父节点
8a83ec8054
当前提交
b86134858b
@ -54,6 +54,8 @@ object AsrHelper : OfflineCmdListener {
|
|||||||
private var isConnected = false
|
private var isConnected = false
|
||||||
private var isMicRunning = false
|
private var isMicRunning = false
|
||||||
private var isTtsConnected = false
|
private var isTtsConnected = false
|
||||||
|
private var isAsrConnecting = false
|
||||||
|
private var pendingStartMic = false
|
||||||
|
|
||||||
private const val WAKE_RESPONSE = "在呢,您请说"
|
private const val WAKE_RESPONSE = "在呢,您请说"
|
||||||
private const val LISTENING_TIMEOUT_MS = 30_000L
|
private const val LISTENING_TIMEOUT_MS = 30_000L
|
||||||
@ -136,13 +138,17 @@ object AsrHelper : OfflineCmdListener {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun asrConnect() {
|
private fun asrConnect() {
|
||||||
|
if (isConnected || isAsrConnecting) return
|
||||||
|
isAsrConnecting = true
|
||||||
asr?.connect()
|
asr?.connect()
|
||||||
Log.d(TAG, "ASR connect() called")
|
Log.d(TAG, "ASR connect() called")
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun asrStartMic() {
|
private fun asrStartMic() {
|
||||||
if (!isConnected) {
|
if (!isConnected) {
|
||||||
Log.w(TAG, "ASR startMic ignored: not connected")
|
pendingStartMic = true
|
||||||
|
asrConnect()
|
||||||
|
Log.w(TAG, "ASR not connected, queue startMic after reconnect")
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
if (isMicRunning) {
|
if (isMicRunning) {
|
||||||
@ -153,6 +159,7 @@ object AsrHelper : OfflineCmdListener {
|
|||||||
runCatching { asr?.startAsrWithMic() }
|
runCatching { asr?.startAsrWithMic() }
|
||||||
.onSuccess {
|
.onSuccess {
|
||||||
isMicRunning = true
|
isMicRunning = true
|
||||||
|
pendingStartMic = false
|
||||||
Log.d(TAG, "ASR startAsrWithMic()")
|
Log.d(TAG, "ASR startAsrWithMic()")
|
||||||
}
|
}
|
||||||
.onFailure { Log.e(TAG, "ASR startAsrWithMic failed: ${it.message}") }
|
.onFailure { Log.e(TAG, "ASR startAsrWithMic failed: ${it.message}") }
|
||||||
@ -261,7 +268,11 @@ object AsrHelper : OfflineCmdListener {
|
|||||||
asrClient.setListener(object : AsrClient.Listener {
|
asrClient.setListener(object : AsrClient.Listener {
|
||||||
override fun onOpen() {
|
override fun onOpen() {
|
||||||
isConnected = true
|
isConnected = true
|
||||||
|
isAsrConnecting = false
|
||||||
Log.d(TAG, "ASR websocket open")
|
Log.d(TAG, "ASR websocket open")
|
||||||
|
if (pendingStartMic) {
|
||||||
|
asrStartMic()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onStart(taskId: String) {
|
override fun onStart(taskId: String) {
|
||||||
@ -315,12 +326,15 @@ object AsrHelper : OfflineCmdListener {
|
|||||||
|
|
||||||
override fun onError(code: Int, message: String) {
|
override fun onError(code: Int, message: String) {
|
||||||
Log.e(TAG, "ASR error code=$code msg=$message")
|
Log.e(TAG, "ASR error code=$code msg=$message")
|
||||||
|
isConnected = false
|
||||||
|
isAsrConnecting = false
|
||||||
isMicRunning = false
|
isMicRunning = false
|
||||||
dismissListeningDialog()
|
dismissListeningDialog()
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onClosed(code: Int, reason: String) {
|
override fun onClosed(code: Int, reason: String) {
|
||||||
isConnected = false
|
isConnected = false
|
||||||
|
isAsrConnecting = false
|
||||||
isMicRunning = false
|
isMicRunning = false
|
||||||
dismissListeningDialog()
|
dismissListeningDialog()
|
||||||
Log.d(TAG, "ASR closed code=$code reason=$reason")
|
Log.d(TAG, "ASR closed code=$code reason=$reason")
|
||||||
@ -363,6 +377,7 @@ object AsrHelper : OfflineCmdListener {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
showListeningDialog()
|
showListeningDialog()
|
||||||
|
pendingStartMic = true
|
||||||
if (isTtsConnected) {
|
if (isTtsConnected) {
|
||||||
tts?.speak(WAKE_RESPONSE)
|
tts?.speak(WAKE_RESPONSE)
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
正在加载...
在新工单中引用
屏蔽一个用户