|
|
|
@ -149,6 +149,8 @@ object AgentService : CoroutineScope { |
|
|
|
private var isplaymusic = false; |
|
|
|
//是否保留最终结果 |
|
|
|
private var isKeepResult = true; |
|
|
|
// 识别结果 |
|
|
|
private var recognitionResult = "" |
|
|
|
|
|
|
|
// 打断防抖相关 |
|
|
|
private var lastInterruptTime = 0L |
|
|
|
@ -643,7 +645,7 @@ object AgentService : CoroutineScope { |
|
|
|
|
|
|
|
// 根据模式启动相应的空闲检测 |
|
|
|
startIdleCheckForMode(mode) |
|
|
|
// 设置当前识别模式 |
|
|
|
// 设置当前识别模式 |
|
|
|
currentRecognitionMode = mode |
|
|
|
Log.d(TAG, "设置语音识别模式: $mode") |
|
|
|
return true |
|
|
|
@ -666,20 +668,33 @@ object AgentService : CoroutineScope { |
|
|
|
val success = azureAsrHelper?.setupEventListeners(object : |
|
|
|
AzureAsrHelper.ContinuousRecognizeCallback { |
|
|
|
override fun onRecognizing(sessionid:String, recognizing: String, detectedLanguage: String) { |
|
|
|
Log.d(TAG, "liwei-------- onRecognizing: $sessionid") |
|
|
|
if (recognizing.isNotEmpty()&&isKeepResult==true) { |
|
|
|
// 检测到语音,更新状态 |
|
|
|
_hasSpeechDetected.set(true) |
|
|
|
Log.d(TAG, "ai识别中重置定时器") |
|
|
|
restartIdleCheck() |
|
|
|
|
|
|
|
|
|
|
|
sendEvent( |
|
|
|
"recognizing", mapOf( |
|
|
|
"sessionid" to sessionid, |
|
|
|
"text" to recognizing, |
|
|
|
"language" to detectedLanguage |
|
|
|
var text = "" |
|
|
|
if (currentRecognitionMode == "push_to_talk") { |
|
|
|
text = recognitionResult + recognizing |
|
|
|
sendEvent( |
|
|
|
"recognizing", mapOf( |
|
|
|
"sessionid" to currsessionId, |
|
|
|
"text" to text, |
|
|
|
"language" to detectedLanguage |
|
|
|
) |
|
|
|
) |
|
|
|
) |
|
|
|
}else{ |
|
|
|
text = recognizing |
|
|
|
sendEvent( |
|
|
|
"recognizing", mapOf( |
|
|
|
"sessionid" to sessionid, |
|
|
|
"text" to text, |
|
|
|
"language" to detectedLanguage |
|
|
|
) |
|
|
|
) |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// 如果TTS正在播放或AI正在生成,检查是否需要打断 |
|
|
|
if (isTtsSpeaking || isAiStreaming) { |
|
|
|
@ -709,45 +724,67 @@ object AgentService : CoroutineScope { |
|
|
|
} |
|
|
|
|
|
|
|
override fun onResult(sessionid:String,result: String, detectedLanguage: String) { |
|
|
|
Log.d(TAG, "liwei-------- onResult: $sessionid ") |
|
|
|
if (result.isNotEmpty()&&isKeepResult==true) {//加入是否结束要输出最后的结果判读 |
|
|
|
sendEvent( |
|
|
|
"recognition_result", mapOf( |
|
|
|
"sessionid" to sessionid, |
|
|
|
"text" to result, |
|
|
|
"language" to detectedLanguage |
|
|
|
// 保存识别结果 |
|
|
|
if (currentRecognitionMode == "push_to_talk") { //按住说话 |
|
|
|
recognitionResult += result |
|
|
|
}else{ |
|
|
|
sendEvent( |
|
|
|
"recognition_result", mapOf( |
|
|
|
"sessionid" to sessionid, |
|
|
|
"text" to result, |
|
|
|
"language" to detectedLanguage |
|
|
|
) |
|
|
|
) |
|
|
|
) |
|
|
|
|
|
|
|
processWithChatApi(sessionid,result) |
|
|
|
processWithChatApi(sessionid,result) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
_hasSpeechDetected.set(false) |
|
|
|
|
|
|
|
restartIdleCheck() |
|
|
|
restartIdleCheck() |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
override fun onSessionStarted(sessionid:String) { |
|
|
|
Log.d(TAG, "liwei-------- onSessionStarted: $sessionid") |
|
|
|
sendEvent("recognition_started", mapOf("sessionid" to sessionid, "status" to "started")) |
|
|
|
// 使用模式感知的空闲检测启动方法 |
|
|
|
recognitionResult = "" |
|
|
|
currsessionId = sessionid |
|
|
|
audioPlayer?.playAudio(R.raw.start) |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
override fun onSessionStopped(sessionid:String) { |
|
|
|
sendEvent("recognition_stopped", mapOf("sessionid" to sessionid, "status" to "stopped")) |
|
|
|
_isRecognitionActive.set(false) |
|
|
|
Log.d(TAG, "liwei-------- onSessionStopped: $sessionid") |
|
|
|
if (currentRecognitionMode == "push_to_talk") { //按住说话 |
|
|
|
if (recognitionResult.isNotEmpty()){ |
|
|
|
sendEvent( |
|
|
|
"recognition_result", mapOf( |
|
|
|
"sessionid" to currsessionId, |
|
|
|
"text" to recognitionResult |
|
|
|
) |
|
|
|
) |
|
|
|
processWithChatApi(currsessionId,recognitionResult) |
|
|
|
} |
|
|
|
sendEvent("recognition_stopped", mapOf("sessionid" to currsessionId, "status" to "stopped")) |
|
|
|
}else{ |
|
|
|
sendEvent("recognition_stopped", mapOf("sessionid" to sessionid, "status" to "stopped")) |
|
|
|
|
|
|
|
audioPlayer?.playAudio(R.raw.stop) |
|
|
|
} |
|
|
|
stopIdleCheck() |
|
|
|
audioPlayer?.playAudio(R.raw.stop) |
|
|
|
_isRecognitionActive.set(false) |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
override fun onCanceled(sessionid: String,reason: String, errorDetails: String) { |
|
|
|
Log.d(TAG, "liwei-------- onCanceled: $sessionid $reason $errorDetails") |
|
|
|
_isRecognitionActive.set(false) |
|
|
|
stopIdleCheck() |
|
|
|
Log.d(TAG, "recognition_canceled:") |
|
|
|
BleService.closeCodec() |
|
|
|
sendEvent( |
|
|
|
"recognition_canceled", mapOf( |
|
|
|
@ -759,6 +796,7 @@ object AgentService : CoroutineScope { |
|
|
|
} |
|
|
|
|
|
|
|
override fun onError(sessionid:String, code: Int, error: String) { |
|
|
|
Log.d(TAG, "liwei-------- onError: $sessionid $code $error") |
|
|
|
_isRecognitionActive.set(false) |
|
|
|
stopIdleCheck() |
|
|
|
BleService.closeCodec() |
|
|
|
|