From: liangzhenying <867174124@qq.com> Date: Fri, 19 Dec 2025 09:33:58 +0000 (+0800) Subject: 翻译修改 X-Git-Tag: 1.0.2~30 X-Git-Url: http://git.snicker.com.cn/Users/apple/Desktop/static/gitweb.css?a=commitdiff_plain;h=0b896c7af657553f970c0cd6157d490f10b31489;p=mirrors%2FShenYin.git 翻译修改 --- diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/BleSender.swift b/DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/BleSender.swift index 39ae733..fbf60a6 100644 --- a/DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/BleSender.swift +++ b/DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/BleSender.swift @@ -21,7 +21,7 @@ class BleSender{ func startTimer() { deinitTimer() - self.timer = Timer.scheduledTimer(withTimeInterval: 3, repeats: false, block: { [unowned self] _ in + self.timer = Timer.scheduledTimer(withTimeInterval: 5, repeats: false, block: { [unowned self] _ in deinitTimer() self.completion?(.response.code(.timeout)) self.remove() diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/DCBleManager.swift b/DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/DCBleManager.swift index e02c3e5..99b43d7 100644 --- a/DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/DCBleManager.swift +++ b/DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/DCBleManager.swift @@ -10,7 +10,6 @@ import CoreBluetooth import StarburstSdk public class DCBleManager{ - public static let shared = DCBleManager() private var connectPeripheral: CBPeripheral? private var writeCha: CBCharacteristic? @@ -73,8 +72,13 @@ public extension DCBleManager{ if data.count > 4 && data[0] == 0xBA { if let sender = BleSender.answer(data) { sender.completion?(.response.code(.success).value(data)) - sender.deinitTimer() - sender.remove() + if data[1] == 0x10,data[2] == 0x01{ + //音乐列表分包,解析的时候处理 + } + else{ + sender.deinitTimer() + sender.remove() + } return } else if data[1] == 0x0D{ @@ -96,8 +100,9 @@ extension DCBleManager{ if data[1] == 0x10,data[2] == 0x06{ DCDevice.shared.receiveNotice(data) } - else if data[1] == 0x0F{ - switch data[2] { + else if data[1] == 0x0F,data[2] == 0x0B{ + let type = data[3] + switch type{ case 0x01: DCLogger.debug("打开AI对话") case 0x02: @@ -112,8 +117,8 @@ extension DCBleManager{ default: break } - - + DCDevice.shared.eventCallback?(type) + DCDevice.shared.sendAiEventResponse(type) } } static func contentData(_ data:Data)->Data{ diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/DCBleRecord.swift b/DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/DCBleRecord.swift index b9ee18e..48ef04b 100644 --- a/DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/DCBleRecord.swift +++ b/DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/DCBleRecord.swift @@ -10,9 +10,9 @@ import StarburstSdk public class DCBleRecord { public static let shared = DCBleRecord() /// 语⾔编码,默认为普通话(zh-CN),auto_lang自动识别 - public var fromLanguage:String = "" + public var fromLanguage:String = "zh-CN" /// ⽬标语⾔编码,默认为英语(en-US),auto_lang自动识别 - public var toLanguage:String = "" + public var toLanguage:String = "en-US" /// 是否翻译,默认false。如果为true翻译源语言和目标语言不能是同一种语言 public var isTranslate = false /// 是否进⾏Tts,默认false @@ -34,6 +34,10 @@ public class DCBleRecord { var translateList : [(String,Int)] = [] var translateText = "" + init() { + setupRecord() + } + func setupRecord(){ let config = StarburstAsrConfig() config.isTranslate = isTranslate diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/DCChat.swift b/DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/DCChat.swift index adf6117..06f9ec1 100644 --- a/DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/DCChat.swift +++ b/DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/DCChat.swift @@ -40,7 +40,11 @@ public class DCChat{ /// 默认pcm。⽀持pcm / ogg_opus / mp3 public var ttsAudioFormat:String = "mp3" /// 语⾔编码,默认为普通话(zh-CN) - public var language:String = "" + public var language:String = "zh-CN" + + init() { + setupChat() + } } extension DCChat{ public func getVcSpeekerList(finished:@escaping ([DCRole]?,Bool)->Void){ @@ -65,7 +69,7 @@ extension DCChat{ } } - public func initChat(){ + func setupChat(){ let config = StarburstVoiceChatConfig() config.tts = tts config.ttsAudioFormat = ttsAudioFormat @@ -94,7 +98,7 @@ extension DCChat{ responseCallback?(text,self.dialogId) } - } responseVoice: { [weak self] (dialogId,data, finish) in + } responseVoice: { [weak self] (dialogId,data, finish,sampleRate) in guard let self = self else { return } self.dialogId = dialogId dataCallback?(dialogId,data,finish) @@ -108,7 +112,8 @@ extension DCChat{ } public func startChat(){ - initChat() + setupChat() + DCDevice.shared.startChat() } public func stopChat(){ StarburstSdk.shared().stopVoiceChat(self.dialogId) diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/DCDevice.swift b/DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/DCDevice.swift index 4300bea..943f2f8 100644 --- a/DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/DCDevice.swift +++ b/DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/DCDevice.swift @@ -9,6 +9,12 @@ import Foundation public class DCDevice{ public static let shared = DCDevice() + /// ai事件回调 + /// 0x01(打开AI对话) +// 0x02(关闭AI对话) +// 0x03(打开耳机录音) +// 0x04(关闭耳机录音) + public var eventCallback:((UInt8)->Void)? func receiveNotice(_ data:Data){ if data[1] == 0x10,data[2] == 0x06{ @@ -23,7 +29,7 @@ public class DCDevice{ public func getBatery(finished:@escaping ((Int,Int)?)->Void){ var head: UInt8 = 0xBA var cmd: UInt8 = 0x09 - var data:UInt8 = 00 + var data:UInt8 = 0x00 var total = Data() total.append(&head, count: 1) total.append(&cmd, count: 1) @@ -49,7 +55,7 @@ public class DCDevice{ public func getSoftVersion(finished:@escaping (String?)->Void){ var head: UInt8 = 0xBA var cmd: UInt8 = 0x0A - var data:UInt8 = 00 + var data:UInt8 = 0x00 var total = Data() total.append(&head, count: 1) total.append(&cmd, count: 1) @@ -75,7 +81,7 @@ public class DCDevice{ public func getHardVersion(finished:@escaping (String?)->Void){ var head: UInt8 = 0xBA var cmd: UInt8 = 0x0A - var data:UInt8 = 01 + var data:UInt8 = 0x01 var total = Data() total.append(&head, count: 1) total.append(&cmd, count: 1) @@ -217,75 +223,17 @@ public class DCDevice{ } } + extension DCDevice{ - public func getMusicList(size:UInt8,index:UInt16,finished:@escaping ([DCMusic]?,Bool)->Void){ - var head: UInt8 = 0xBA - var cmd: UInt8 = 0x10 - var data:UInt8 = 0x01 - var pageSize = size - var total = Data() - total.append(&head, count: 1) - total.append(&cmd, count: 1) - total.append(&data, count: 1) - total.append(&pageSize, count: 1) - total.appendInt16(index) - total.addCrc() - - let sender = BleSender() - sender.data = total - sender.completion = { result in - DCLogger.debug("\(result.description)") - if result.isSuccess{ -// let data = DCBleManager.contentData(result.data) - let data = result.data.subdata(in: 3..Void){ - var head: UInt8 = 0xBA - var cmd: UInt8 = 0x10 - var data:UInt8 = 0x02 - var mode:UInt8 = mode - var total = Data() - total.append(&head, count: 1) - total.append(&cmd, count: 1) - total.append(&data, count: 1) - total.append(&mode, count: 1) - total.addCrc() - - let sender = BleSender() - sender.data = total - sender.completion = { result in - DCLogger.debug("\(result.description)") - if result.isSuccess{ - let value = result.data[2].int - DCLogger.debug(value) - finished(value == 0) - } - else{ - finished(false) - } - } - DCBleManager.shared.send(sender) - } - public func getMusicPlayMode(finished:@escaping (UInt8?,Bool)->Void){ + //0x01(打开AI对话) +// 0x02(关闭AI对话) +// 0x03(打开耳机录音) +// 0x04(关闭耳机录音) + func sendAiEventResponse(_ event:UInt8){ var head: UInt8 = 0xBA - var cmd: UInt8 = 0x10 - var data:UInt8 = 0x03 - var content:UInt8 = 0x00 + var cmd: UInt8 = 0x0F + var data:UInt8 = 0x0B + var content:UInt8 = event var total = Data() total.append(&head, count: 1) total.append(&cmd, count: 1) @@ -297,79 +245,15 @@ extension DCDevice{ sender.data = total sender.completion = { result in DCLogger.debug("\(result.description)") - if result.isSuccess{ - let value = UInt8(result.data[3].int) - DCLogger.debug(value) - finished(value,true) - } - else{ - finished(nil,false) - } } DCBleManager.shared.send(sender) + sender.deinitTimer()//不需要回执 + sender.remove() } - - public func musicPlay(index:UInt16?,finished:@escaping (UInt16?,Bool)->Void){ - if let index = index { - var head: UInt8 = 0xBA - var cmd: UInt8 = 0x10 - var data:UInt8 = 0x05 - - var total = Data() - total.append(&head, count: 1) - total.append(&cmd, count: 1) - total.append(&data, count: 1) - total.appendInt16(index) - total.addCrc() - - let sender = BleSender() - sender.data = total - sender.completion = { result in - DCLogger.debug("\(result.description)") - if result.isSuccess{ - let value = UInt16(result.data[3...4].int) - DCLogger.debug(value) - finished(value,true) - } - else{ - finished(nil,false) - } - } - DCBleManager.shared.send(sender) - } - else{ - var head: UInt8 = 0xBA - var cmd: UInt8 = 0x10 - var data:UInt8 = 0x04 - var content:UInt8 = 0x00 - - var total = Data() - total.append(&head, count: 1) - total.append(&cmd, count: 1) - total.append(&data, count: 1) - total.append(&content, count: 1) - total.addCrc() - - let sender = BleSender() - sender.data = total - sender.completion = { result in - DCLogger.debug("\(result.description)") - if result.isSuccess{ - let value = UInt16(result.data[3...4].int) - DCLogger.debug(value) - finished(value,true) - } - else{ - finished(nil,false) - } - } - DCBleManager.shared.send(sender) - } - } - public func musicPause(finished:@escaping (UInt16?,Bool)->Void){ + func startChat(){ var head: UInt8 = 0xBA - var cmd: UInt8 = 0x10 - var data:UInt8 = 0x04 + var cmd: UInt8 = 0x0F + var data:UInt8 = 0x0A var content:UInt8 = 0x01 var total = Data() total.append(&head, count: 1) @@ -382,46 +266,26 @@ extension DCDevice{ sender.data = total sender.completion = { result in DCLogger.debug("\(result.description)") - if result.isSuccess{ - let value = UInt16(result.data[3...4].int) - DCLogger.debug(value) - finished(value,true) - } - else{ - finished(nil,false) - } } DCBleManager.shared.send(sender) } - public func musicDelete(list:[UInt16],finished:@escaping (Bool)->Void){ + func stopChat(){ var head: UInt8 = 0xBA - var cmd: UInt8 = 0x10 - var data:UInt8 = 0x07 - var content:UInt8 = UInt8(list.count) + var cmd: UInt8 = 0x0F + var data:UInt8 = 0x0A + var content:UInt8 = 0x00 var total = Data() total.append(&head, count: 1) total.append(&cmd, count: 1) total.append(&data, count: 1) total.append(&content, count: 1) - for item in list { - total.appendInt16(item) - } total.addCrc() let sender = BleSender() sender.data = total sender.completion = { result in DCLogger.debug("\(result.description)") - if result.isSuccess{ - let value = UInt16(result.data[3].int) - DCLogger.debug(value) - finished(value == 0) - } - else{ - finished(false) - } } DCBleManager.shared.send(sender) } - } diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/DCMusic.swift b/DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/DCMusic.swift index e6d8925..554052f 100644 --- a/DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/DCMusic.swift +++ b/DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/DCMusic.swift @@ -4,6 +4,7 @@ // // Created by liangshi on 2025/12/17. // +import Foundation public class DCMusic:Codable{ /// id @@ -15,3 +16,259 @@ public class DCMusic:Codable{ /// 时长 public var dur = 0 } + +extension DCDevice{ + + public func getTotalMusic(finished:@escaping (Int?)->Void){ + var head: UInt8 = 0xBA + var cmd: UInt8 = 0x10 + var data:UInt8 = 0x08 + var total = Data() + total.append(&head, count: 1) + total.append(&cmd, count: 1) + total.append(&data, count: 1) + total.addCrc() + + let sender = BleSender() + sender.data = total + sender.completion = { result in + DCLogger.debug("\(result.description)") + if result.isSuccess{ + let value = result.data[3...4].int + DCLogger.debug(value) + finished(value) + } + else{ + finished(nil) + } + } + DCBleManager.shared.send(sender) + } + public func getMusicList(size:UInt8,index:UInt16,finished:@escaping ([DCMusic]?,Bool)->Void){ + var head: UInt8 = 0xBA + var cmd: UInt8 = 0x10 + var data:UInt8 = 0x01 + var pageSize = size + var total = Data() + total.append(&head, count: 1) + total.append(&cmd, count: 1) + total.append(&data, count: 1) + total.append(&pageSize, count: 1) + total.appendInt16(index) + total.addCrc() + + var totalList = [DCMusic]() + let sender = BleSender() + sender.data = total + sender.completion = { result in + DCLogger.debug("\(result.description)") + if result.isSuccess{ + //let data = DCBleManager.contentData(result.data) + if result.data.count <= 8{ + sender.deinitTimer() + sender.remove() + finished(nil,false) + return + } + + let index = result.data[4].int + let total = result.data[5].int + DCLogger.debug(total,index) + let data = result.data.subdata(in: 6..Void){ + var head: UInt8 = 0xBA + var cmd: UInt8 = 0x10 + var data:UInt8 = 0x02 + var mode:UInt8 = mode + var total = Data() + total.append(&head, count: 1) + total.append(&cmd, count: 1) + total.append(&data, count: 1) + total.append(&mode, count: 1) + total.addCrc() + + let sender = BleSender() + sender.data = total + sender.completion = { result in + DCLogger.debug("\(result.description)") + if result.isSuccess{ + let value = result.data[2].int + DCLogger.debug(value) + finished(value == 0) + } + else{ + finished(false) + } + } + DCBleManager.shared.send(sender) + } + public func getMusicPlayMode(finished:@escaping (UInt8?,Bool)->Void){ + var head: UInt8 = 0xBA + var cmd: UInt8 = 0x10 + var data:UInt8 = 0x03 + var content:UInt8 = 0x00 + var total = Data() + total.append(&head, count: 1) + total.append(&cmd, count: 1) + total.append(&data, count: 1) + total.append(&content, count: 1) + total.addCrc() + + let sender = BleSender() + sender.data = total + sender.completion = { result in + DCLogger.debug("\(result.description)") + if result.isSuccess{ + let value = UInt8(result.data[3].int) + DCLogger.debug(value) + finished(value,true) + } + else{ + finished(nil,false) + } + } + DCBleManager.shared.send(sender) + } + + public func musicPlay(index:UInt16?,finished:@escaping (UInt16?,Bool)->Void){ + if let index = index { + var head: UInt8 = 0xBA + var cmd: UInt8 = 0x10 + var data:UInt8 = 0x05 + + var total = Data() + total.append(&head, count: 1) + total.append(&cmd, count: 1) + total.append(&data, count: 1) + total.appendInt16(index) + total.addCrc() + + let sender = BleSender() + sender.data = total + sender.completion = { result in + DCLogger.debug("\(result.description)") + if result.isSuccess{ + let value = UInt16(result.data[3...4].int) + DCLogger.debug(value) + finished(value,true) + } + else{ + finished(nil,false) + } + } + DCBleManager.shared.send(sender) + } + else{ + var head: UInt8 = 0xBA + var cmd: UInt8 = 0x10 + var data:UInt8 = 0x04 + var content:UInt8 = 0x00 + + var total = Data() + total.append(&head, count: 1) + total.append(&cmd, count: 1) + total.append(&data, count: 1) + total.append(&content, count: 1) + total.addCrc() + + let sender = BleSender() + sender.data = total + sender.completion = { result in + DCLogger.debug("\(result.description)") + if result.isSuccess{ + let value = UInt16(result.data[3...4].int) + DCLogger.debug(value) + finished(value,true) + } + else{ + finished(nil,false) + } + } + DCBleManager.shared.send(sender) + } + } + public func musicPause(finished:@escaping (UInt16?,Bool)->Void){ + var head: UInt8 = 0xBA + var cmd: UInt8 = 0x10 + var data:UInt8 = 0x04 + var content:UInt8 = 0x01 + var total = Data() + total.append(&head, count: 1) + total.append(&cmd, count: 1) + total.append(&data, count: 1) + total.append(&content, count: 1) + total.addCrc() + + let sender = BleSender() + sender.data = total + sender.completion = { result in + DCLogger.debug("\(result.description)") + if result.isSuccess{ + let value = UInt16(result.data[3...4].int) + DCLogger.debug(value) + finished(value,true) + } + else{ + finished(nil,false) + } + } + DCBleManager.shared.send(sender) + } + public func musicDelete(list:[UInt16],finished:@escaping (Bool)->Void){ + var head: UInt8 = 0xBA + var cmd: UInt8 = 0x10 + var data:UInt8 = 0x07 + var content:UInt8 = UInt8(list.count) + var total = Data() + total.append(&head, count: 1) + total.append(&cmd, count: 1) + total.append(&data, count: 1) + total.append(&content, count: 1) + for item in list { + total.appendInt16(item) + } + total.addCrc() + + let sender = BleSender() + sender.data = total + sender.completion = { result in + DCLogger.debug("\(result.description)") + if result.isSuccess{ + let value = UInt16(result.data[3].int) + DCLogger.debug(value) + finished(value == 0) + } + else{ + finished(false) + } + } + DCBleManager.shared.send(sender) + } + +} diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/DCRecord.swift b/DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/DCPhoneRecord.swift similarity index 95% rename from DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/DCRecord.swift rename to DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/DCPhoneRecord.swift index b931197..0d37199 100644 --- a/DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/DCRecord.swift +++ b/DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/DCPhoneRecord.swift @@ -6,12 +6,12 @@ // import StarburstSdk -public class DCRecord { - public static let shared = DCRecord() +public class DCPhoneRecord { + public static let shared = DCPhoneRecord() /// 语⾔编码,默认为普通话(zh-CN),auto_lang自动识别 - public var fromLanguage:String = "" + public var fromLanguage:String = "zh-CN" /// ⽬标语⾔编码,默认为英语(en-US),auto_lang自动识别 - public var toLanguage:String = "" + public var toLanguage:String = "en-US" /// 是否翻译,默认false。如果为true翻译源语言和目标语言不能是同一种语言 public var isTranslate = false /// 是否进⾏Tts,默认false diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/StarburstSdk.framework/Headers/AIGCErrorCode.h b/DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/StarburstSdk.framework/Headers/AIGCErrorCode.h new file mode 100644 index 0000000..3e98131 --- /dev/null +++ b/DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/StarburstSdk.framework/Headers/AIGCErrorCode.h @@ -0,0 +1,19 @@ +/** + * 图片生成任务错误码枚举 + */ +typedef NS_ENUM(NSInteger, AIGCErrorCode) { + /// 未授权访问 + AIGCErrorUnauthorized = 401, + /// 调用次数或资源超出配额限制 + AIGCErrorQuotaExceeded = 4001, + /// 无效的参数(如宽高非法) + AIGCErrorInvalidParam = -1, + /// 网络连接失败 + AIGCErrorNetworkFailure = -2, + /// 任务已被取消 + AIGCErrorTaskCanceled = -3, + /// 查询任务状态超时 + AIGCErrorQueryTimeout = -4, + /// 未知错误 + AIGCErrorUnknown = 9000 +}; diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/StarburstSdk.framework/Headers/StarbaustVoiceChatModel.h b/DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/StarburstSdk.framework/Headers/StarbaustVoiceChatModel.h index 1b1e33e..e2b25cf 100644 --- a/DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/StarburstSdk.framework/Headers/StarbaustVoiceChatModel.h +++ b/DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/StarburstSdk.framework/Headers/StarbaustVoiceChatModel.h @@ -13,6 +13,7 @@ @property (nonatomic, strong) NSString *msg;/// 提示语 @property (nonatomic, strong) NSString *requestId;/// 请求id @property (nonatomic, assign) NSInteger dialogId;/// 对话id +@property (nonatomic, assign) BOOL isAsrFinish;/// 识别是否已结束 @property (nonatomic, strong) NSString *textResult;/// 语⾳识别结果⽚段内容 @property (nonatomic, strong) NSString *responseText;/// 响应结果⽚段内容 @property (nonatomic, strong) NSString *intent;/// 意图 @@ -23,6 +24,6 @@ @property (nonatomic, assign) BOOL conversationFinish;/// 对话是否结束 @property (nonatomic, strong) StarburstTranslateResult *translateResult;///翻译结果 @property (nonatomic, strong) StarburstAsrTtsResult *ttsResult;///tts音频流 - +@property (nonatomic, assign) NSInteger playAudioSampleRate; @end diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/StarburstSdk.framework/Headers/StarburstAsrConfig.h b/DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/StarburstSdk.framework/Headers/StarburstAsrConfig.h index 70275c1..c373b69 100644 --- a/DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/StarburstSdk.framework/Headers/StarburstAsrConfig.h +++ b/DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/StarburstSdk.framework/Headers/StarburstAsrConfig.h @@ -35,13 +35,44 @@ /// 手机录音asr配置 @interface StarburstAsrConfig : NSObject -@property (nonatomic, assign) BOOL isTranslate;/// 是否翻译,默认false。如果为true翻译源语言和目标语言不能是同一种语言 -@property (nonatomic, strong) NSString *fromLanguage;/// 语⾔编码,默认为普通话(zh-CN),auto_lang自动识别 -@property (nonatomic, strong) NSString *toLanguage;/// ⽬标语⾔编码,默认为英语(en-US),auto_lang自动识别 -@property (nonatomic, assign) BOOL isTTs;/// 是否进⾏Tts,默认false -@property (nonatomic, strong) NSString *ttsFormat;/// 默认pcm ⽀持pcm / ogg_opus / mp3 -@property (nonatomic, strong) NSString *ttsType;/// 默认只⽀持"stream", -@property (nonatomic, strong) NSString *ttsSpeaker;/// tts声⾊设置 +/// 是否翻译,默认 false。如果为 true 翻译源语言和目标语言不能是同一种语言 +@property (nonatomic, assign) BOOL isTranslate; +/// 源语言编码,默认为普通话(zh-CN),auto_lang 自动识别 +@property (nonatomic, strong) NSString *fromLanguage; +/// 目标语言编码,默认为英语(en-US),auto_lang 自动识别 +@property (nonatomic, strong) NSString *toLanguage; +/// 左声道源语言编码;如果不设置,则使用 fromLanguage +@property (nonatomic, strong, nullable) NSString *leftFromLanguage; +/// 左声道目标语言编码;如果不设置,则使用 toLanguage +@property (nonatomic, strong, nullable) NSString *leftToLanguage; + +/// 右声道源语言编码;如果不设置,则使用 fromLanguage +@property (nonatomic, strong, nullable) NSString *rightFromLanguage; +/// 右声道目标语言编码;如果不设置,则使用 toLanguage +@property (nonatomic, strong, nullable) NSString *rightToLanguage; + +/// 是否进行 TTS,默认 false +@property (nonatomic, assign) BOOL isTTs; +/// TTS 输出格式,默认 pcm,支持 pcm / ogg_opus / mp3 +@property (nonatomic, strong) NSString *ttsFormat; +/// TTS 类型,默认只支持 "stream" +@property (nonatomic, strong) NSString *ttsType; +/// TTS 声色设置 +@property (nonatomic, strong) NSString *ttsSpeaker; +/// 音频封装格式(opus 原始流 raw,封装 ogg) +@property (nonatomic, strong) NSString *format; +/// 音频编码格式(opus、raw) +@property (nonatomic, strong) NSString *codec; +/// Opus 输入包大小(字节数) +@property (nonatomic, assign) NSInteger opusInputPackageSize; +/// Opus 输出包大小(字节数) +@property (nonatomic, assign) NSInteger opusOutputPackageSize; +/// 音频采样率,单位 Hz(例如:16000 或 48000) +@property (nonatomic, assign) NSInteger sampleRate; +/// 声道数(1 单声道,2 立体声) +@property (nonatomic, assign) NSInteger channels; +/// 说话人分离 +@property (nonatomic, assign) BOOL isSpeakerSeparate; @end /// 蓝牙耳机录音asr配置 @@ -55,6 +86,14 @@ @property (nonatomic, strong) NSString *fromLanguage;/// 语⾔编码 @property (nonatomic, strong) NSString *toLanguage;/// ⽬标语⾔编码 @property (nonatomic, assign) BOOL summary;/// 是否进行总结,默认false +/// 是否区分说话人,默认 NO +@property (nonatomic, assign) BOOL speakerSeparate; +/// 是否启用 ITN(数值/时间等标准化) +@property (nonatomic, assign) BOOL enableItn; +/// 端点检测窗口大小(VAD 终点判定),与服务端约定 +//@property (nonatomic, assign) NSInteger endWindowSize; // endWindowSize +/// 翻译增强,默认 NO +@property (nonatomic, assign) BOOL enableTranslateImprove; // enableTranslateImprove @property (nonatomic, assign) BOOL speakerSplit;/// 是否区分说话人,默认false @end diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/StarburstSdk.framework/Headers/StarburstAsrModel.h b/DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/StarburstSdk.framework/Headers/StarburstAsrModel.h index e09478f..6946bcd 100644 --- a/DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/StarburstSdk.framework/Headers/StarburstAsrModel.h +++ b/DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/StarburstSdk.framework/Headers/StarburstAsrModel.h @@ -7,34 +7,54 @@ #import +NS_ASSUME_NONNULL_BEGIN + +/// 说话人分离结果(单段) +@interface StarburstSpeakerSegment : NSObject +@property (nonatomic, copy, nullable) NSString *speakerId; /// 说话人ID(字符串,如 "1") +@property (nonatomic, assign) NSInteger startTime; /// 起始时间(ms) +@property (nonatomic, assign) NSInteger endTime; /// 结束时间(ms) +@property (nonatomic, copy, nullable) NSString *text; /// 该段文本 +@property (nonatomic, assign) NSInteger definiteIndex; /// 该段确定序号 +/// 工厂方法 ++ (instancetype)modelWith:(NSDictionary *)dict; +@end + /// 翻译结果 @interface StarburstTranslateResult : NSObject -@property (nonatomic, strong) NSString *text;/// 语⾳识别后翻译的结果⽚段 -@property (nonatomic, assign) BOOL definite;/// 当前翻译⽚段是否确定 -@property (nonatomic, assign) int definiteIndex;/// 已翻译⽚段序号 +@property (nonatomic, copy, nullable) NSString *text; /// 语音识别后翻译的结果片段 +@property (nonatomic, assign) BOOL definite; /// 当前翻译片段是否确定 +@property (nonatomic, assign) int definiteIndex; /// 已翻译片段序号 +/// 工厂方法 ++ (instancetype)modelWith:(NSDictionary *)dict; @end /// tts音频流 @interface StarburstAsrTtsResult : NSObject -@property (nonatomic, assign) NSInteger index;/// 音频数据⽚段的序号 -@property (nonatomic, assign) NSInteger translateIndex;/// 翻译的序号 -@property (nonatomic, strong) NSString *streamPiece;/// 音频流 +@property (nonatomic, assign) NSInteger index; /// 音频数据片段的序号 +@property (nonatomic, assign) NSInteger translateIndex; /// 翻译的序号 +@property (nonatomic, copy, nullable) NSString *streamPiece; /// 音频流(Base64/文本) ++ (instancetype)modelWith:(NSDictionary *)dict; @end - /// 识别结果 @interface StarburstAsrModel : NSObject -@property (nonatomic, assign) NSInteger channel;/// 0非立体声,1左声道,2右声道 -@property (nonatomic, assign) NSInteger code;/// 状态码 -@property (nonatomic, strong) NSString *msg;/// 提示语 -@property (nonatomic, strong) NSString *requestId;/// 请求id -@property (nonatomic, strong) NSString *textResult;/// 语⾳识别结果⽚段内容 -@property (nonatomic, assign) NSInteger sequence;/// 响应的编号 -@property (nonatomic, assign) BOOL definite;/// 语⾳识别结果⽚段是否已确定,后序不会有变化 -@property (nonatomic, assign) NSInteger definiteIndex;/// 已确定的识别结果序列号 -@property (nonatomic, strong) StarburstTranslateResult *translateResult;///翻译结果 -@property (nonatomic, strong) StarburstAsrTtsResult *ttsResult;///tts音频流 - -+ (StarburstAsrModel *)modelWith:(NSDictionary *)dict; +@property (nonatomic, assign) NSInteger channel; /// 0非立体声,1左声道,2右声道 +@property (nonatomic, assign) NSInteger code; /// 状态码 +@property (nonatomic, copy, nullable) NSString *msg; /// 提示语 +@property (nonatomic, copy, nullable) NSString *requestId; /// 请求id +@property (nonatomic, copy, nullable) NSString *textResult; /// 语音识别结果片段内容 +@property (nonatomic, assign) NSInteger sequence; /// 响应的编号 +@property (nonatomic, assign) BOOL definite; /// 语音识别结果片段是否已确定,后序不会有变化 +@property (nonatomic, assign) NSInteger definiteIndex; /// 已确定的识别结果序列号 +@property (nonatomic, assign) BOOL isLastPackage; /// 是否为最后一包,后续没有数据(包括asr、tts、翻译结果) + +@property (nonatomic, strong, nullable) StarburstTranslateResult *translateResult; /// 翻译结果 +@property (nonatomic, strong, nullable) StarburstAsrTtsResult *ttsResult; /// tts音频流 + +@property (nonatomic, copy, nullable) NSArray *speakerResult; /// 说话人分离结果数组 + ++ (instancetype)modelWith:(NSDictionary *)dict; @end +NS_ASSUME_NONNULL_END diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/StarburstSdk.framework/Headers/StarburstConfig.h b/DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/StarburstSdk.framework/Headers/StarburstConfig.h index 9b4dd0a..6d5cf98 100644 --- a/DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/StarburstSdk.framework/Headers/StarburstConfig.h +++ b/DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/StarburstSdk.framework/Headers/StarburstConfig.h @@ -8,11 +8,11 @@ #import typedef NS_OPTIONS(NSInteger,StarburstSdkType) { - StarburstSdkType_Ble = 1,/// 设备鉴权+设备拾音 - StarburstSdkType_Phone = 2,/// 账号鉴权+手机拾音 - StarburstSdkType_Mix = 3,/// 设备鉴权+手机拾音 - StarburstSdkType_Glasses_Ble = 4,/// 眼镜板+设备鉴权 - StarburstSdkType_Glasses_Account = 5,/// 眼镜板+账号鉴权 + StarburstSdkType_Ble = 1,/// 设备鉴权+设备拾音(对话sdk内部封装耳机录音ble传输) + StarburstSdkType_Phone = 2,/// 账号鉴权+手机拾音(对话sdk内部封装手机录音) + StarburstSdkType_Mix = 3,/// 设备鉴权+手机拾音(对话sdk内部封装手机录音) + StarburstSdkType_Glasses_Ble = 4,/// 眼镜板+设备鉴权(对话需要外部喂音频流) + StarburstSdkType_Glasses_Account = 5,/// 眼镜板+账号鉴权(对话需要外部喂音频流) }; @@ -24,10 +24,12 @@ typedef NS_OPTIONS(NSInteger,StarburstSdkType) { @property (nonatomic, strong)NSString *sdkFolder;/// sdk路径,可以自定义 @property (nonatomic, strong)NSDictionary *debugInfo;/// 调试信息 @property (nonatomic, strong)NSString *user_custom_prompt_init;/// voicechat配置 +@property (nonatomic, assign) CGFloat ttsSpeed;//默认1.0,范围[0.8,2] @property (nonatomic, assign)BOOL enableEarbudsSwitchSync;/// 主从耳机切换是否同步sdk信息到耳机,默认false @property (nonatomic, assign)BOOL enableTextSyncToDevice;/// 是否下发文字到耳机仓,默认false @property (nonatomic, assign)BOOL enableEmotionSyncToDevice;/// 耳机仓表情下发开关,默认false +@property (nonatomic, assign)BOOL enableSpeakerSeparate;/// 是否开启人话分离,默认false @property (nonatomic, assign)NSInteger callRecordChannel;/// 通话录音声道数。1:单声道 ;2:⽴体声;默认单声道 //enableExternalOpusDecoder @property (nonatomic, strong)NSString *appId;/// 分配的id diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/StarburstSdk.framework/Headers/StarburstPhoneSdk.h b/DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/StarburstSdk.framework/Headers/StarburstPhoneSdk.h index 903da21..f98d250 100644 --- a/DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/StarburstSdk.framework/Headers/StarburstPhoneSdk.h +++ b/DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/StarburstSdk.framework/Headers/StarburstPhoneSdk.h @@ -104,7 +104,7 @@ /// - voiceCallBack: AI语音回复回调 /// - stateChange: 状态回调 /// - finished:录音地址回调 -- (void)setupPhoneChatWith:(StarburstVoiceChatConfig*)config start:(void (^)(NSInteger dialogId))startCallback textCallback:(void (^)(StarbaustVoiceChatModel*))textCallBack responseVoice:(void (^)(NSInteger dialogId,NSData*data,BOOL finish))voiceCallBack stateChange:(void(^)(StarburstCode code))stateChange finished:(void(^)(NSString *filePath))path; +- (void)setupPhoneChatWith:(StarburstVoiceChatConfig*)config start:(void (^)(NSInteger dialogId))startCallback textCallback:(void (^)(StarbaustVoiceChatModel*))textCallBack responseVoice:(void (^)(NSInteger dialogId,NSData*data,BOOL finish,NSInteger sampleRate))voiceCallBack stateChange:(void(^)(StarburstCode code))stateChange finished:(void(^)(NSString *filePath))path; /// 手机拾音,开始对话 /// - Parameter vadType: 0 vad检测,1不启用vad(手动控制开始/结束讲话) diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/StarburstSdk.framework/Headers/StarburstSdk.h b/DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/StarburstSdk.framework/Headers/StarburstSdk.h index 422071c..fb26542 100644 --- a/DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/StarburstSdk.framework/Headers/StarburstSdk.h +++ b/DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/StarburstSdk.framework/Headers/StarburstSdk.h @@ -29,4 +29,8 @@ #import #import #import - +#import +#import +#import +#import +#import diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/StarburstSdk.framework/Headers/StarburstSdkManager.h b/DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/StarburstSdk.framework/Headers/StarburstSdkManager.h index 94af429..1aa3a71 100644 --- a/DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/StarburstSdk.framework/Headers/StarburstSdkManager.h +++ b/DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/StarburstSdk.framework/Headers/StarburstSdkManager.h @@ -28,6 +28,9 @@ typedef NS_OPTIONS(NSInteger,StarburstCode) { StarburstCode_UnAuth = 60000,///未鉴权 }; +typedef void (^AudioIntensityInputCallback)(NSArray *left, + NSArray *right, + NSTimeInterval timestampMs); @interface StarburstSdk : NSObject //@property (nonatomic, strong)void (^authSuccessCallback)(void);/// 鉴权成功回调 @@ -100,6 +103,22 @@ typedef NS_OPTIONS(NSInteger,StarburstCode) { /// - Parameter fileCallback: 录音文件回调 - (void)stopRecordAsr:(void(^)(NSString *filePath))callback; +/// 【自定义音频流识别】开始 +/// - Parameters: +/// - config: ASR识别配置(和手机拾音配置一致) +/// - recognize: 文本识别结果回调 +/// - stateChange: 状态变化回调 +- (void)startCustomAsr:(StarburstAsrConfig*)config + recognizeText:(void (^)(StarburstAsrModel *model))recognize + stateChange:(void(^)(StarburstCode code))stateChange; + +/// 【自定义音频流识别】发送音频数据 +/// - Parameter data: 外部采集的音频 PCM 或其他格式(根据 config 设定) +- (void)sendCustomAudioData:(NSData *)data; + +/// 【自定义音频流识别】结束 +- (void)stopCustomAsr; + /// 开始耳机拾音 /// - Parameters: /// - config: 识别配置 @@ -141,7 +160,7 @@ typedef NS_OPTIONS(NSInteger,StarburstCode) { /// - voiceCallBack: AI语音回复回调 /// - stateChange: 状态回调 /// - finished:录音地址回调 -- (void)setupVoiceChatWith:(StarburstVoiceChatConfig*)config start:(void (^)(NSInteger dialogId))startCallback textCallback:(void (^)(StarbaustVoiceChatModel*))textCallBack responseVoice:(void (^)(NSInteger dialogId,NSData*data,BOOL finish))voiceCallBack stateChange:(void(^)(StarburstCode code))stateChange finished:(void(^)(NSString *filePath))path; +- (void)setupVoiceChatWith:(StarburstVoiceChatConfig*)config start:(void (^)(NSInteger dialogId))startCallback textCallback:(void (^)(StarbaustVoiceChatModel*))textCallBack responseVoice:(void (^)(NSInteger dialogId,NSData*data,BOOL finish, NSInteger sampleRate))voiceCallBack stateChange:(void(^)(StarburstCode code))stateChange finished:(void(^)(NSString *filePath))path; /// 终止voice chat对话 - (void)stopVoiceChat:(NSInteger)dialogId; @@ -152,11 +171,15 @@ typedef NS_OPTIONS(NSInteger,StarburstCode) { /// 结束播放tts - (void)stopPlayTtsAudio:(NSInteger)dialogId; - +/// 发送文字对话 +/// - Parameters: +/// - text: 对话的文字 +/// - isTts: 是否tts +- (void)sendVoiceChat:(NSString *)text tts:(BOOL)isTts; //不可用 -- (void)setupPhoneChatWith:(StarburstVoiceChatConfig*)config start:(void (^)(NSInteger dialogId))startCallback textCallback:(void (^)(StarbaustVoiceChatModel*))textCallBack responseVoice:(void (^)(NSInteger dialogId,NSData*data,BOOL finish))voiceCallBack stateChange:(void(^)(StarburstCode code))stateChange finished:(void(^)(NSString *filePath))path; +- (void)setupPhoneChatWith:(StarburstVoiceChatConfig*)config start:(void (^)(NSInteger dialogId))startCallback textCallback:(void (^)(StarbaustVoiceChatModel*))textCallBack responseVoice:(void (^)(NSInteger dialogId,NSData*data,BOOL finish,NSInteger sampleRate))voiceCallBack stateChange:(void(^)(StarburstCode code))stateChange finished:(void(^)(NSString *filePath))path; //不可用 - (void)startPhoneChat:(int)vadType; //不可用 @@ -165,5 +188,8 @@ typedef NS_OPTIONS(NSInteger,StarburstCode) { - (void)registerWithProductKey:(NSString *)productKey productSecret:(NSString *)productSecret deviceName:(NSString *)deviceName random:(NSString *)random finished:(void (^)(NSString *deviceSecret,NSError *error))finished; //不可用 - (void)connectWithProductKey:(NSString *)productKey deviceName:(NSString *)deviceName deviceSecret:(NSString *)deviceSecret finished:(void (^)(BOOL isSuccess,NSError *error))finished; +- (void)setInputAudioIntensityCallback:(AudioIntensityInputCallback)callback; + +-(NSString *)getDeviceName; @end diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/StarburstSdk.framework/Headers/StartburstGlassChat.h b/DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/StarburstSdk.framework/Headers/StartburstGlassChat.h index 3df995d..e3f6a1b 100644 --- a/DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/StarburstSdk.framework/Headers/StartburstGlassChat.h +++ b/DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/StarburstSdk.framework/Headers/StartburstGlassChat.h @@ -20,7 +20,7 @@ /// - voiceCallBack: AI语音回复回调 /// - stateChange: 状态回调 /// - finished:录音地址回调 -- (void)setupPhoneChatWith:(StarburstVoiceChatConfig*)config textCallback:(void (^)(StarbaustVoiceChatModel*))textCallBack responseVoice:(void (^)(NSInteger dialogId,NSData*data,BOOL finish))voiceCallBack stateChange:(void(^)(StarburstCode code))stateChange finished:(void(^)(NSString *filePath))path; +- (void)setupPhoneChatWith:(StarburstVoiceChatConfig*)config textCallback:(void (^)(StarbaustVoiceChatModel*))textCallBack responseVoice:(void (^)(NSInteger dialogId,NSData*data,BOOL finish,NSInteger sampleRate))voiceCallBack stateChange:(void(^)(StarburstCode code))stateChange finished:(void(^)(NSString *filePath))path; /// 开始对话 - (void)start; diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/StarburstSdk.framework/Headers/StartburstGlassesSdk.h b/DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/StarburstSdk.framework/Headers/StartburstGlassesSdk.h index 862a1a2..e3f6eba 100644 --- a/DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/StarburstSdk.framework/Headers/StartburstGlassesSdk.h +++ b/DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/StarburstSdk.framework/Headers/StartburstGlassesSdk.h @@ -101,6 +101,18 @@ /// - Parameter fileCallback: 录音文件回调 - (void)stopRecordAsr:(void(^)(NSString *filePath))fileCallback; + +/// 开始自定义音频流识别 +- (void)startCustomAsr:(StarburstAsrConfig*)config + recognizeText:(void (^)(StarburstAsrModel *model))recognize + stateChange:(void(^)(StarburstCode code))stateChange; + +/// 发送一段自定义音频数据(采样率、格式需匹配 config 设定) +- (void)sendCustomAudioData:(NSData *)data; + +/// 停止自定义音频流识别 +- (void)stopCustomAsr; + /// 获取音色列表 /// - Parameter callBack: 结果回调 - (void)getVcSpeekerList:(void (^)(NSArray *list,BOOL success))callBack; diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/StarburstSdk.framework/Headers/StartburstMixSdk.h b/DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/StarburstSdk.framework/Headers/StartburstMixSdk.h index aa4ba37..456b341 100644 --- a/DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/StarburstSdk.framework/Headers/StartburstMixSdk.h +++ b/DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/StarburstSdk.framework/Headers/StartburstMixSdk.h @@ -92,7 +92,7 @@ /// - voiceCallBack: AI语音回复回调 /// - stateChange: 状态回调 /// - finished:录音地址回调 -- (void)setupPhoneChatWith:(StarburstVoiceChatConfig*)config start:(void (^)(NSInteger dialogId))startCallback textCallback:(void (^)(StarbaustVoiceChatModel*))textCallBack responseVoice:(void (^)(NSInteger dialogId,NSData*data,BOOL finish))voiceCallBack stateChange:(void(^)(StarburstCode code))stateChange finished:(void(^)(NSString *filePath))path; +- (void)setupPhoneChatWith:(StarburstVoiceChatConfig*)config start:(void (^)(NSInteger dialogId))startCallback textCallback:(void (^)(StarbaustVoiceChatModel*))textCallBack responseVoice:(void (^)(NSInteger dialogId,NSData*data,BOOL finish, NSInteger sampleRate))voiceCallBack stateChange:(void(^)(StarburstCode code))stateChange finished:(void(^)(NSString *filePath))path; /// 手机拾音,开始对话 diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/StarburstSdk.framework/Headers/TextToImageCallback.h b/DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/StarburstSdk.framework/Headers/TextToImageCallback.h new file mode 100644 index 0000000..f5e9bfe --- /dev/null +++ b/DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/StarburstSdk.framework/Headers/TextToImageCallback.h @@ -0,0 +1,51 @@ +#import +#import + +/** + * 文本生成图片回调协议 + * + * 实现此协议可接收任务创建、进度、成功、失败、取消等事件。 + */ +@protocol TextToImageCallback + +/** + * 当任务创建成功时触发 + * + * @param taskId 唯一任务标识 + */ +- (void)onCreated:(NSString *)taskId; + +/** + * 当任务处于进行状态时触发 + * + * @param taskId 任务标识 +*/ +- (void)onProcessing:(NSString *)taskId; + + +/** + * 当任务成功生成图片时触发 + * + * @param taskId 任务标识 + * @param images 生成图片的 URL 数组(NSString 类型) + */ +- (void)onSuccess:(NSString *)taskId images:(NSArray *)images; + +/** + * 当任务发生错误时触发 + * + * @param taskId 任务标识 + * @param code 错误码(AIGCErrorCode) + * @param message 错误说明 + */ +- (void)onError:(NSString *)taskId code:(AIGCErrorCode)code message:(NSString *)message; + +/** + * 当任务被取消时触发 + * + * @param taskId 任务标识 + * @param success YES 表示取消成功,NO 表示取消失败 + */ +- (void)onCanceled:(NSString *)taskId success:(BOOL)success; + +@end diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/StarburstSdk.framework/Headers/TextToImageManager.h b/DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/StarburstSdk.framework/Headers/TextToImageManager.h new file mode 100644 index 0000000..e2c3811 --- /dev/null +++ b/DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/StarburstSdk.framework/Headers/TextToImageManager.h @@ -0,0 +1,73 @@ +#import +#import + +NS_ASSUME_NONNULL_BEGIN + +@interface TextToImageManager : NSObject + +/** + * 获取单例实例 + * + * @return TextToImageManager 单例对象 + */ ++ (instancetype)sharedInstance; + +/** + * 创建图片生成任务并自动轮询任务状态直到完成 + * + * @param prompt 文本提示词,例如“阳光下的海边风景” + * @param imageCount 生成的图片数量,建议范围 1~4 + * @param imageWidth 生成图片的宽度(像素) + * @param imageHeight 生成图片的高度(像素) + * @param callback 实现了 TextToImageCallback 协议的回调对象,用于接收任务事件 + * + * @discussion 调用此方法会创建任务并自动定时查询任务进度, + * 直到任务完成(成功或失败)或被取消。 + */ +- (void)startTextToImage:(NSString *)prompt + imageCount:(NSInteger)imageCount + imageWidth:(NSInteger)imageWidth + imageHeight:(NSInteger)imageHeight + callback:(id)callback + NS_SWIFT_NAME(startTextToImage(prompt:imageCount:imageWidth:imageHeight:callback:)); + +/** + * 按任务 ID 持续轮询任务状态 + * + * @param taskId 已创建任务的唯一标识 + * @param callback 回调对象,用于接收任务状态和结果 + * + * @discussion 会持续查询任务状态直到任务完成,不会重新创建任务。 + */ +- (void)queryByTaskId:(NSString *)taskId callback:(id)callback; + +/** + * 按任务 ID 查询一次任务状态 + * + * @param taskId 已创建任务的唯一标识 + * @param callback 回调对象 + * + * @discussion 与 queryByTaskId 不同,此方法只查询一次,不进行持续轮询。 + */ +- (void)queryOnceByTaskId:(NSString *)taskId + callback:(id)callback + NS_SWIFT_NAME(queryOnceByTaskId(_:callback:)); + +/** + * 取消指定的图片生成任务 + * + * @param taskId 要取消的任务 ID + */ +- (void)cancelTextToImage:(NSString *)taskId; + +/** + * 取消所有正在运行的图片生成任务 + */ +- (void)cancelAllTasks; + +/// 释放全部资源(不取消正运行任务) +- (void)releaseResources; + +@end + +NS_ASSUME_NONNULL_END diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/StarburstSdk.framework/Headers/TextToSpeechCallback.h b/DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/StarburstSdk.framework/Headers/TextToSpeechCallback.h new file mode 100644 index 0000000..de8d95c --- /dev/null +++ b/DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/StarburstSdk.framework/Headers/TextToSpeechCallback.h @@ -0,0 +1,37 @@ +#import + +/** + * 文本转语音回调协议 + * + * 客户端实现此协议,用于接收 TTS(Text To Speech)服务的结果或错误信息。 + */ +@protocol TextToSpeechCallback + +@required + +/** + * 当云端成功返回语音数据(或语音下载地址等)时回调 + * + * @param response 云端返回的完整响应字符串,通常为 JSON 格式或语音文件的 URL。 + * + * @discussion 调用方可以在此方法中解析响应内容,例如: + * - 获取语音文件下载地址 + * - 获取 Base64 编码的音频数据 + */ +- (void)onResult:(NSString *)response; + +/** + * 当调用 TTS 服务发生错误时回调 + * + * @param code 错误码(整数),具体含义由服务端定义 + * @param message 错误提示信息,便于问题排查 + * + * @discussion 常见错误: + * - 网络连接失败 + * - 请求参数错误 + * - 服务端内部错误 + * - 授权失败 + */ +- (void)onError:(NSInteger)code message:(NSString *)message; + +@end diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/StarburstSdk.framework/Headers/TextToSpeechManager.h b/DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/StarburstSdk.framework/Headers/TextToSpeechManager.h new file mode 100644 index 0000000..81ae05c --- /dev/null +++ b/DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/StarburstSdk.framework/Headers/TextToSpeechManager.h @@ -0,0 +1,51 @@ +#import +#import + +NS_ASSUME_NONNULL_BEGIN + +/** + * 文本转语音管理器 + * + * 封装了调用云端 TTS(Text To Speech)接口的过程, + * 支持设置语速、音色等参数,将文本合成成语音数据。 + */ +@interface TextToSpeechManager : NSObject + +/** + * 获取单例对象 + * + * @return TextToSpeechManager 单例实例 + * + * @discussion 建议全局共享此管理器实例,避免重复创建和释放网络资源。 + */ ++ (instancetype)sharedInstance; + +/** + * 调用文本转语音服务 + * + * @param companyId 企业或应用 ID(由服务方分配,用于鉴权) + * @param text 待合成的文本内容 + * @param reqId 请求唯一标识,用于排查日志或防重复请求 + * @param speedRatio 合成语音的语速倍率(1.0 为正常语速,>1.0 为加快,<1.0 为减慢) + * @param voiceType 音色类型标识(例如 "zh_female_qingchezizi_moon_bigtts") + * @param encoding 音频编码格式(如 "pcm"、"mp3"、"wav"),可为 nil 使用默认编码 + * @param callback 回调对象,须实现 TextToSpeechCallback 协议,用于接收结果或错误 + * + * @discussion 此方法会向云端发送 TTS 请求,云端返回后通过 callback 通知调用方。 + * 建议: + * - 确保 text 不超过服务端最大长度限制 + * - speedRatio 和 voiceType 需符合云端支持范围 + * - callback 在主线程回调,可直接更新 UI 或播放音频 + */ +- (void)textToSpeech:(NSString *)companyId + text:(NSString *)text + reqId:(NSString *)reqId + speedRatio:(float)speedRatio + voiceType:(NSString *)voiceType + encoding:(nullable NSString *)encoding + callback:(id)callback +NS_SWIFT_NAME(textToSpeech(companyId:text:reqId:speedRatio:voiceType:encoding:callback:)); + +@end + +NS_ASSUME_NONNULL_END diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/StarburstSdk.framework/Info.plist b/DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/StarburstSdk.framework/Info.plist index 5d0891e..5cd3e36 100644 Binary files a/DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/StarburstSdk.framework/Info.plist and b/DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/StarburstSdk.framework/Info.plist differ diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/StarburstSdk.framework/StarburstSdk b/DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/StarburstSdk.framework/StarburstSdk index 0444933..fed75fa 100644 Binary files a/DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/StarburstSdk.framework/StarburstSdk and b/DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/StarburstSdk.framework/StarburstSdk differ diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/StarburstSdk.framework/_CodeSignature/CodeDirectory b/DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/StarburstSdk.framework/_CodeSignature/CodeDirectory index ccd2d67..0cc28a0 100644 Binary files a/DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/StarburstSdk.framework/_CodeSignature/CodeDirectory and b/DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/StarburstSdk.framework/_CodeSignature/CodeDirectory differ diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/StarburstSdk.framework/_CodeSignature/CodeRequirements b/DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/StarburstSdk.framework/_CodeSignature/CodeRequirements index c528e57..4b131e2 100644 Binary files a/DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/StarburstSdk.framework/_CodeSignature/CodeRequirements and b/DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/StarburstSdk.framework/_CodeSignature/CodeRequirements differ diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/StarburstSdk.framework/_CodeSignature/CodeRequirements-1 b/DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/StarburstSdk.framework/_CodeSignature/CodeRequirements-1 index 07e5514..b5e14ee 100644 Binary files a/DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/StarburstSdk.framework/_CodeSignature/CodeRequirements-1 and b/DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/StarburstSdk.framework/_CodeSignature/CodeRequirements-1 differ diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/StarburstSdk.framework/_CodeSignature/CodeResources b/DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/StarburstSdk.framework/_CodeSignature/CodeResources index 040d597..17c777d 100644 --- a/DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/StarburstSdk.framework/_CodeSignature/CodeResources +++ b/DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/StarburstSdk.framework/_CodeSignature/CodeResources @@ -4,21 +4,25 @@ files + Headers/AIGCErrorCode.h + + 6X+BFAl1GUlE673wijlbbmSDK7o= + Headers/StarbaustVoiceChatModel.h - I6GwpMWb210AbU3/v9YLrfddoEA= + O8K7t0c5zyFzqsMRLB06Q9rMy98= Headers/StarburstAsrConfig.h - O5iJsUMPvwiRYlgGCgXp4TmAllQ= + tSk0X4yTu1hQB88SVtxWkHcfTRY= Headers/StarburstAsrModel.h - iiw2ZgUm4OBP2p0P0RSXd6gOwBY= + YMyp9i53bEO3diakJf+v5x2v2a0= Headers/StarburstConfig.h - /Bp9QOl1Vlv/1q1uwSh5zjn5IPA= + s3KYCCc8Cq0RWmlyfW7qe20T0c8= Headers/StarburstFileAsrModel.h @@ -30,15 +34,15 @@ Headers/StarburstPhoneSdk.h - Qyvk+mUwCA6e59P6MqEGlKXAoV4= + rwT9UO4f4YJAdgYM9SUrQo6cW0M= Headers/StarburstSdk.h - UXMAS15KF45xW0cc4/2dI4vQTCQ= + aWY4JErrzMt9gCv0UqKyp5t+qGM= Headers/StarburstSdkManager.h - SO4o81CoyyO4XOPAsZo1GUvl1p4= + qhZrrBq0fWMMexpfZdAUj4ZVVNg= Headers/StarburstStreamModel.h @@ -54,19 +58,35 @@ Headers/StartburstGlassChat.h - utqD1cN73IP2Kj6ThbunMmpf3S8= + EKmAva0NghWkD5BgB3v2JyOqcQo= Headers/StartburstGlassesSdk.h - PWqGuJ/I4XGFgkETcPBwQWnDEzg= + zjj7I7WFlFcTzkseAMNaUZyEIyI= Headers/StartburstMixSdk.h - bemNunuDBWDRu5cPpr/qtzb51HE= + CLg1FGxHPySPI5qCJH4N1zAZIw4= + + Headers/TextToImageCallback.h + + djrQqQ5J0JGsXn7fyLOzs0g705Q= + + Headers/TextToImageManager.h + + f7vVMHfHHqbi4Bi4seJMqHn4wnU= + + Headers/TextToSpeechCallback.h + + Q6/osX2ZUFgH9dbRA17GNlOraXI= + + Headers/TextToSpeechManager.h + + /j5GzHn6HDrV0eCdlQiwGi65QEQ= Info.plist - TbwY6qSKiZSNAQ4zKoI1WNFwZSA= + LYDkUlG3+K2ItUesIisY3Luuk1c= Modules/module.modulemap @@ -79,48 +99,59 @@ files2 + Headers/AIGCErrorCode.h + + hash + + 6X+BFAl1GUlE673wijlbbmSDK7o= + + hash2 + + kB/hT+CxZkfSQW7qym0IydflbAkE3AYBvdij+bCDmlw= + + Headers/StarbaustVoiceChatModel.h hash - I6GwpMWb210AbU3/v9YLrfddoEA= + O8K7t0c5zyFzqsMRLB06Q9rMy98= hash2 - 1h090jtb3WRV25cr3cYc+NPRWUvlbO3j4QqjmThCV9c= + Te3DhLKFm7g9Cqh68BOLUikve5gURqN9RWUPumoYzZY= Headers/StarburstAsrConfig.h hash - O5iJsUMPvwiRYlgGCgXp4TmAllQ= + tSk0X4yTu1hQB88SVtxWkHcfTRY= hash2 - 9ieYYQ/XtFmG0peIjWVyt2juVka68xC3vcJqEwQ8qHM= + EY1t77d6qelm3wi1yYEcG5Kw1HNnR8mziKSGBadmqOg= Headers/StarburstAsrModel.h hash - iiw2ZgUm4OBP2p0P0RSXd6gOwBY= + YMyp9i53bEO3diakJf+v5x2v2a0= hash2 - 4P7mnRJalvX4ISPvk5QKj1CSZ762p7L8HNbs3dIVa9A= + r5bjhqHYbfX3MyhkjDOmAbqeXjuBI9fSoQRq/L0POEU= Headers/StarburstConfig.h hash - /Bp9QOl1Vlv/1q1uwSh5zjn5IPA= + s3KYCCc8Cq0RWmlyfW7qe20T0c8= hash2 - JMBJ67zUYPjxdjB6vpgfPtv5P5iPeEVIzIvo6tnFAmo= + q5+7n+PJt+RNcfGHp6EMO49CqhiFTaqcIZQbeDtZcTk= Headers/StarburstFileAsrModel.h @@ -149,33 +180,33 @@ hash - Qyvk+mUwCA6e59P6MqEGlKXAoV4= + rwT9UO4f4YJAdgYM9SUrQo6cW0M= hash2 - U7UlFVbYvM2vSO810pr82LySA9HeLA4uMBh6PnCY5aE= + kAdf5gAAX2xUk1XeiyxZjeGRvGhNe10TZexUz4PhxWU= Headers/StarburstSdk.h hash - UXMAS15KF45xW0cc4/2dI4vQTCQ= + aWY4JErrzMt9gCv0UqKyp5t+qGM= hash2 - OT9NyhWFaPzjchBx437Llm8zPGQdOJ1e/F2dRGEQEN8= + rnnCMlslMnwvphEZDLtWFp+XfQ1GqRFbhT7jnUVbBV4= Headers/StarburstSdkManager.h hash - SO4o81CoyyO4XOPAsZo1GUvl1p4= + qhZrrBq0fWMMexpfZdAUj4ZVVNg= hash2 - zYNzKgVctWkBxMvEJoFC+QgA9HMqVHL4rZ0ID3ef1/0= + J/65oVgQZfwUd8TWmGj/cvoeb7k9t79kPFQCeVGYRIQ= Headers/StarburstStreamModel.h @@ -215,33 +246,77 @@ hash - utqD1cN73IP2Kj6ThbunMmpf3S8= + EKmAva0NghWkD5BgB3v2JyOqcQo= hash2 - VaH6J5gUMxZ8Whr9yIF3iefTz8SKIWwpyY9dq3mMWYk= + YIfvJ+AmQws0QANocYZxmOahypPKgbsEZXeR6wEInTA= Headers/StartburstGlassesSdk.h hash - PWqGuJ/I4XGFgkETcPBwQWnDEzg= + zjj7I7WFlFcTzkseAMNaUZyEIyI= hash2 - Kql2VWlouLzv+FTfPR9+WlIFxgJUw4NpHhMzCTfAz8o= + h+sX2xVUY3pWvU9949WQN6IoZau4WG4Ad1qRwJeC6Yk= Headers/StartburstMixSdk.h hash - bemNunuDBWDRu5cPpr/qtzb51HE= + CLg1FGxHPySPI5qCJH4N1zAZIw4= + + hash2 + + Z6H7+vUoMzMfpR9r7joECzicS9kOX4b/rqZb0fOMoaU= + + + Headers/TextToImageCallback.h + + hash + + djrQqQ5J0JGsXn7fyLOzs0g705Q= + + hash2 + + q/BtJzWpEpHfy9C5Bf07jUccilYQqgy94yGf3KLWwKM= + + + Headers/TextToImageManager.h + + hash + + f7vVMHfHHqbi4Bi4seJMqHn4wnU= + + hash2 + + N96kZDSkodLOSzvpZTi6amQVAYq0AzsFO6tvFFlQEoE= + + + Headers/TextToSpeechCallback.h + + hash + + Q6/osX2ZUFgH9dbRA17GNlOraXI= + + hash2 + + EXuN8dBBPFNJNuxSb0kaSfMs+i0WbS/9uA9tJ95RhlY= + + + Headers/TextToSpeechManager.h + + hash + + /j5GzHn6HDrV0eCdlQiwGi65QEQ= hash2 - S6yNxpkYJSgoOVUAyuIhC8ourDLd4Pu6tKFnRkM+Me0= + ikdltWnYn+xcIZztjJovnuoIDocq2Zwz81BLGh2HmZM= Modules/module.modulemap diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/StarburstSdk.framework/_CodeSignature/CodeSignature b/DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/StarburstSdk.framework/_CodeSignature/CodeSignature index b0642f2..cf66e23 100644 Binary files a/DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/StarburstSdk.framework/_CodeSignature/CodeSignature and b/DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/StarburstSdk.framework/_CodeSignature/CodeSignature differ diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Example/Example/VC/AppDelegate.swift b/DeepChordsSdk_iOS/DeepChordsSdk/Example/Example/AppDelegate.swift similarity index 100% rename from DeepChordsSdk_iOS/DeepChordsSdk/Example/Example/VC/AppDelegate.swift rename to DeepChordsSdk_iOS/DeepChordsSdk/Example/Example/AppDelegate.swift diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Example/Example/VC/SceneDelegate.swift b/DeepChordsSdk_iOS/DeepChordsSdk/Example/Example/SceneDelegate.swift similarity index 98% rename from DeepChordsSdk_iOS/DeepChordsSdk/Example/Example/VC/SceneDelegate.swift rename to DeepChordsSdk_iOS/DeepChordsSdk/Example/Example/SceneDelegate.swift index 4922e1a..5c01cf8 100644 --- a/DeepChordsSdk_iOS/DeepChordsSdk/Example/Example/VC/SceneDelegate.swift +++ b/DeepChordsSdk_iOS/DeepChordsSdk/Example/Example/SceneDelegate.swift @@ -19,7 +19,7 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate { guard let _ = (scene as? UIWindowScene) else { return } App.shared.window = window window?.rootViewController = UINavigationController(rootViewController: DeviceListVC()) - DeepChordsAiSdk.shared.initSDK() + DCSdkManager.shared.initSdk() } func sceneDidDisconnect(_ scene: UIScene) { diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Example/Example/VC/ChatVC.swift b/DeepChordsSdk_iOS/DeepChordsSdk/Example/Example/VC/ChatVC.swift index 8e663c6..eb6b763 100644 --- a/DeepChordsSdk_iOS/DeepChordsSdk/Example/Example/VC/ChatVC.swift +++ b/DeepChordsSdk_iOS/DeepChordsSdk/Example/Example/VC/ChatVC.swift @@ -6,7 +6,6 @@ // public var kScreenWid: CGFloat { return UIScreen.main.bounds.size.width } - public var kScreenHei: CGFloat { return UIScreen.main.bounds.size.height } import UIKit @@ -16,7 +15,6 @@ class ChatVC: BaseVC { var recordBtn = UIButton(type: .custom) let tableView = UITableView(frame: CGRectZero, style: .plain) - deinit { stopAction() } @@ -57,22 +55,39 @@ class ChatVC: BaseVC { } } func setupSDk(){ - ChatManager.shared.chatNeedReloadData = {[weak self] in + DCChatManager.shared.chatNeedReloadData = {[weak self] in guard let self = self else{return} tableView.reloadData() + if DCChatManager.shared.dataList.count > 0 { + tableView.scrollToRow(at: IndexPath(row: DCChatManager.shared.dataList.count - 1, section: 0), at: .none, animated: true) + } + } + DCChatManager.shared.codeCallback = { [weak self] code in + guard let self = self else{return} + if code == 20001 { + self.recordBtn.isSelected = true + } + else if code == 20002 || code == 20003{ + self.recordBtn.isSelected = false + } + + } + DCChatManager.shared.finishCallback = { [weak self] path in + guard let self = self else{return} + // self.recordBtn.isSelected = false } } func reloadData(){ } @objc func recordAction() { -// self.recordBtn.isSelected = !self.recordBtn.isSelected -// if self.recordBtn.isSelected { -// DCChat.shared.startChat() -// } -// else{ + self.recordBtn.isSelected = !self.recordBtn.isSelected + if self.recordBtn.isSelected { + DCChat.shared.startChat() + } + else{ stopAction() -// } + } } func stopAction() { DCChat.shared.stopChat() @@ -80,7 +95,7 @@ class ChatVC: BaseVC { @objc func roleAction(){ let vc = RoleVC() vc.didSelectedCallback = { role in - ChatManager.shared.role = role + DCChatManager.shared.role = role } navigationController?.pushViewController(vc, animated: true) } @@ -88,12 +103,12 @@ class ChatVC: BaseVC { extension ChatVC:UITableViewDelegate,UITableViewDataSource { func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { - return ChatManager.shared.dataList.count + return DCChatManager.shared.dataList.count } func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: ChatCell.reuseID, for: indexPath) as? ChatCell - cell!.data = ChatManager.shared.dataList[indexPath.row] + cell!.data = DCChatManager.shared.dataList[indexPath.row] return cell! } func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Example/Example/VC/EarPhoneRecordVC.swift b/DeepChordsSdk_iOS/DeepChordsSdk/Example/Example/VC/EarPhoneRecordVC.swift index 7a344e2..ce25d9e 100644 --- a/DeepChordsSdk_iOS/DeepChordsSdk/Example/Example/VC/EarPhoneRecordVC.swift +++ b/DeepChordsSdk_iOS/DeepChordsSdk/Example/Example/VC/EarPhoneRecordVC.swift @@ -29,7 +29,7 @@ class EarPhoneRecordVC: BaseVC { stopAction() } func setupView(){ - title = "手机录音" + title = "耳机录音" view.backgroundColor = .white fromItem = UIBarButtonItem(title: "源语言", style: .done, target: self, action: #selector(fromLanguageAction)) @@ -81,8 +81,19 @@ class EarPhoneRecordVC: BaseVC { let range = NSMakeRange(toTextView.text.count - 1, 1) self.toTextView.scrollRangeToVisible(range) } + DCBleRecord.shared.codeCallback = { [weak self] code in + guard let self = self else{return} + if code == 20001 { + self.recordBtn.isSelected = true + } + else if code == 20002 || code == 20003{ + self.recordBtn.isSelected = false + } + + } DCBleRecord.shared.filePathCallBack = { [weak self] path in guard let self = self else{return} +// self.recordBtn.isSelected = false } } @@ -118,6 +129,8 @@ class EarPhoneRecordVC: BaseVC { extension EarPhoneRecordVC{ func startAction(){ + fromTextView.text = "" + toTextView.text = "" DCBleRecord.shared.fromLanguage = fromLanguage DCBleRecord.shared.toLanguage = toLanguage DCBleRecord.shared.isTranslate = true diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Example/Example/VC/HomeVC.swift b/DeepChordsSdk_iOS/DeepChordsSdk/Example/Example/VC/HomeVC.swift index 0787bdc..80de6b8 100644 --- a/DeepChordsSdk_iOS/DeepChordsSdk/Example/Example/VC/HomeVC.swift +++ b/DeepChordsSdk_iOS/DeepChordsSdk/Example/Example/VC/HomeVC.swift @@ -30,10 +30,6 @@ class HomeVC: BaseVC{ setupViews() setupBle() - - DispatchQueue.main.asyncAfter(deadline:.now() + 2) { - ChatManager.shared.setupSdk() - } } func setupViews(){ diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Example/Example/VC/LogVC.swift b/DeepChordsSdk_iOS/DeepChordsSdk/Example/Example/VC/LogVC.swift index 9c01013..81ac5d7 100644 --- a/DeepChordsSdk_iOS/DeepChordsSdk/Example/Example/VC/LogVC.swift +++ b/DeepChordsSdk_iOS/DeepChordsSdk/Example/Example/VC/LogVC.swift @@ -23,7 +23,7 @@ class LogVC: UIViewController { override func viewDidAppear(_ animated: Bool) { super.viewDidAppear(animated) // var version = (Bundle.main.appVersion ?? "") + "\n" - let version = "2025151801" + "\n" + let version = "2025151902" + "\n" textView.text = "版本:\(version)" + DCLogger.logs.joined() let range = NSMakeRange(textView.text.count - 1, 1) textView.scrollRangeToVisible(range) diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Example/Example/VC/MusicVC.swift b/DeepChordsSdk_iOS/DeepChordsSdk/Example/Example/VC/MusicVC.swift index 04c8a65..ad60cf4 100644 --- a/DeepChordsSdk_iOS/DeepChordsSdk/Example/Example/VC/MusicVC.swift +++ b/DeepChordsSdk_iOS/DeepChordsSdk/Example/Example/VC/MusicVC.swift @@ -67,9 +67,13 @@ extension MusicVC:UITableViewDelegate,UITableViewDataSource { extension MusicVC { func loadData(){ - DCDevice.shared.getMusicList(size: 10, index: 0) {[weak self] (list, result) in - guard let self = self else{return} - guard let list = list else{return} + DCDevice.shared.getTotalMusic { num in + if let num = num,num > 0{ + DCDevice.shared.getMusicList(size: 10, index: 0) {[weak self] (list, result) in + guard let self = self else{return} + guard let list = list else{return} + } + } } } diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Example/Example/VC/PhoneRecordVC.swift b/DeepChordsSdk_iOS/DeepChordsSdk/Example/Example/VC/PhoneRecordVC.swift index d9eb756..423a321 100644 --- a/DeepChordsSdk_iOS/DeepChordsSdk/Example/Example/VC/PhoneRecordVC.swift +++ b/DeepChordsSdk_iOS/DeepChordsSdk/Example/Example/VC/PhoneRecordVC.swift @@ -71,19 +71,19 @@ class PhoneRecordVC: BaseVC { } } func setupSdk(){ - DCRecord.shared.asrCallback = { [weak self] text in + DCPhoneRecord.shared.asrCallback = { [weak self] text in guard let self = self else{return} self.fromTextView.text = text let range = NSMakeRange(fromTextView.text.count - 1, 1) self.fromTextView.scrollRangeToVisible(range) } - DCRecord.shared.translateCallback = { [weak self] text in + DCPhoneRecord.shared.translateCallback = { [weak self] text in guard let self = self else{return} self.toTextView.text = text let range = NSMakeRange(toTextView.text.count - 1, 1) self.toTextView.scrollRangeToVisible(range) } - DCRecord.shared.filePathCallBack = { [weak self] path in + DCPhoneRecord.shared.filePathCallBack = { [weak self] path in guard let self = self else{return} } } @@ -120,13 +120,13 @@ class PhoneRecordVC: BaseVC { extension PhoneRecordVC{ func startAction(){ - DCRecord.shared.fromLanguage = fromLanguage - DCRecord.shared.toLanguage = toLanguage - DCRecord.shared.isTranslate = true - DCRecord.shared.start() + DCPhoneRecord.shared.fromLanguage = fromLanguage + DCPhoneRecord.shared.toLanguage = toLanguage + DCPhoneRecord.shared.isTranslate = true + DCPhoneRecord.shared.start() } func stopAction(){ - DCRecord.shared.stop() + DCPhoneRecord.shared.stop() } } diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Example/Example/VC/TttsVC.swift b/DeepChordsSdk_iOS/DeepChordsSdk/Example/Example/VC/TttsVC.swift new file mode 100644 index 0000000..fd6433a --- /dev/null +++ b/DeepChordsSdk_iOS/DeepChordsSdk/Example/Example/VC/TttsVC.swift @@ -0,0 +1,147 @@ +import UIKit +import StarburstSdk +import AVFoundation + +class TttsVC: UIViewController { + private let textField = UITextField() + private let speedSlider = UISlider() + private let speedLabel = UILabel() + private let synthButton = UIButton(type: .system) + private let logView = UITextView() + + private var ttsSpeed: Float = 1.0 + private var audioPlayer: AVAudioPlayer? + + override func viewDidLoad() { + super.viewDidLoad() + title = "文本合成 TTS" + view.backgroundColor = .white + setupUI() + } + + func setupUI() { + textField.borderStyle = .roundedRect + textField.placeholder = "请输入要合成的文本" + + speedSlider.minimumValue = 0.8 + speedSlider.maximumValue = 2.0 + speedSlider.value = ttsSpeed + speedSlider.addTarget(self, action: #selector(speedChanged), for: .valueChanged) + + speedLabel.text = "语速:\(String(format: "%.1f", ttsSpeed))x" + + synthButton.setTitle("合成并播放", for: .normal) + synthButton.addTarget(self, action: #selector(startTTS), for: .touchUpInside) + + logView.isEditable = false + logView.font = UIFont.systemFont(ofSize: 14) + + view.addSubview(textField) + view.addSubview(speedSlider) + view.addSubview(speedLabel) + view.addSubview(synthButton) + view.addSubview(logView) + + textField.frame = CGRect(x: 20, y: 100, width: view.bounds.width-40, height: 40) + speedLabel.frame = CGRect(x: 20, y: 150, width: 200, height: 30) + speedSlider.frame = CGRect(x: 20, y: 180, width: view.bounds.width-40, height: 40) + synthButton.frame = CGRect(x: 20, y: 240, width: view.bounds.width-40, height: 50) + logView.frame = CGRect(x: 20, y: 300, width: view.bounds.width-40, height: 300) + } + + @objc func speedChanged() { + ttsSpeed = speedSlider.value + speedLabel.text = "语速:\(String(format: "%.1f", ttsSpeed))x" + } + + @objc func startTTS() { + guard let text = textField.text, !text.isEmpty else { + appendLog("请输入文本") + return + } + appendLog("开始合成语音...\n") + + // 调用 iOS SDK 的 TTS 接口 + TextToSpeechManager.sharedInstance().textToSpeech( + companyId: "2101982539", + text: text, + reqId: UUID().uuidString, + speedRatio: ttsSpeed, + voiceType: "zh_female_qingchezizi_moon_bigtts", + encoding: "pcm", + callback: self + ) + } + + func appendLog(_ msg: String) { + DispatchQueue.main.async { + self.logView.text.append(msg) + self.logView.scrollRangeToVisible(NSRange(location: self.logView.text.count, length: 0)) + } + } + + func playPCMData(_ pcmData: Data) { + // PCM裸数据要转成wav才能用AVAudioPlayer播放 + if let wavData = pcmToWav(pcmData, sampleRate: 16000, channels: 1) { + DispatchQueue.main.async { + do { + self.audioPlayer = try AVAudioPlayer(data: wavData) + self.audioPlayer?.play() + self.appendLog("播放中...\n") + } catch { + self.appendLog("播放失败:\(error.localizedDescription)\n") + } + } + } + } + + func pcmToWav(_ pcmData: Data, sampleRate: Int, channels: Int) -> Data? { + let byteRate = sampleRate * channels * 2 + var header = Data() + header.append("RIFF".data(using: .ascii)!) + header.append(UInt32(pcmData.count + 36).littleEndianData) + header.append("WAVE".data(using: .ascii)!) + + header.append("fmt ".data(using: .ascii)!) + header.append(UInt32(16).littleEndianData) + header.append(UInt16(1).littleEndianData) // PCM + header.append(UInt16(channels).littleEndianData) + header.append(UInt32(sampleRate).littleEndianData) + header.append(UInt32(byteRate).littleEndianData) + header.append(UInt16(channels * 2).littleEndianData) + header.append(UInt16(16).littleEndianData) + + header.append("data".data(using: .ascii)!) + header.append(UInt32(pcmData.count).littleEndianData) + + var wav = Data() + wav.append(header) + wav.append(pcmData) + return wav + } +} + +extension TttsVC: TextToSpeechCallback { + func onResult(_ response: String) { + appendLog("合成完成,开始播放...\n") + guard let jsonObj = try? JSONSerialization.jsonObject(with: response.data(using: .utf8)!, options: []) as? [String:Any], + let respObj = jsonObj["resp"] as? [String:Any], + let base64Data = respObj["data"] as? String, + let pcmBytes = Data(base64Encoded: base64Data) else { + appendLog("解析PCM失败\n") + return + } + playPCMData(pcmBytes) + } + + func onError(_ code: Int, message: String) { + appendLog("合成失败:\(message)\n") + } +} + +// MARK: - Data扩展 +extension FixedWidthInteger { + var littleEndianData: Data { + withUnsafeBytes(of: self.littleEndian, { Data($0) }) + } +} diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Example/Example/VC/App.swift b/DeepChordsSdk_iOS/DeepChordsSdk/Example/Example/tools/App.swift similarity index 86% rename from DeepChordsSdk_iOS/DeepChordsSdk/Example/Example/VC/App.swift rename to DeepChordsSdk_iOS/DeepChordsSdk/Example/Example/tools/App.swift index 9657628..bca30d3 100644 --- a/DeepChordsSdk_iOS/DeepChordsSdk/Example/Example/VC/App.swift +++ b/DeepChordsSdk_iOS/DeepChordsSdk/Example/Example/tools/App.swift @@ -33,7 +33,10 @@ class App{ topVC().navigationController?.popToViewController(vcs[index], animated: true) } } - + func goToPage(_ viewController: UIViewController,animated:Bool = true){ + viewController.hidesBottomBarWhenPushed = true + topVC().navigationController?.pushViewController(viewController, animated: animated) + } } extension App{ private func getTopViewController(from vc: UIViewController) -> UIViewController { diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Example/Example/tools/BleManager.swift b/DeepChordsSdk_iOS/DeepChordsSdk/Example/Example/tools/BleManager.swift index 9b8878e..336e15a 100644 --- a/DeepChordsSdk_iOS/DeepChordsSdk/Example/Example/tools/BleManager.swift +++ b/DeepChordsSdk_iOS/DeepChordsSdk/Example/Example/tools/BleManager.swift @@ -125,7 +125,7 @@ extension BleManager: CBPeripheralDelegate { } func peripheral(_ peripheral: CBPeripheral, didUpdateNotificationStateFor characteristic: CBCharacteristic, error: (any Error)?) { - DCLogger.debug("状态改变 == UUId ",characteristic.uuid) + DCLogger.debug("状态改变 == UUID ",characteristic.uuid) } func peripheral(_ peripheral: CBPeripheral, didUpdateValueFor characteristic: CBCharacteristic, error: Error?) { diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Example/Example/tools/ChatManager.swift b/DeepChordsSdk_iOS/DeepChordsSdk/Example/Example/tools/DCChatManager.swift similarity index 75% rename from DeepChordsSdk_iOS/DeepChordsSdk/Example/Example/tools/ChatManager.swift rename to DeepChordsSdk_iOS/DeepChordsSdk/Example/Example/tools/DCChatManager.swift index d40842d..cecd788 100644 --- a/DeepChordsSdk_iOS/DeepChordsSdk/Example/Example/tools/ChatManager.swift +++ b/DeepChordsSdk_iOS/DeepChordsSdk/Example/Example/tools/DCChatManager.swift @@ -1,11 +1,23 @@ // -// ChatManager.swift +// DCChatManager.swift // Example // // Created by liangshi on 2025/12/15. // import AVFoundation import DeepChordsSdk +//typedef NS_OPTIONS(NSInteger,StarburstCode) { +// StarburstCode_Start_Record = 20001,///开始录音 +// StarburstCode_Stop_Record = 20002,///停止录音 +// StarburstCode_Record_Error = 20003,///录音出错 +// StarburstCode_Ble_Disconected = 20004,///蓝牙断开 +// StarburstCode_Websocket_Connected = 30001,///socket连上 +// StarburstCode_Websocket_Disconnected = 30002,///socket断开连接 +// StarburstCode_Websocket_Connecting = 30003,///socket连接中... +// StarburstCode_Websocket_pingTimeOut = 30004,///ping超时 +// StarburstCode_Net_Error = 50000,///网络错误 +// StarburstCode_UnAuth = 60000,///未鉴权 +//}; /// Ai回应模型 public class ChatCellModel:NSObject,NSCoding { @@ -29,13 +41,17 @@ public class ChatCellModel:NSObject,NSCoding { } -class ChatManager:NSObject{ - static let shared = ChatManager() - var isTtsPlaying = false +class DCChatManager:NSObject{ + static let shared = DCChatManager() + private var isTtsPlaying = false private var audioData: Data? - var dataList:[ChatCellModel] = [] - var chatNeedReloadData:(()->Void)? + public var dataList:[ChatCellModel] = [] + public var chatNeedReloadData:(()->Void)? + /// 状态码回调 + public var codeCallback:((Int)->Void)? + /// 结束对话回调 + public var finishCallback:((String?)->Void)? var role:DCRole? { didSet{ @@ -50,23 +66,21 @@ class ChatManager:NSObject{ DCChat.shared.getVcSpeekerList(finished: finished) } - func setupSdk(){ - - PcmSound.sharedInstance().setup(16000, withchannels: 1) - let options: AVAudioSession.CategoryOptions = [.allowBluetooth] - do { - try AVAudioSession.sharedInstance().setCategory(.playback, options: [options]) - try AVAudioSession.sharedInstance().setActive(true) - } catch { - DCLogger.debug(error) - } - - setupChat() - } +// func setupSdk(){ +// PcmSound.sharedInstance().setup(16000, withchannels: 1) +// let options: AVAudioSession.CategoryOptions = [.allowBluetooth] +// do { +// try AVAudioSession.sharedInstance().setCategory(.playback, options: [options]) +// try AVAudioSession.sharedInstance().setActive(true) +// } catch { +// DCLogger.debug(error) +// } +// +// setupChat() +// } func setupChat(){ DCChat.shared.role = role - DCChat.shared.initChat() DCChat.shared.asrCallback = {[weak self] (text,index) in guard let self = self else{return} if let model = dataList.last,model.id == index,model.type == 1 { @@ -116,7 +130,9 @@ class ChatManager:NSObject{ self.audioData?.append(data!) } } - DCChat.shared.codeCallback = { code in + DCChat.shared.codeCallback = {[weak self] code in + self?.codeCallback?(code) + // if code == 20001 { // if (self.isTtsPlaying) { // self.isTtsPlaying = false @@ -133,9 +149,10 @@ class ChatManager:NSObject{ // } // } } - DCChat.shared.finishCallback = { path in - + DCChat.shared.finishCallback = {[weak self] path in + self?.finishCallback?(path) } + } func saveToFile(data: Data) { @@ -163,7 +180,7 @@ class ChatManager:NSObject{ } } } -extension ChatManager : PcmSoundDelegate { +extension DCChatManager : PcmSoundDelegate { func remaining(_ frames: UInt) { DCLogger.debug("[frame:\(frames)]"); if (frames == 0) { diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Example/Example/tools/DCRecordManager.swift b/DeepChordsSdk_iOS/DeepChordsSdk/Example/Example/tools/DCRecordManager.swift new file mode 100644 index 0000000..e5c9f04 --- /dev/null +++ b/DeepChordsSdk_iOS/DeepChordsSdk/Example/Example/tools/DCRecordManager.swift @@ -0,0 +1,28 @@ +// +// Record.swift +// Example +// +// Created by liangshi on 2025/12/19. +// +//import DeepChordsSdk +// +//class DCRecordManager{ +// static let shared = DCRecordManager() +// +// func setupRecord(){ +// DCBleRecord.shared.codeCallback = { [weak self] code in +// guard let self = self else{return} +// if code == 20001 { +// if let vc = App.shared.topVC() as? EarPhoneRecordVC { +// // vc.startRecord() +// }else{ +// App.shared.goToPage(EarPhoneRecordVC()) +// } +// } +// else if code == 20002 || code == 20003{ +//// self.recordBtn.isSelected = false +// } +// +// } +// } +//} diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Example/Example/tools/DCSdkManager.swift b/DeepChordsSdk_iOS/DeepChordsSdk/Example/Example/tools/DCSdkManager.swift new file mode 100644 index 0000000..f921277 --- /dev/null +++ b/DeepChordsSdk_iOS/DeepChordsSdk/Example/Example/tools/DCSdkManager.swift @@ -0,0 +1,55 @@ +// +// DCSdkManager.swift +// Example +// +// Created by liangshi on 2025/12/19. +// +import DeepChordsSdk + +class DCSdkManager{ + static let shared = DCSdkManager() + + + func initSdk(){ + DeepChordsAiSdk.shared.initSDK() +// DCRecordManager.shared.setupRecord() + DCChatManager.shared.setupChat() + + DCDevice.shared.eventCallback = { event in + switch event { + case 0x01: + if let vc = App.shared.topVC() as? ChatVC { + // vc.startRecord() + }else{ + App.shared.goToPage(ChatVC()) + } + case 0x02: +// if let vc = App.shared.topVC() as? ChatVC { +// // vc.startRecord() +// }else{ +// App.shared.goToPage(ChatVC()) +// } + break + case 0x03: + if let vc = App.shared.topVC() as? EarPhoneRecordVC { + // vc.startRecord() + }else{ + App.shared.goToPage(EarPhoneRecordVC()) + } + case 0x04: +// if let vc = App.shared.topVC() as? EarPhoneRecordVC { +// // vc.startRecord() +// }else{ +// App.shared.goToPage(EarPhoneRecordVC()) +// } + break + default: + break + } + } + + + + + } +} diff --git a/ShenYin/ShenYin/UI/Login/Controller/SetEmailVC.swift b/ShenYin/ShenYin/UI/Login/Controller/SetEmailVC.swift index 2470ceb..583c9cb 100644 --- a/ShenYin/ShenYin/UI/Login/Controller/SetEmailVC.swift +++ b/ShenYin/ShenYin/UI/Login/Controller/SetEmailVC.swift @@ -27,6 +27,7 @@ class SetEmailVC:BaseVC{ } phoneView.do { v in v.textField.placeholder = "请输入邮箱地址".l10n + v.textField.keyboardType = .emailAddress } loginBtn.set(title: "下一步".l10n,style: .theme1, target: self, action: #selector(loginAction)) view.addSubviews([titleLabel,phoneView,loginBtn]) diff --git a/ShenYin/ShenYin/lan/Arabic.swift b/ShenYin/ShenYin/lan/Arabic.swift index dd656e3..e340d43 100644 --- a/ShenYin/ShenYin/lan/Arabic.swift +++ b/ShenYin/ShenYin/lan/Arabic.swift @@ -249,4 +249,6 @@ let arabicMap:[String:String] = "未处于通话状态":"ليست في حالة المكالمة", "ä½ ":"أنت", "对方":"الطرف الآخر", + "我可以帮你搜索、答疑、写作,请把你的任务交给我吧~":"أستطيع مساعدتك في البحث والإجابة على الأسئلة والكتابة. أرفق مهامك بي~", + ] diff --git a/ShenYin/ShenYin/lan/Filipino.swift b/ShenYin/ShenYin/lan/Filipino.swift index 8987006..efcb743 100644 --- a/ShenYin/ShenYin/lan/Filipino.swift +++ b/ShenYin/ShenYin/lan/Filipino.swift @@ -248,4 +248,6 @@ let filipinoMap:[String:String] = "未处于通话状态":"Hindi nasa estado ng tawag", "ä½ ":"Ikaw", "对方":"Kontrahan", + "我可以帮你搜索、答疑、写作,请把你的任务交给我吧~":"Maaari kitang tulungan sa paghahanap, pagsagot ng mga katanungan, at pagsusulat. Iampon mo ang iyong mga gawain sa akin~", + ] diff --git a/ShenYin/ShenYin/lan/German.swift b/ShenYin/ShenYin/lan/German.swift index d84762c..7666e19 100644 --- a/ShenYin/ShenYin/lan/German.swift +++ b/ShenYin/ShenYin/lan/German.swift @@ -248,4 +248,6 @@ let germanMap:[String:String] = "未处于通话状态":"Nicht in einem Anruf", "ä½ ":"Du", // 日常交互场景用 "Du",正式场景可替换为 "Sie" "对方":"Die andere Partei", + "我可以帮你搜索、答疑、写作,请把你的任务交给我吧~":"Ich kann dir bei der Suche, der Beantwortung von Fragen und dem Schreiben helfen. Überlass mir deine Aufgaben~", + ] diff --git a/ShenYin/ShenYin/lan/TraditionalChinese.swift b/ShenYin/ShenYin/lan/TraditionalChinese.swift index 511745b..b199a13 100644 --- a/ShenYin/ShenYin/lan/TraditionalChinese.swift +++ b/ShenYin/ShenYin/lan/TraditionalChinese.swift @@ -249,4 +249,5 @@ let chineseTraditionalMap:[String:String] = "未处于通话状态":"未處於通話狀態", "ä½ ":"ä½ ", // 繁体中文通用表述,若需更口语化可使用"ä½ "(与简体一致,繁体书写无差异) "对方":"對方", + "我可以帮你搜索、答疑、写作,请把你的任务交给我吧~":"我可以幫你搜尋、答疑、寫作,請把你的任務交給我吧~", ] diff --git a/ShenYin/ShenYin/lan/Vietnam.swift b/ShenYin/ShenYin/lan/Vietnam.swift index f243ddc..ce21918 100644 --- a/ShenYin/ShenYin/lan/Vietnam.swift +++ b/ShenYin/ShenYin/lan/Vietnam.swift @@ -248,4 +248,5 @@ let vietnameseMap:[String:String] = "未处于通话状态":"Không trong trạng thái cuộc gọi", "ä½ ":"Bạn", "对方":"Đối phương", + "我可以帮你搜索、答疑、写作,请把你的任务交给我吧~":"Tôi có thể giúp bạn tìm kiếm, trả lời câu hỏi và viết văn. Hãy giao nhiệm vụ cá»§a bạn cho tôi nhé~", ] diff --git a/ShenYin/ShenYin/lan/english.swift b/ShenYin/ShenYin/lan/english.swift index b9541e7..347b768 100644 --- a/ShenYin/ShenYin/lan/english.swift +++ b/ShenYin/ShenYin/lan/english.swift @@ -249,4 +249,6 @@ let englishMap:[String:String] = "未处于通话状态":"Not in a call", "ä½ ":"You", "对方":"The other party", + "我可以帮你搜索、答疑、写作,请把你的任务交给我吧~":"I can help you with searching, answering questions and writing. Please entrust your tasks to me~", + ] diff --git a/ShenYin/ShenYin/lan/french.swift b/ShenYin/ShenYin/lan/french.swift index 7328fb1..aec9b88 100644 --- a/ShenYin/ShenYin/lan/french.swift +++ b/ShenYin/ShenYin/lan/french.swift @@ -250,4 +250,6 @@ let frenchMap:[String:String] = "未处于通话状态":"Pas en appel", "ä½ ":"Tu", // 日常交互场景用 "Tu",正式场景可替换为 "Vous" "对方":"L'autre partie", + "我可以帮你搜索、答疑、写作,请把你的任务交给我吧~":"Je peux vous aider à chercher des informations, répondre à vos questions et écrire des textes. Veuillez me confier vos tâches~", + ] diff --git a/ShenYin/ShenYin/lan/indonesian.swift b/ShenYin/ShenYin/lan/indonesian.swift index f7c6bb0..2188074 100644 --- a/ShenYin/ShenYin/lan/indonesian.swift +++ b/ShenYin/ShenYin/lan/indonesian.swift @@ -249,4 +249,6 @@ let indonesianMap:[String:String] = "未处于通话状态":"Tidak dalam panggilan", "ä½ ":"Kamu", // 日常交互场景,正式场景可替换为 "Anda" "对方":"Pihak lain", + "我可以帮你搜索、答疑、写作,请把你的任务交给我吧~":"Saya bisa membantu Anda mencari, menjawab pertanyaan, dan menulis. Silakan serahkan tugas Anda kepada saya~", + ] diff --git a/ShenYin/ShenYin/lan/japanese.swift b/ShenYin/ShenYin/lan/japanese.swift index 2fb53e8..ad83521 100644 --- a/ShenYin/ShenYin/lan/japanese.swift +++ b/ShenYin/ShenYin/lan/japanese.swift @@ -249,4 +249,6 @@ let japaneseMap:[String:String] = "未处于通话状态":"通話中ではない", "ä½ ":"あなた", "对方":"相手", + "我可以帮你搜索、答疑、写作,请把你的任务交给我吧~":"検索、質問への回答、文章作成をお手伝いできます。ぜひお仕事をお任せくださいね~", + ] diff --git a/ShenYin/ShenYin/lan/korean.swift b/ShenYin/ShenYin/lan/korean.swift index fbf6c60..963e144 100644 --- a/ShenYin/ShenYin/lan/korean.swift +++ b/ShenYin/ShenYin/lan/korean.swift @@ -250,4 +250,6 @@ let koreanMap:[String:String] = "未处于通话状态":"통화 중이 아님", "ä½ ":"당신", "对方":"상대방", + "我可以帮你搜索、答疑、写作,请把你的任务交给我吧~":"검색, 질문 답변, 글쓰기를 도와드릴 수 있습니다. 당신의 업무를 맡겨주세요~", + ] diff --git a/ShenYin/ShenYin/lan/malay.swift b/ShenYin/ShenYin/lan/malay.swift index e36ee85..78476ac 100644 --- a/ShenYin/ShenYin/lan/malay.swift +++ b/ShenYin/ShenYin/lan/malay.swift @@ -248,4 +248,6 @@ let malayMap:[String:String] = "未处于通话状态":"Tidak dalam panggilan", "ä½ ":"Awak", // 日常交互场景,正式场景可替换为 "Anda" "对方":"Pihak satu lagi", + "我可以帮你搜索、答疑、写作,请把你的任务交给我吧~":"Saya boleh membantu anda mencari, menjawab soalan dan menulis. Sila serahkan tugas anda kepada saya~", + ] diff --git a/ShenYin/ShenYin/lan/russian.swift b/ShenYin/ShenYin/lan/russian.swift index 59d8873..298b6c8 100644 --- a/ShenYin/ShenYin/lan/russian.swift +++ b/ShenYin/ShenYin/lan/russian.swift @@ -249,4 +249,6 @@ let russianMap:[String:String] = "未处于通话状态":"Не в звонке", "ä½ ":"Ты", // 日常交互场景,正式场景可替换为 "Вы" "对方":"Другая сторона", + "我可以帮你搜索、答疑、写作,请把你的任务交给我吧~":"Я могу помочь вам с поиском информации, ответом на вопросы и написанием текстов. Поверьте мне свои задачи~", + ] diff --git a/ShenYin/ShenYin/lan/spanish.swift b/ShenYin/ShenYin/lan/spanish.swift index 79546c1..0448af0 100644 --- a/ShenYin/ShenYin/lan/spanish.swift +++ b/ShenYin/ShenYin/lan/spanish.swift @@ -249,4 +249,6 @@ let spanishMap:[String:String] = "未处于通话状态":"No en llamada", "ä½ ":"Tú", // 日常交互场景用 "Tú",正式场景可替换为 "Usted" "对方":"La otra parte", + "我可以帮你搜索、答疑、写作,请把你的任务交给我吧~":"Puedo ayudarte con búsquedas, responder preguntas y escribir. ¡Confía tus tareas a mí~", + ] diff --git a/ShenYin/ShenYin/lan/thai.swift b/ShenYin/ShenYin/lan/thai.swift index fb1d046..24232d3 100644 --- a/ShenYin/ShenYin/lan/thai.swift +++ b/ShenYin/ShenYin/lan/thai.swift @@ -248,4 +248,6 @@ let thaiMap:[String:String] = "未处于通话状态":"ไม่อยู่ในสถานะการโทรศัพท์", "ä½ ":"คุณ", "对方":"ฝ่ายตรงข้าม", + "我可以帮你搜索、答疑、写作,请把你的任务交给我吧~":"ฉันสามารถช่วยคุณค้นหาข้อมูล ตอบคำถาม และเขียนข้อความได้ โปรดมอบงานของคุณให้ฉันนะ~", + ] diff --git "a/document/12\350\277\233\345\272\246.jpeg" "b/document/12\350\277\233\345\272\246.jpeg" new file mode 100644 index 0000000..bdc4b67 Binary files /dev/null and "b/document/12\350\277\233\345\272\246.jpeg" differ