AI功能调整
authorliangzhenying <867174124@qq.com>
Wed, 5 Nov 2025 10:32:53 +0000 (18:32 +0800)
committerliangzhenying <867174124@qq.com>
Wed, 5 Nov 2025 10:32:53 +0000 (18:32 +0800)
19 files changed:
ShenYin/ShenYin/Api/HttpClient2.swift
ShenYin/ShenYin/Assets.xcassets/home/chat/role_test_xiaoyin.imageset/Contents.json [moved from ShenYin/ShenYin/Assets.xcassets/home/chat/role_linjianvhai.imageset/Contents.json with 100% similarity]
ShenYin/ShenYin/Assets.xcassets/home/chat/role_test_xiaoyin.imageset/默认.png [moved from ShenYin/ShenYin/Assets.xcassets/home/chat/role_linjianvhai.imageset/默认.png with 100% similarity]
ShenYin/ShenYin/Assets.xcassets/home/chat/role_test_xiaoyin.imageset/默认@2x.png [moved from ShenYin/ShenYin/Assets.xcassets/home/chat/role_linjianvhai.imageset/默认@2x.png with 100% similarity]
ShenYin/ShenYin/Assets.xcassets/home/chat/role_test_xiaoyin.imageset/默认@3x.png [moved from ShenYin/ShenYin/Assets.xcassets/home/chat/role_linjianvhai.imageset/默认@3x.png with 100% similarity]
ShenYin/ShenYin/UI/Home/CallingRecordVC.swift
ShenYin/ShenYin/UI/Home/Chat/ChatCell.swift
ShenYin/ShenYin/UI/Home/Chat/ChatHeaderView.swift
ShenYin/ShenYin/UI/Home/Chat/ChatVC.swift
ShenYin/ShenYin/UI/Home/Chat/NavigationBarItem.swift
ShenYin/ShenYin/UI/Home/Chinese2English/Chinese2EnglishCell.swift
ShenYin/ShenYin/UI/Home/Chinese2English/Chinese2EnglishVC.swift
ShenYin/ShenYin/UI/Home/Dialog/DialogSplitView.swift
ShenYin/ShenYin/UI/Home/Dialog/DialogTranslateCell.swift
ShenYin/ShenYin/UI/Home/Scan/DeviceVM.swift
ShenYin/ShenYin/UI/Home/Scan/ProductInfoModel.swift [new file with mode: 0644]
ShenYin/ShenYin/UI/Launch/JoySdkManager.swift
ShenYin/ShenYin/UI/Mine/Root/MineHeaderView.swift
ShenYin/ShenYin/UI/common/pop/ConnectPopView.swift

index c8bad9f..35d1757 100644 (file)
@@ -78,6 +78,8 @@ enum CommomApi
     case commitFeedback(param:[String:Any])
     /// 获取提交的帮助与反馈
     case feedbackHistory
+    /// 根据产品名称获取产品信息
+    case productInfo(name:String)
     /// 获取绑定的设备列表
     case deviceList
     /// 绑定设备
