var responseId = ""
var reply = ""
+ var recordData = Data()
var isLogin:Bool{
return MixSdk.shared.auth.authorized
setupChatCallBack()
}
- func aiValid(_ data:Data){
+
+ /// 检查chatGPT key是否有效
+ /// - Parameters:
+ /// - key: key
+ /// - completeHandler: 结果回调
+ public func checkChatptValid(_ key:String ,completeHandler: @escaping MSChatGptCheckKeyCallBack){
+ guard let key = chatGptKey else{
+ Logger.log("请先设置chatGPT key")
+ completeHandler(false,nil)
+ return
+ }
+ MixSdk.shared.chatGpt.isValidKey(key, completeHandler: completeHandler)
+ }
+
+
+
+ func checkAiValid(_ data:Data){
let result = IBGeneralParser.dataPacket(data)
let platform = chatModeMap[result.int] ?? .doubao
let key = platform == .chatGPT ? chatGptKey : nil
}
}
}
-
- public func checkChatptValid(_ key:String ,completeHandler: @escaping MSChatGptCheckKeyCallBack){
- guard let key = chatGptKey else{
- Logger.log("请先设置chatGPT key")
- completeHandler(false,nil)
- return
- }
- MixSdk.shared.chatGpt.isValidKey(key, completeHandler: completeHandler)
- }
- func sendAiState(isValid:Bool,gptKey:String?){
- let model = IBAiValid()
- model.isValid = isValid
- model.key = gptKey
- IBSender()
- .ability(IBAbility.aiValid)
- .parameters([.aiValid(model)])
- .response { result in
-
- }
- }
//取消当前思考
func cancelThinkAction(){
MixSdk.shared.chat.reset()
cancelThink?()
}
- func aiRequest(_ data:Data){
+ func startRecord(_ data:Data){
+ recordData = Data()
+ Logger.log("开始录音:")
let result = IBGeneralParser.dataPacket(data)
let code = result.int
- IBSender()
- .ability(IBAbility.aiReady)
- .parameters([.value(1)])
- .response {[weak self] result in
- self?.fectchAiAudio()
- }
-
-
let platform = chatModeMap[code] ?? .doubao
Logger.log("使用模型:",platform.title)
useMode?(platform)
MixSdk.shared.setPlatform(platform,key: nil)
}
}
- func fectchAiAudio(){
+ func stopRecord(_ data:Data){
+ Logger.log("结束录音:")
+ receiveFullData(sbcData: recordData)
+ }
+ func receiveRecordData(data:Data){
+ recordData.append(data)
+ }
+}
+extension IBAiManager{
+
+ func sendAiState(isValid:Bool,gptKey:String?){
+ let model = IBAiValid()
+ model.isValid = isValid
+ model.key = gptKey
IBSender()
- .ability(IBAbility.fetchAiAudio)
- .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(responseId)
- model.type = 0
- model.state = "end"
- model.content = "录音解析错误"
- sendRelpy(model: model)
- }
+ .ability(IBAbility.aiValid)
+ .parameters([.aiValid(model)])
+ .response { result in
+
}
}
+
+ func saveRecordData(data:Data){
+ Logger.log("文件大小 \(data.count)")
+ let filePath = NSHomeDirectory() + "/Documents/\(Date().format(.long2)).sbc"
+ let url = URL(fileURLWithPath: filePath)
+ do {
+ try data.write(to: url)
+ print("保存路径 \(filePath)")
+ } catch let error {
+ print("\(error)")
+ }
+ }
}
extension IBAiManager{
- func receiveAiData(sbcData:Data){
+ private func receiveFullData(sbcData:Data){
+ saveRecordData(data: sbcData)
let pcmData = MSAudioConvert.sbcTopcm(sbcData)
if pcmData.count == 0{
Logger.log("sbc2pcm失败")
}
}
- func sendToChatGpt(content text:String){
+ private func sendToChatGpt(content text:String){
reply = ""
MixSdk.shared.chatGpt.send(content: text) {[weak self] response, error in
guard let self = self else {return}
}
- func setupChatCallBack(){
+ private func setupChatCallBack(){
let chat = MixSdk.shared.chat
chat.callBack = {[weak self] model in
guard let self = self else {return}
sendRelpy(model: data)
}
}
-
-
}
- func sendRelpy(model:IBAiResponse){
+ private func sendRelpy(model:IBAiResponse){
self.aiResponse?(model)
IBSender()
.ability(IBAbility.aiResponse)
}
}
-extension IBAiManager{
+ extension IBAiManager{
func login(){
let mac = IBBluetooth.shared.currentConnected.macAddress.split(separator: ":").joined().uppercased()
login(deviceId:mac ) { token, error in
/// - Parameters:
/// - deviceId: 设备ID
/// - completeHandler: 结果回调
- func login(deviceId:String,completeHandler: @escaping MSLoginCallBack){
+ private func login(deviceId:String,completeHandler: @escaping MSLoginCallBack){
if productId.isEmpty || productKey.isEmpty {
Logger.log("请先设置productId和productKey!")
return
}
}
- func startLogin(deviceId:String,password:String,completeHandler: @escaping MSLoginCallBack) {
+ private func startLogin(deviceId:String,password:String,completeHandler: @escaping MSLoginCallBack) {
MixSdk.shared.auth.login(productKey:productKey,deviceId: deviceId, password: password){[weak self] token,error in
if let err = error{
if case .reponseError(let code,_) = err,code == 50021{
}
}
- func startRegister(deviceId:String,completeHandler: @escaping MSRegisterCallBack){
+ private func startRegister(deviceId:String,completeHandler: @escaping MSRegisterCallBack){
MixSdk.shared.auth.register(productId: productId, productKey: productKey, deviceId: deviceId){[weak self] password,error in
if let pwd = password{
UserDefaults.standard.setValue(password, forKey: deviceId)
/// Write 特征值(发送文件OAT、MP3等)
let writeFileCharacteristicUUID: String = "2AE6"
let writeFileResponseUUID: String = "2AE7"
+/// 录音uuid
+let recordCharacteristicUUID: String = "2AE8"
class IBBluetooth: NSObject {
static let shared = IBBluetooth()
private var writeBigCharacteristic: CBCharacteristic!
/// 2AE0
private var writeFileCharacteristic: CBCharacteristic!
+ /// 2AE8
+ private var recordCharacteristic: CBCharacteristic!
/// 中央管理类,管理蓝牙的扫描连接
var centralManager: CBCentralManager!
peripheral.setNotifyValue(true, for: $0)
return
}
+ if $0.uuid.uuidString == recordCharacteristicUUID {
+ recordCharacteristic = $0
+ peripheral.setNotifyValue(true, for: $0)
+ return
+ }
+
}
}
func peripheral(_ peripheral: CBPeripheral, didUpdateNotificationStateFor characteristic: CBCharacteristic, error: Error?) {
Logger.log(error)
}
if let data = characteristic.value {
- Logger.log( "[receive] \(characteristic.uuid.uuidString) " + data.joined(" "))
+// Logger.log( "[receive] \(characteristic.uuid.uuidString) " + data.joined(""))
+ if data.count > 100 {
+ Logger.log( "[receive] \(characteristic.uuid.uuidString) " + "\(data.count)")
+ }
+ else{
+ Logger.log( "[receive] \(characteristic.uuid.uuidString) " + data.joined(""))
+ }
}
receiveManager.receice(characteristic: characteristic)
}