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