AI回复指令调试
authorliangzhenying <867174124@qq.com>
Mon, 10 Feb 2025 07:10:35 +0000 (15:10 +0800)
committerliangzhenying <867174124@qq.com>
Mon, 10 Feb 2025 07:10:35 +0000 (15:10 +0800)
IOTBluetooth/IOTBluetooth/Example/ChatCell.swift
IOTBluetooth/IOTBluetooth/Example/ChatViewController.swift
IOTBluetooth/IOTBluetooth/IOTBluetooth.xcworkspace/xcuserdata/yaozuopan.xcuserdatad/UserInterfaceState.xcuserstate
IOTBluetooth/IOTBluetooth/IOTBluetooth.xcworkspace/xcuserdata/yaozuopan.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist
IOTBluetooth/IOTBluetooth/IOTBluetooth/IBAiManager.swift
IOTBluetooth/IOTBluetooth/IOTBluetooth/IBChecker.swift
IOTBluetooth/IOTBluetooth/IOTBluetooth/Models/IBAiResponse.swift

index 2276150..6ab131c 100644 (file)
@@ -34,7 +34,7 @@ class ChatCell:UITableViewCell{
         msgLabel.snp.makeConstraints { make in
             make.top.bottom.equalToSuperview().inset(5)
             make.left.right.equalToSuperview().inset(10)
-            make.width.lessThanOrEqualTo(kScreenWidth - 100)
+            make.width.lessThanOrEqualTo(kScreenWidth - 180)
         }
     }
     
