Merge branch 'v2' into v21
authorliangzhenying <867174124@qq.com>
Wed, 12 Mar 2025 02:57:31 +0000 (10:57 +0800)
committerliangzhenying <867174124@qq.com>
Wed, 12 Mar 2025 02:57:31 +0000 (10:57 +0800)
# Conflicts:
# 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/IBluetooth.swift

1  2 
IOTBluetooth/IOTBluetooth/IOTBluetooth.xcworkspace/xcuserdata/yaozuopan.xcuserdatad/UserInterfaceState.xcuserstate
IOTBluetooth/IOTBluetooth/IOTBluetooth/IBAiManager.swift
IOTBluetooth/IOTBluetooth/IOTBluetooth/IBReceiveManager.swift

@@@ -43,7 -41,7 +43,8 @@@ public class IBAiManager
          
      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
      
      //取消当前思考
      func cancelThinkAction(){
--        MixSdk.shared.chat.reset()
++//        MixSdk.shared.chat.reset()
 +        MixSdk.shared.voiceChat.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)
          }
          else{
              MixSdk.shared.setPlatform(platform,key: nil)
-             //开始任务
-             MixSdk.shared.voiceChat.start()
          }
++        MixSdk.shared.voiceChat.start()
      }
-     func fectchAiAudio(){
-         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)
-                 }
-             }
+     func stopRecord(_ data:Data){
+         Logger.log("结束录音:")
+         receiveFullData(sbcData: recordData)
      }
- }
- extension IBAiManager{
-     func receiveAiData(sbcData:Data){
+     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.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{
+     private func receiveFullData(sbcData:Data){
 -        saveRecordData(data: sbcData)
++//        saveRecordData(data: sbcData)
          let pcmData =  MSAudioConvert.sbcTopcm(sbcData)
          if pcmData.count == 0{
++            Logger.log("sbc2pcm失败")
              Logger.log("sbc2pcm失败")
              let model = IBAiResponse(responseId)
              model.type = 0
              sendRelpy(model: model)
              return
          }
++        
          guard let pcmPath = IBTools.saveToFile(data: pcmData) else {return}
          MixSdk.shared.stt.sentenceRecognize(filePath: pcmPath,format:"pcm",sample_rate:"16000",lang: "zh-cn") {[weak self] text, error in
              guard let self = self else {return}
              }
          }
      }
--    
 -    private func sendToChatGpt(content text:String){
++    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 sendToChatGpt(content text:String){
          reply = ""
          MixSdk.shared.chatGpt.send(content: text) {[weak self] response, error in
              guard let self  = self else {return}
@@@ -25,7 -25,23 +25,26 @@@ class IBReceiveManager 
  
          guard let data = characteristic.value else { return }
          if data.count == 2 && data.int == 0 {
-             //            Logger.log("收到0000指令异常")
+             //Logger.log("收到0000指令异常")
+             return
+         }
+         
+         if characteristic.uuid.uuidString == recordCharacteristicUUID {
+             //手表发送录音开始
+             if(data.bytes[1] == 0x08 && data.bytes[2] == 0x01){
+                 IBAiManager.shared.startRecord(data)
+             }
+             //手表发送录音结束
+             else if(data.bytes[1] == 0x08 && data.bytes[2] == 0x02){
+                 IBAiManager.shared.stopRecord(data)
+             }
+             else{
+                 //音频数据
 -                IBAiManager.shared.receiveRecordData(data: data)
++                let index = data.prefix(4).int
++                let content = data.suffix(from: 4)
++                Logger.log("index = \(index)",content)
++                IBAiManager.shared.receiveRecordData(data: content)
+             }
              return
          }