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)
}
}
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)
}
}
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
}
}
}
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
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
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>
public var chatGptKey:String = ""
public var aiResponse:((_ response:IBAiResponse) -> Void)?
-
- var audioData = Data()
-
+
+ var responseId = ""
var reply = ""
-
init(){
MixSdk.shared.isDebug = true
setupChatCallBack()
.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)
}
}
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
}
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)
}
}
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)
}
}
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
}
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))"
}
}