|
|
|
@ -100,6 +100,8 @@ class AgentServiceImpl: NSObject { |
|
|
|
public var currentRecognitionMode: String = "normal" |
|
|
|
// 识别结果 |
|
|
|
private var recognitionResult = "" |
|
|
|
private var currsessionAsrId: String = "" |
|
|
|
private var pendingProcessWorkItem: DispatchWorkItem? |
|
|
|
internal var audioPlayer: AudioPlayer? |
|
|
|
// private var locationInfo:[String: String]? |
|
|
|
|
|
|
|
@ -486,7 +488,8 @@ class AgentServiceImpl: NSObject { |
|
|
|
print("ai启动语音=\(audioSourceType)=\(useBle)") |
|
|
|
guard let success = azureAsrHelper?.startContinuousRecognition( |
|
|
|
// callback: self, |
|
|
|
audioSourceType: audioSourceType |
|
|
|
audioSourceType: audioSourceType, |
|
|
|
isRemoveFirstPunctuation: false |
|
|
|
), success else { |
|
|
|
// 新增:启动失败时复位"启动中"状态 |
|
|
|
isStartingRecognition = false |
|
|
|
@ -2166,15 +2169,49 @@ class AudioPlayer { |
|
|
|
extension AgentServiceImpl: AzureAsrHelper.ContinuousRecognizeCallback { |
|
|
|
func onResult(sessionid:String ,_ text: String, _ detectedLanguage: String) { |
|
|
|
if !text.isEmpty && isKeepResult { |
|
|
|
if currsessionAsrId.isEmpty { |
|
|
|
currsessionAsrId = sessionid |
|
|
|
} |
|
|
|
recognitionResult += text |
|
|
|
if (currentRecognitionMode == "push_to_talk") { //按住说话 |
|
|
|
recognitionResult += text |
|
|
|
var data: [String: Any] = [ |
|
|
|
"sessionid": currsessionAsrId, |
|
|
|
"text": recognitionResult |
|
|
|
] |
|
|
|
if !detectedLanguage.isEmpty { |
|
|
|
data["language"] = detectedLanguage |
|
|
|
} |
|
|
|
sendEvent(name: "recognizing", data: data) |
|
|
|
}else{ |
|
|
|
var data: [String: Any] = ["sessionid":sessionid,"text": text] |
|
|
|
pendingProcessWorkItem?.cancel() |
|
|
|
|
|
|
|
var data: [String: Any] = [ |
|
|
|
"sessionid": currsessionAsrId, |
|
|
|
"text": recognitionResult |
|
|
|
] |
|
|
|
if !detectedLanguage.isEmpty { |
|
|
|
data["language"] = detectedLanguage |
|
|
|
} |
|
|
|
sendEvent(name: "recognition_result", data: data) |
|
|
|
processTextInput(sessionid: sessionid,text, speakResponse: true) |
|
|
|
sendEvent(name: "recognizing", data: data) |
|
|
|
|
|
|
|
let workItem = DispatchWorkItem { [weak self] in |
|
|
|
guard let self = self else { return } |
|
|
|
if !self.recognitionResult.isEmpty { |
|
|
|
var resultData: [String: Any] = [ |
|
|
|
"sessionid": self.currsessionAsrId, |
|
|
|
"text": self.recognitionResult |
|
|
|
] |
|
|
|
if !detectedLanguage.isEmpty { |
|
|
|
resultData["language"] = detectedLanguage |
|
|
|
} |
|
|
|
self.sendEvent(name: "recognition_result", data: resultData) |
|
|
|
self.processTextInput(sessionid: self.currsessionAsrId, self.recognitionResult, speakResponse: true) |
|
|
|
self.recognitionResult = "" |
|
|
|
self.currsessionAsrId = "" |
|
|
|
} |
|
|
|
} |
|
|
|
pendingProcessWorkItem = workItem |
|
|
|
DispatchQueue.main.asyncAfter(deadline: .now() + 1.5, execute: workItem) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
@ -2187,6 +2224,7 @@ extension AgentServiceImpl: AzureAsrHelper.ContinuousRecognizeCallback { |
|
|
|
} |
|
|
|
|
|
|
|
func onRecognizing(sessionid:String ,_ recognizing: String, _ detectedLanguage: String) { |
|
|
|
pendingProcessWorkItem?.cancel() |
|
|
|
if !recognizing.isEmpty && isKeepResult { |
|
|
|
let previousHasSpeech = hasSpeechDetected |
|
|
|
hasSpeechDetected = true |
|
|
|
@ -2195,21 +2233,19 @@ extension AgentServiceImpl: AzureAsrHelper.ContinuousRecognizeCallback { |
|
|
|
print("onRecognizing restartIdleCheck") |
|
|
|
restartIdleCheck() |
|
|
|
} |
|
|
|
if (currentRecognitionMode == "push_to_talk") { //按住说话 |
|
|
|
var data: [String: Any] = ["sessionid":currsessionId,"text": recognitionResult+recognizing] |
|
|
|
if !detectedLanguage.isEmpty { |
|
|
|
data["language"] = detectedLanguage |
|
|
|
} |
|
|
|
sendEvent(name: "recognizing", data: data) |
|
|
|
}else{ |
|
|
|
var data: [String: Any] = ["sessionid":sessionid,"text": recognizing] |
|
|
|
if !detectedLanguage.isEmpty { |
|
|
|
data["language"] = detectedLanguage |
|
|
|
} |
|
|
|
sendEvent(name: "recognizing", data: data) |
|
|
|
if currsessionAsrId.isEmpty { |
|
|
|
currsessionAsrId = sessionid |
|
|
|
} |
|
|
|
let text = recognitionResult + recognizing |
|
|
|
var data: [String: Any] = [ |
|
|
|
"sessionid": currsessionAsrId, |
|
|
|
"text": text |
|
|
|
] |
|
|
|
if !detectedLanguage.isEmpty { |
|
|
|
data["language"] = detectedLanguage |
|
|
|
} |
|
|
|
sendEvent(name: "recognizing", data: data) |
|
|
|
|
|
|
|
|
|
|
|
if isSpeaking || isAiStreaming { |
|
|
|
interruptCurrentResponse() |
|
|
|
} |
|
|
|
@ -2219,7 +2255,8 @@ extension AgentServiceImpl: AzureAsrHelper.ContinuousRecognizeCallback { |
|
|
|
func onSessionStarted(sessionid:String) { |
|
|
|
sendEvent(name: "recognition_started", data: ["sessionid":sessionid,"status": "started"]) |
|
|
|
recognitionResult = "" |
|
|
|
currsessionId = sessionid |
|
|
|
currsessionAsrId = "" |
|
|
|
pendingProcessWorkItem?.cancel() |
|
|
|
isRecognizing = true |
|
|
|
hasSpeechDetected = false |
|
|
|
// 新增:会话真正启动,复位"启动中"状态 |
|
|
|
@ -2242,11 +2279,14 @@ extension AgentServiceImpl: AzureAsrHelper.ContinuousRecognizeCallback { |
|
|
|
func onSessionStopped(sessionid:String) { |
|
|
|
if (currentRecognitionMode == "push_to_talk") { //按住说话 |
|
|
|
if (!recognitionResult.isEmpty){ |
|
|
|
var data: [String: Any] = ["sessionid":currsessionId,"text": recognitionResult] |
|
|
|
var data: [String: Any] = [ |
|
|
|
"sessionid": currsessionAsrId, |
|
|
|
"text": recognitionResult |
|
|
|
] |
|
|
|
sendEvent(name: "recognition_result", data: data) |
|
|
|
processTextInput(sessionid: currsessionId, recognitionResult, speakResponse: true) |
|
|
|
processTextInput(sessionid: currsessionAsrId, recognitionResult, speakResponse: true) |
|
|
|
} |
|
|
|
sendEvent(name: "recognition_stopped", data: ["sessionid":currsessionId,"status": "stopped"]) |
|
|
|
sendEvent(name: "recognition_stopped", data: ["sessionid":currsessionAsrId,"status": "stopped"]) |
|
|
|
}else{ |
|
|
|
sendEvent(name: "recognition_stopped", data: ["sessionid":sessionid,"status": "stopped"]) |
|
|
|
isRecognizing = false |
|
|
|
|