@@ -45,7 +45,7 @@ class ChatCell:UITableViewCell{
     var data:IBAiResponse!{
         didSet{
             if data.type == 1 {
-                bgView.backgroundColor = .lightGray
+                bgView.backgroundColor = .systemGreen
                 bgView.snp.remakeConstraints { make in
                     make.top.bottom.equalToSuperview().inset(10)
                     //                    make.width.lessThanOrEqualTo(kScreenWidth - 40)
@@ -53,14 +53,14 @@ class ChatCell:UITableViewCell{
                 }
             }
             else{
-                bgView.backgroundColor = .systemGreen
+                bgView.backgroundColor = .lightGray
                 bgView.snp.remakeConstraints { make in
                     make.top.bottom.equalToSuperview().inset(10)
                     //                    make.width.lessThanOrEqualTo(kScreenWidth - 40)
                     make.left.equalToSuperview().inset(20)
                 }
             }
-            msgLabel.text = data.value
+            msgLabel.text = data.totalContent
         }
     }
 }
index 82bfb4f..14ad7c1 100644 (file)
@@ -38,6 +38,7 @@ class ChatViewController: UIViewController{
         tableView.delegate = self
         tableView.dataSource = self
         tableView.estimatedRowHeight = 60
+        tableView.separatorStyle = .none
         tableView.register(ChatCell.self, forCellReuseIdentifier: ChatCell.ID)
         view.addSubview(tableView)
         tableView.snp.makeConstraints { make in
@@ -51,11 +52,19 @@ class ChatViewController: UIViewController{
         IBAiManager.shared.aiResponse = {[weak self] response in
             print(response.description)
             guard let self = self else {return}
-            if response.state == "end",response.type != 0 {
-                list.append(response)
+            if response.type == 1 || response.type == 2{
+                if let model = list.last,model.reponseId == response.reponseId {
+                    list.removeLast()
+                    list.append(response)
+                }
+                else{
+                    list.append(response)
+                }
                 tableView.reloadData()
+                if list.count > 0 {
+                    tableView.scrollToRow(at: IndexPath(row: list.count - 1, section: 0), at: .none, animated: true)
+                }
             }
-
         }
         
 //        let chat = MixSdk.shared.chat
index 4d1d74d..e104e4a 100644 (file)
Binary files a/IOTBluetooth/IOTBluetooth/IOTBluetooth.xcworkspace/xcuserdata/yaozuopan.xcuserdatad/UserInterfaceState.xcuserstate and b/IOTBluetooth/IOTBluetooth/IOTBluetooth.xcworkspace/xcuserdata/yaozuopan.xcuserdatad/UserInterfaceState.xcuserstate differ
index d097835..a447329 100644 (file)
@@ -3,4 +3,22 @@
    uuid = "DE90D99F-11DF-48BC-9070-3AF484DDB28C"
    type = "0"
    version = "2.0">
+   <Breakpoints>
+      <BreakpointProxy
+         BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
+         <BreakpointContent
+            uuid = "614B2AEC-7047-4DF3-9E22-65096DA81F63"
+            shouldBeEnabled = "Yes"
+            ignoreCount = "0"
+            continueAfterRunningActions = "No"
+            filePath = "IOTBluetooth/IBAiManager.swift"
+            startingColumnNumber = "9223372036854775807"
+            endingColumnNumber = "9223372036854775807"
+            startingLineNumber = "128"
+            endingLineNumber = "128"
+            landmarkName = "receiveAiData(sbcData:)"
+            landmarkType = "7">
+         </BreakpointContent>
+      </BreakpointProxy>
+   </Breakpoints>
 </Bucket>
index 6674eb3..9f0e16b 100644 (file)
@@ -20,13 +20,11 @@ public class IBAiManager{
     public var chatGptKey:String = ""
     
     public var aiResponse:((_ response:IBAiResponse) -> Void)?
-    
-    var audioData = Data()
-    
+        
+    var responseId = ""
     var reply = ""
     
     
-    
     init(){
         MixSdk.shared.isDebug = true
         setupChatCallBack()
@@ -97,14 +95,16 @@ public class IBAiManager{
             .parameters([])
             .response {[weak self] result in
                 guard let self = self else {return}
+                responseId = "\(Date().timeIntervalSince1970)"
                 if result.isSuccess,let data = result.value as? Data{
                     receiveAiData(sbcData: data)
                 }
                 else{
                     Logger.log(result)
-                    let model = IBAiResponse()
+                    let model = IBAiResponse(responseId)
                     model.type = 0
                     model.state = "end"
+                    model.content = "录音解析错误"
                     sendRelpy(model: model)
                 }
             }
@@ -115,9 +115,10 @@ extension IBAiManager{
         let pcmData =  MSAudioConvert.sbcTopcm(sbcData)
         if pcmData.count == 0{
             Logger.log("sbc2pcm失败")
-            let model = IBAiResponse()
+            let model = IBAiResponse(responseId)
             model.type = 0
             model.state = "end"
+            model.content = "语音识别失败"
             sendRelpy(model: model)
             return
         }
@@ -126,19 +127,21 @@ extension IBAiManager{
             guard let self = self else {return}
             if let text = text,text.count > 0{
                 Logger.log(text)
-                let model = IBAiResponse()
+                let model = IBAiResponse(responseId)
                 model.type = 1
-                model.value = text
+                model.content = text
                 model.state = "end"
+                model.totalContent = text
                 sendRelpy(model: model)
-                
+                responseId = "\(Date().timeIntervalSince1970)"
                 MixSdk.shared.chat.send(content: text)
             }
             else{
                 Logger.log(error ?? "")
-                let model = IBAiResponse()
-                model.type = 0
+                let model = IBAiResponse(responseId)
+                model.type = 3
                 model.state = "end"
+//                model.value = "语音识别错误"
                 sendRelpy(model: model)
             }
         }
@@ -155,19 +158,19 @@ extension IBAiManager{
                 reply = ""
             }
             else if model.type == "end" {
-                let model = IBAiResponse()
-                model.type = 2
-                model.value = reply
+                let model = IBAiResponse(responseId)
+                model.type = 4
                 model.state = "end"
-                self.aiResponse?(model)
-//                sendRelpy(model: model)
+                model.totalContent = reply
+                sendRelpy(model: model)
             }
             else if model.type == "middle"{
                 reply += model.content ?? ""
-                let data = IBAiResponse()
+                let data = IBAiResponse(responseId)
                 data.state = "middle"
                 data.type = 2
-                data.value = model.content ?? ""
+                data.content = model.content ?? ""
+                data.totalContent = reply
                 sendRelpy(model: data)
             }
         }
index cec406b..4851c5b 100644 (file)
@@ -110,7 +110,7 @@ struct IBAiReponseChecker: IBChecker {
         Logger.log(value.description)
         
         var data = [value.type.byte]
-        if let value = value.value.data(using: .utf8),!value.isEmpty  {
+        if let value = value.content.data(using: .utf8),!value.isEmpty  {
             data += value.count.byte2
             data += value.bytes
         }
index 7ec3331..d30f040 100644 (file)
@@ -8,17 +8,29 @@
 import Foundation
 /// Ai回应模型
 public class IBAiResponse {
-    /// 类型,0:AI回应错误   1:AI录音解析内容   2:AI回应内容(类型为0时,只发类型即可,后面字节均不发)
+    /// 类型,
+    /// 0:AI录音解析错误(只发类型即可,后面字节均不发)
+    /// 1:AI录音解析内容
+    /// 2:AI回应内容
+    /// 3:AI回应错误(只发类型即可,后面字节均不发)
+    /// 4:AI回应结束(只发类型即可,后面字节均不发)
     public var type: Int = 0
-    ///  内容
-    public var value: String = ""
-    
     /// 类型 start middle end
     public var state:String = ""
     
-    public init() { }
+    ///  回复id
+    public var reponseId: String = ""
+    ///  内容
+    public var content: String = ""
+    ///  累积内容
+    public var totalContent: String = ""
+    
+    
+    init(_ reponseId:String) {
+        self.reponseId = reponseId
+    }
     
     public var description: String  {
-        return "IBAiResponse(type: \(type), value:\(value), state:\(state)"
+        return "IBAiResponse(type: \(type), state:\(state), content:\(content))"
     }
 }