@@ -206,7 +208,9 @@ extension CommomApi{
             return "/uc/feedback"
         case .feedbackHistory:
             return "/uc/feedback"
-           
+        
+        case .productInfo(let name):
+            return "/dev/product-info/by-name"
         case .deviceList:
             return "/dev/device/list"
         case .bindDevice(let param):
@@ -314,6 +318,9 @@ extension CommomApi{
         case let .commitFeedback(para):
             params += para
             break
+        case let .productInfo(name):
+            params["prodName"] = name
+            break
         case let .bindDevice(para):
             params += para
             break
index 627dd66..cd4297c 100644 (file)
@@ -149,6 +149,7 @@ extension CallingRecordVC : JoyGemCallManagerDelegate {
             Logger.debug( "用户主动结束")
         } else {
             Logger.debug( "自动结束")
+            rhythView.stopTimer()
             toolBar.recordBtn.isSelected = false
         }
     }
index cfb25ea..aad59a1 100644 (file)
@@ -33,7 +33,7 @@ class ChatCell:BaseTableViewCell{
         }
         originalLabel.do { v in
             v.text = "你好,欢迎使用AI翻译,点击下方按钮立即开始咱们的对话吧"
-            v.font = .bold(14)
+            v.font = .medium(14)
             v.textColor = .hexString("#606D80")
             v.numberOfLines = 0
             v.textAlignment = .left
index 4cafb0a..b47b374 100644 (file)
@@ -27,14 +27,14 @@ class ChatHeaderView: BaseView {
             v.image = UIImage(named: "chat_xiaoyin")
         }
         titleLabel.do {v in
-//            v.text = "嗨!我是小音"
+            v.text = "嗨!我是小音"
             v.numberOfLines = 0
             v.textAlignment = .center
             v.textColor = .hexString("#121212")
             v.font = .bold(18)
         }
         desLabel.do {v in
-//            v.text = "我可以帮你搜索、答疑、写作,请把你的任务交给 我吧~"
+            v.text = "我可以帮你搜索、答疑、写作,请把你的任务交给 我吧~"
             v.numberOfLines = 0
             v.textAlignment = .center
             v.textColor = .hexString("#666666")
index 919fcf4..2213ff8 100644 (file)
@@ -76,11 +76,11 @@ class ChatVC:BaseVC{
         PcmSound.sharedInstance().delegate = self
         JoyGemChatManager.shared().addObserver(self, forKeyPath: "isActive",options: [.new, .old], context: nil);
         
-        let model = ChatCellModel()
-        model.type = 0
-        model.content = "我是你的新朋友,有什么我可以帮助到你的?"
-        model.id = 0
-        dataList.append(model)
+//        let model = ChatCellModel()
+//        model.type = 0
+//        model.content = "我是你的新朋友,有什么我可以帮助到你的?"
+//        model.id = 0
+//        dataList.append(model)
         
         loadRoleList()
     }
@@ -128,11 +128,20 @@ class ChatVC:BaseVC{
         JoyGemChatManager.shared().getSpeakerList {[weak self] speakers in
             guard let self = self,speakers.count > 0 else{return}
             self.roleList = speakers
-            self.roleItem.role = speakers.first
-            self.headerView.role = speakers.first
+            self.roleList.insert(xiaoYinRole(), at: 0)
+            self.roleItem.role = roleList.first
+            self.headerView.role = roleList.first
             JoyGemChatManager.shared().setSpeaker(self.roleItem.role)
         }
     }
+    func xiaoYinRole()->JoyGemSpeaker{
+        let model = JoyGemSpeaker()
+        model.sid = "zh_female_tianmeitaozi_mars_bigtts"
+        model.name = "小音"
+        model.type = "default"
+        model.role = "test_xiaoyin"
+        return model
+    }
 }
 
 extension ChatVC:ChatRecordBarDelegate{
@@ -171,7 +180,11 @@ extension ChatVC:UITableViewDelegate,UITableViewDataSource {
 
 extension ChatVC : JoyGemChatManagerDelegate {
     func chatManager(_ manager: JoyGemChatManager, audioData data: Data?, index: UInt, sampleRate: UInt, finish isFinish: Bool) {
-        
+        if (!isTtsPlaying) {
+            isTtsPlaying = true
+            JoyGemChatManager.shared().playAudioStart()
+        }
+        PcmSound.sharedInstance().feed(data)
     }
     
     func chatManager(_ manager: JoyGemChatManager, stateChange code: JoyGemStateCode) {
@@ -209,11 +222,7 @@ extension ChatVC : JoyGemChatManagerDelegate {
     }
     
     func chatManager(_ manager: JoyGemChatManager, audioData data: Data?, finish isFinish: Bool) {
-        if (!isTtsPlaying) {
-            isTtsPlaying = true
-            JoyGemChatManager.shared().playAudioStart()
-        }
-        PcmSound.sharedInstance().feed(data)
+
     }
     
     func chatManager(_ manager: JoyGemChatManager, requestText text: String?, index: UInt) {
index 53dc5a3..1f5b700 100644 (file)
@@ -6,6 +6,8 @@
 //
 import UIKit
 import JoyGemAI
+
+
 class NavigationBarItem: BaseView {
     let icon = UIImageView()
     let titleLabel = UILabel()
@@ -20,6 +22,7 @@ class NavigationBarItem: BaseView {
             v.textColor = .rgb(0x121212)
             v.font = .bold(14)
             v.text = "智能体"
+            v.isHidden = true
         }
     }
     
index 3a5d655..483e123 100644 (file)
@@ -23,7 +23,7 @@ class Chinese2EnglishCell:BaseTableViewCell{
     let line = BrokenLineView()
     let originalLabel = UILabel()
     let translationLabel = UILabel()
-    let copyIcon = UIImageView()
+    let playIcon = UIImageView()
     
     override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
         super.init(style: style, reuseIdentifier: reuseIdentifier)
@@ -56,15 +56,16 @@ class Chinese2EnglishCell:BaseTableViewCell{
         line.do { v in
 //                        v.backgroundColor = .hexString("#93C6EC")
         }
-        copyIcon.do { v in
+        playIcon.do { v in
             v.image = UIImage(named: "play_animate_3")
             v.animationImages = [UIImage(named: "play_animate_1")!,UIImage(named: "play_animate_2")!,UIImage(named: "play_animate_3")!]
             v.animationDuration = 0.6
             v.animationRepeatCount = 0
-            v.yc.addTap(target: self, action: #selector(copyAction))
+            v.yc.addTap(target: self, action: #selector(playAction))
+            v.isHidden = true
         }
         contentView.addSubview(bgView)
-        bgView.addSubviews([originalLabel,translationLabel,line,copyIcon])
+        bgView.addSubviews([originalLabel,translationLabel,line,playIcon])
     }
     
     override func setupLayout() {
@@ -91,7 +92,7 @@ class Chinese2EnglishCell:BaseTableViewCell{
             make.width.lessThanOrEqualTo(kScreenWid - 82)
             make.bottom.equalToSuperview().inset(47)
         }
-        copyIcon.snp.makeConstraints { make in
+        playIcon.snp.makeConstraints { make in
             make.right.equalToSuperview().inset(12)
             make.size.equalTo(24)
             make.bottom.equalToSuperview().inset(10)
@@ -104,14 +105,14 @@ class Chinese2EnglishCell:BaseTableViewCell{
             translationLabel.text = data.response
         }
     }
-    @objc func copyAction(){
+    @objc func playAction(){
 //        UIPasteboard.general.string = data.send + "\n" + data.response
 //        YLprogressHUD.showAutoHiden("已拷贝")
-        if copyIcon.isAnimating {
-            copyIcon.stopAnimating()
+        if playIcon.isAnimating {
+            playIcon.stopAnimating()
         }
         else{
-            copyIcon.startAnimating()
+            playIcon.startAnimating()
         }
     }
 }
index dbae000..d7e67c8 100644 (file)
@@ -12,9 +12,10 @@ class Chinese2EnglishVC:BaseVC{
     let toolBar = RecordBar()
     let tableView = UITableView(frame: CGRectZero, style: .plain)
     let bg = UIImageView()
-    var dataList:[(Chinese2EnglishCellModel,UInt)] = []
+    var dataList:[(Chinese2EnglishCellModel,Int)] = []
     var pcmData = Data()
     var recordFilePath : String?
+    var startIndex = 0//记录开始录音的次数,用于区分返回的数据
 
     override func setupViews() {
         navBar.title = "中英互译"
@@ -110,9 +111,7 @@ extension Chinese2EnglishVC:RecordBarDelegate{
     func recordBar(_ bar: RecordBar, stateChange state: RecordBarSate) {
         if state == .start {
             pcmData = Data()
-            dataList.removeAll()
-            refreshData()
-            
+            startIndex += 100000
             JoyGemSIDeviceManager.shared().originalLanguage = bar.leftItem.language.value
             JoyGemSIDeviceManager.shared().targetLanguage = bar.rightItem.language.value
             JoyGemSIDeviceManager.shared().start()
@@ -125,37 +124,6 @@ extension Chinese2EnglishVC:RecordBarDelegate{
         }
         else if state == .stop{
             JoyGemSIDeviceManager.shared().stop()
-            bar.startAnimating {[weak self] in
-                guard let self = self else{return}
-                //                toolBar.recordBtn.stopCli()
-                guard let path = recordFilePath,let wavPath = DCFolder.recordFileResave(srcPath: path) else{return}
-                let v = PopTextField()
-                v.show()
-                v.cancelTap = {
-                    
-                }
-                v.okTap = { [weak self]  text in
-                    guard let self = self else{return}
-                    var origin = ""
-                    var translate = ""
-                    for (item,_) in dataList {
-                        origin += item.send + "\n"
-                        translate += item.response + "\n"
-                    }
-                    
-                    
-                    let model = RecordDetailModel()
-                    model.type = .translate
-                    model.from = bar.leftItem.language
-                    model.to = bar.rightItem.language
-                    model.name = text
-                    model.path = wavPath
-                    model.duration = YLToos.getDuration(model.path)
-                    model.origin = origin
-                    model.translate = translate
-                    App.shared.goToPage(RecordDetailVC(record: model))
-                }
-            }
         }
     }
 }
@@ -186,10 +154,10 @@ extension Chinese2EnglishVC:JoyGemSIDeviceManagerDelegate{
     func siDeviceManager(_ manager: JoyGemSIDeviceManager, didUpdateRaw model: JoyGemAsrModel) {
         Logger.debug("text: \(model.text),index: \(model.index)")
         let msg = dataList.firstIndex (where: { (str,idx) in
-            return idx == model.index;
+            return idx == Int(model.index) + startIndex
         })
         if (msg == nil) {
-            dataList.append((Chinese2EnglishCellModel(send: model.text),model.index))
+            dataList.append((Chinese2EnglishCellModel(send: model.text),Int(model.index) + startIndex))
         } else {
             let (item,_) = dataList[msg!]
             item.send =  model.text
@@ -204,10 +172,10 @@ extension Chinese2EnglishVC:JoyGemSIDeviceManagerDelegate{
     
     func siDeviceManager(_ manager: JoyGemSIDeviceManager, didUpdateTranslate model: JoyGemAsrModel) {
         let msg = dataList.firstIndex (where: { (str,idx) in
-            return idx == model.index;
+            return idx == Int(model.index) + startIndex
         })
         if (msg == nil) {
-            dataList.append((Chinese2EnglishCellModel(response: model.text),model.index))
+            dataList.append((Chinese2EnglishCellModel(response: model.text),Int(model.index) + startIndex))
         } else {
             let (item,_) = dataList[msg!]
             item.response =  model.text
index 8c99724..24bdd2b 100644 (file)
@@ -104,7 +104,7 @@ extension DialogSplitView:UITableViewDelegate,UITableViewDataSource {
 class DialogSplitCell:BaseTableViewCell{
     let bgView = UIView()
     let originalLabel = UILabel()
-    let copyIcon = UIImageView()
+    let playIcon = UIImageView()
     
     override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
         super.init(style: style, reuseIdentifier: reuseIdentifier)
@@ -128,15 +128,15 @@ class DialogSplitCell:BaseTableViewCell{
             v.numberOfLines = 0
             v.textAlignment = .left
         }
-        copyIcon.do { v in
+        playIcon.do { v in
             v.image = UIImage(named: "play_animate_3")
             v.animationImages = [UIImage(named: "play_animate_1")!,UIImage(named: "play_animate_2")!,UIImage(named: "play_animate_3")!]
             v.animationDuration = 0.6
             v.animationRepeatCount = 0
-            v.yc.addTap(target: self, action: #selector(copyAction))
+            v.yc.addTap(target: self, action: #selector(playAction))
         }
         contentView.addSubview(bgView)
-        bgView.addSubviews([originalLabel,copyIcon])
+        bgView.addSubviews([originalLabel,playIcon])
     }
     
     override func setupLayout() {
@@ -148,7 +148,7 @@ class DialogSplitCell:BaseTableViewCell{
             make.right.equalToSuperview().inset(50)
             make.bottom.equalToSuperview().inset(14)
         }
-        copyIcon.snp.makeConstraints { make in
+        playIcon.snp.makeConstraints { make in
             make.right.equalToSuperview().inset(12)
             make.size.equalTo(24)
             make.top.equalToSuperview().inset(12)
@@ -201,14 +201,12 @@ class DialogSplitCell:BaseTableViewCell{
         }
     }
 
-    @objc func copyAction(){
-        //        UIPasteboard.general.string = data.send + "\n" + data.response
-        //        YLprogressHUD.showAutoHiden("已拷贝")
-        if copyIcon.isAnimating {
-            copyIcon.stopAnimating()
+    @objc func playAction(){
+        if playIcon.isAnimating {
+            playIcon.stopAnimating()
         }
         else{
-            copyIcon.startAnimating()
+            playIcon.startAnimating()
         }
     }
 }
index b98a949..b1b3bfd 100644 (file)
@@ -25,7 +25,7 @@ class DialogTranslateCell:BaseTableViewCell{
     let line = BrokenLineView()
     let originalLabel = UILabel()
     let translationLabel = UILabel()
-    let copyIcon = UIImageView()
+    let playIcon = UIImageView()
     
     override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
         super.init(style: style, reuseIdentifier: reuseIdentifier)
@@ -58,15 +58,16 @@ class DialogTranslateCell:BaseTableViewCell{
         line.do { v in
             v.backgroundColor = .hexString("#93C6EC")
         }
-        copyIcon.do { v in
+        playIcon.do { v in
             v.image = UIImage(named: "play_animate_3")
             v.animationImages = [UIImage(named: "play_animate_1")!,UIImage(named: "play_animate_2")!,UIImage(named: "play_animate_3")!]
             v.animationDuration = 0.6
             v.animationRepeatCount = 0
-            v.yc.addTap(target: self, action: #selector(copyAction))
+            v.yc.addTap(target: self, action: #selector(playAction))
+            v.isHidden = true
         }
         contentView.addSubview(bgView)
-        bgView.addSubviews([originalLabel,translationLabel,line,copyIcon])
+        bgView.addSubviews([originalLabel,translationLabel,line,playIcon])
     }
     
     override func setupLayout() {
@@ -96,7 +97,7 @@ class DialogTranslateCell:BaseTableViewCell{
             make.height.greaterThanOrEqualTo(15)
             make.bottom.equalToSuperview().inset(14)
         }
-        copyIcon.snp.makeConstraints { make in
+        playIcon.snp.makeConstraints { make in
             make.right.equalToSuperview().inset(12)
             make.size.equalTo(24)
             make.top.equalToSuperview().inset(12)
@@ -132,14 +133,14 @@ class DialogTranslateCell:BaseTableViewCell{
             line.layoutIfNeeded()
         }
     }
-    @objc func copyAction(){
+    @objc func playAction(){
         //        UIPasteboard.general.string = data.send + "\n" + data.response
         //        YLprogressHUD.showAutoHiden("已拷贝")
-        if copyIcon.isAnimating {
-            copyIcon.stopAnimating()
+        if playIcon.isAnimating {
+            playIcon.stopAnimating()
         }
         else{
-            copyIcon.startAnimating()
+            playIcon.startAnimating()
         }
     }
 }
index aa1166e..f33849d 100644 (file)
@@ -48,9 +48,22 @@ extension DeviceVM{
         BleManager.shared.stopScanDevice()
     }
     static func startConnecte(_ data:DCPeripheral){
-        ConnectPopView.shared.stateDidChange(.connecting)
-        BleManager.shared.connectPeripheral(data)
-        
+        guard let name = data.device.name else {
+            return
+        }
+        getProductInfo(name: name) { model in
+            if let info = model{
+                ConnectPopView.shared.titleLabel.text = name
+                ConnectPopView.shared.imageView.kf.setImage(with: info.image.yc.asUrl)
+                ConnectPopView.shared.stateDidChange(.connecting)
+            }
+            else{
+                ConnectPopView.shared.titleLabel.text = name
+                ConnectPopView.shared.stateDidChange(.connecting)
+            }
+            BleManager.shared.connectPeripheral(data)
+
+        }
     }
     /// 带冒号
     static func getDeviceInfo(_ device:DCPeripheral){
@@ -115,6 +128,18 @@ extension DeviceVM{
         }
         return result
     }
+    
+    static func getProductInfo(name:String,finished:@escaping ((_ model:ProductInfoModel?)->Void)){
+        let api = CommomApi.productInfo(name: name)
+        HttpClient.request(api) {(model:ProductInfoModelRoot,res) in
+            if model.isSuccess{
+                finished(model.data)
+            }
+            else{
+                finished(nil)
+            }
+        }
+    }
 }
 
 extension DeviceVM{
diff --git a/ShenYin/ShenYin/UI/Home/Scan/ProductInfoModel.swift b/ShenYin/ShenYin/UI/Home/Scan/ProductInfoModel.swift
new file mode 100644 (file)
index 0000000..fcef718
--- /dev/null
@@ -0,0 +1,20 @@
+//
+//  Untitled.swift
+//  ShenYin
+//
+//  Created by liangshi on 2025/11/5.
+//
+
+import HandyJSON
+
+class ProductInfoModelRoot:ResponseBaseModel {
+    var data = ProductInfoModel()
+}
+class ProductInfoModel:HandyJSON {
+    var id = ""
+    var name = ""
+    var image = ""
+    var description = ""
+    required public init() { }
+}
+
index 64f2405..d8dade2 100644 (file)
@@ -16,8 +16,8 @@ class JoySdkManager:NSObject{
         //MARK: 初始化SDK
         JoyGemAIManager.shared().initSdk()
         //MARK: 配置日志类型
-        JoyGemAIManager.shared().setLogMode(JoyGemLogMode.all)
-        
+//        JoyGemAIManager.shared().setLogMode(JoyGemLogMode.all)
+        JoyGemAIManager.shared().setLogMode(JoyGemLogMode.close)
         
         let fileManager = FileManager.default
         if let appSupportDirectory = fileManager.urls(for: .applicationSupportDirectory, in: .userDomainMask).first {
index 94c8143..74281dd 100644 (file)
@@ -86,7 +86,7 @@ class MineUserInfoView: BaseView {
             m.top.equalToSuperview().inset(60)
             m.left.equalToSuperview().inset(38)
             m.height.equalTo(30)
-            m.width.equalTo(120)
+            m.width.equalTo(130)
         }
         icon.snp.makeConstraints { (m) in
             m.size.equalTo(80)
index ec0e19d..8d982fd 100644 (file)
@@ -27,8 +27,8 @@ enum ConnectPopState {
 class ConnectPopView: BasePresentView2 {
     static let shared = ConnectPopView()
     let contentView = UIView()
-    private let titleLabel = UILabel()
-    private let imageView = UIImageView()
+    let titleLabel = UILabel()
+    let imageView = UIImageView()
     private let desLabel = UILabel()