import Foundation
import CoreBluetooth
-import StarburstSdk
+import StarburstSdkDirect
/// 蓝牙管理
// Created by liangshi on 2025/12/9.
//
-import StarburstSdk
+import StarburstSdkDirect
//20001,///开始录音
//20002,///停止录音
// Created by liangshi on 2025/12/30.
//
-import StarburstSdk
+import StarburstSdkDirect
/// 通话录音
public class DCCallRecord {
// Created by liangshi on 2025/12/15.
//
-import StarburstSdk
+import StarburstSdkDirect
/// 角色模型
public class DCRole{
//
import Foundation
-import StarburstSdk
+import StarburstSdkDirect
/// 日记管理
public class DCLogger {
//
// Created by liangshi on 2025/12/9.
//
-import StarburstSdk
+import StarburstSdkDirect
public class DCPhoneRecord {
/// 单利
// Created by liangshi on 2025/11/25.
//
import Foundation
-import StarburstSdk
+import StarburstSdkDirect
public class DCSdk{
public static let shared = DCSdk()
//
// Created by liangshi on 2026/1/15.
//
-import StarburstSdk
+import StarburstSdkDirect
/// 文本操作类
public class DCText{
//
// Created by liangshi on 2026/2/26.
//
-//import StarburstSdk
+//import StarburstSdkDirect
//public class DCTts:NSObject{
// public static let shared = DCTts()
//
// Created by liangshi on 2025/12/29.
//
-import StarburstSdk
+import StarburstSdkDirect
/// 响应模型
--- /dev/null
+import Foundation
+@_exported import StarburstSdkDirect
+
+// Compatibility aliases so the Demo can compile against Direct framework
+// without rewriting all sample code symbols.
+
+typealias StarburstAsrConfig = SBD_StarburstAsrConfig
+typealias StarburstBleAsrConfig = SBD_StarburstBleAsrConfig
+typealias StarburstAsrFileConfig = SBD_StarburstAsrFileConfig
+typealias StarburstTslConfig = SBD_StarburstTslConfig
+typealias StarburstVoiceChatConfig = SBD_StarburstVoiceChatConfig
+
+typealias StarburstPhoneSdk = SBD_StarburstPhoneSdk
+// Direct framework exposes `SBD_StarburstSdk` (not `SBD_StarburstSdkManager`)
+typealias StarburstSdk = SBD_StarburstSdk
+typealias StarburstSdkManager = SBD_StarburstSdk
+typealias StarburstConfig = SBD_StarburstConfig
+
+typealias StartburstMixSdk = SBD_StartburstMixSdk
+typealias StartburstGlassesSdk = SBD_StartburstGlassesSdk
+typealias StartburstGlassChat = SBD_StartburstGlassChat
+typealias StartburstDecoderConfig = SBD_StartburstDecoderConfig
+typealias StarbusrtSpeaker = SBD_StarbusrtSpeaker
+
+typealias StarburstAsrModel = SBD_StarburstAsrModel
+typealias StarburstStreamModel = SBD_StarburstStreamModel
+typealias StarburstFileAsrModel = SBD_StarburstFileAsrModel
+typealias StarburstTranslateResult = SBD_StarburstTranslateResult
+typealias StarburstAsrTtsResult = SBD_StarburstAsrTtsResult
+
+// Note: the original model name in headers is `StarbaustVoiceChatModel` (typo kept for compatibility)
+typealias StarbaustVoiceChatModel = SBD_StarbaustVoiceChatModel
+typealias StarbustVoiceChatModel = SBD_StarbaustVoiceChatModel
+typealias StarburstVoiceChatModel = SBD_StarbaustVoiceChatModel
+
+++ /dev/null
-//
-// Starburst.h
-// Starburst
-//
-// Created by cookies on 2023/6/12.
-//
-
-#import <Foundation/Foundation.h>
-
-//! Project version number for Starburst.
-//FOUNDATION_EXPORT double StarburstSdkVersionNumber;
-
-//! Project version string for Starburst.
-//FOUNDATION_EXPORT const unsigned char StarburstSdkVersionString[];
-
-// In this header, you should import all the public headers of your framework using statements like #import <StarburstSdk/PublicHeader.h>
-
-#import <StarburstSdk/StarburstSdkManager.h>
-#import <StarburstSdk/StarburstConfig.h>
-#import <StarburstSdk/StarburstPhoneSdk.h>
-#import <StarburstSdk/StartburstMixSdk.h>
-#import <StarburstSdk/StartburstGlassesSdk.h>
-#import <StarburstSdk/StartburstGlassChat.h>
-#import <StarburstSdk/StarburstAsrConfig.h>
-#import <StarburstSdk/StarburstAsrModel.h>
-#import <StarburstSdk/StarburstFileAsrModel.h>
-#import <StarburstSdk/StarbaustVoiceChatModel.h>
-#import <StarburstSdk/StarbusrtSpeaker.h>
-#import <StarburstSdk/StarburstStreamModel.h>
-#import <StarburstSdk/StarburstOffLineFile.h>
-#import <StarburstSdk/StartburstDecoderConfig.h>
-#import <StarburstSdk/TextToImageManager.h>
-#import <StarburstSdk/TextToImageCallback.h>
-#import <StarburstSdk/AIGCErrorCode.h>
-#import <StarburstSdk/TextToSpeechManager.h>
-#import <StarburstSdk/TextToSpeechCallback.h>
+++ /dev/null
-//
-// StarburstSdk.h
-// VoiceDemo
-//
-// Created by incar on 2024/9/12.
-//
-
-#import <Foundation/Foundation.h>
-#import <StarburstSdk/StarburstAsrConfig.h>
-#import <StarburstSdk/StarburstAsrModel.h>
-#import <StarburstSdk/StarbaustVoiceChatModel.h>
-#import <StarburstSdk/StarburstFileAsrModel.h>
-#import <StarburstSdk/StarburstOffLineFile.h>
-#import <StarburstSdk/StarburstStreamModel.h>
-#import <StarburstSdk/StarbusrtSpeaker.h>
-#import <StarburstSdk/StartburstDecoderConfig.h>
-
-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,///未鉴权
-};
-
-typedef void (^AudioIntensityInputCallback)(NSArray<NSNumber*> *left,
- NSArray<NSNumber*> *right,
- NSTimeInterval timestampMs);
-
-@interface StarburstSdk : NSObject
-//@property (nonatomic, strong)void (^authSuccessCallback)(void);/// 鉴权成功回调
-@property (nonatomic, strong)void (^authCallback)(int code,NSString *msg);/// 鉴权结果回调,code200代表成功,其他为失败
-@property (nonatomic, readonly)BOOL didAuth;// 是否已经鉴权
-@property (nonatomic, strong)void (^websocketStateCallback)(BOOL connected);/// websocket状态回调,true为已连接,false未链接
-@property (nonatomic, strong)void (^bleRecordStateCallback)(int state);/// 耳机录音状态回调,1录音,2结束录音
-@property (nonatomic, strong)void (^sendToBleCallback)(NSData *data);/// 发送给蓝牙设备
-
-/// 单利
-+ (instancetype)shared;
-
-/// 收到蓝牙设备传过来的数据,交给sdk处理
-/// - Parameter data:数据
-- (void)receiveBleData:(NSData *)data;
-
-/// 蓝牙设备已经连上(蓝牙连接和断开都需要通知sdk)
-- (void)bleConnected;
-
-/// 蓝牙断开连接(在监听到蓝牙断开的时候,调用该方法通知sdk结束当前任务)
-- (void)bleDisConnected;
-
-///// 【文本摘要】
-///// - Parameters:
-///// - text: 识别的文本
-///// - recognize: 识别结果回调
-///// - error: 错误回调
-- (void)summaryByText:(NSString *)text config:(StarburstAsrFileConfig*)config recognizeText:(void (^)(StarburstFileAsrModel*))recognize error:(void (^)(NSError *err))error;
-
-/// 【文本摘要】--流式
-/// - Parameters:
-/// - text: 摘要的文字
-/// - recognize: 结果回调
-/// - error: 错误回调
-- (void)summaryByTextWithSplit:(NSString *)text recognizeText:(void (^)(StarburstStreamModel*))recognize error:(void (^)(NSError *err))error;
-
-/// 取消 【文本摘要】--流式
--(void)cancelSummaryByTextWithSplit;
-
-/// 【文本翻译】
-/// - Parameters:
-/// - text: 翻译的文字
-/// - config: 翻译配置
-/// - recognize: 识别结果回调
-/// - error: 错误回调
-- (void)translateByText:(NSString *)text config:(StarburstAsrFileConfig*)config recognizeText:(void (^)(StarburstFileAsrModel*))recognize error:(void (^)(NSError *err))error;
-
-/// 【文本翻译】--流式
-/// - Parameters:
-/// - text: 翻译的文字
-/// - config: 翻译配置
-/// - recognize: 结果回调
-/// - error: 错误回调
-- (void)translateByTextWithSplit:(NSString *)text config:(StarburstTslConfig*)config recognizeText:(void (^)(StarburstStreamModel*))recognize error:(void (^)(NSError *err))error;
-
-
-/// 取消 【文本翻译】--流式
--(void)cancelTranslateByTextWithSplit;
-
-/// 【同声传译】开始手机拾音
-/// - Parameters:
-/// - config: 识别配置
-/// - voiceRecordData: 录音音频流回调
-/// - recognizeText: 识别回调
-/// - stateChange: 状态回调
-/// - interrupt:打断回调(接听电话等打断)
-- (void)startRecordAsr:(StarburstAsrConfig*)config voiceRecord:(void (^)(NSData*))voiceData recognizeText:(void (^)(StarburstAsrModel*))recognize stateChange:(void(^)(StarburstCode code))stateChange interruption:(void(^)(void))interrupt;
-
-/// 【同声传译】结束手机拾音
-/// - 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: 识别配置
-- (void)startDeviceRecord:(StarburstBleAsrConfig*)config;
-
-/// 结束耳机拾音
-- (void)stopDeviceRecord;
-
-/// 设置耳机拾音回调
-/// - Parameters:
-/// - recordPath: 录音文件保存的路径。如果文件已经存在,则音频数据会追加到尾部;如果不存在,则创建新文件;传nil则会按之前时间格式创建新文件
-/// - asrConfig: 识别配置
-/// - bleConfig: 耳机录音类型回调
-/// - recognize: 识别回调
-/// - stateChange: 状态回调
-/// - path: 录音结束,录音文件地址回调
-- (void)setupDeviceRecordWith:(NSString *)recordPath asrConfig:(StarburstAsrConfig*)asrConfig bleConfig:(void (^)(StarburstBleAsrConfig*))bleConfig recognizeText:(void (^)(StarburstAsrModel*))recognize stateChange:(void(^)(StarburstCode code))stateChange finished:(void(^)(NSString *filePath))path;
-
-
-/// opus输出给app,app解码后将数据通过inputPcmData传回给sdk
-- (void)outputOpusData:(void (^)(StartburstDecoderConfig *copusConfig,NSData*opusData))recordCallBack;
-
-/// opus解码后传给sdk
-- (void)inputPcmData:(NSData *)pcmData;
-
-
-
-
-
-/// 获取音色列表
-/// - Parameter callBack: 结果回调
-- (void)getVcSpeekerList:(void (^)(NSArray <StarbusrtSpeaker*> *list,BOOL success))callBack;
-
-/// 设置voice chat回调,目前只支持蓝牙设备发起对话
-/// - Parameters:
-/// - config: 对话配置
-/// - startCallBack: 开始回调
-/// - textCallBack: 文本识别回调
-/// - 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, NSInteger sampleRate))voiceCallBack stateChange:(void(^)(StarburstCode code))stateChange finished:(void(^)(NSString *filePath))path;
-
-/// 终止voice chat对话
-- (void)stopVoiceChat:(NSInteger)dialogId;
-
-/// 开始播放tts
-- (void)startPlayTtsAudio:(NSInteger)dialogId;
-
-/// 结束播放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,NSInteger sampleRate))voiceCallBack stateChange:(void(^)(StarburstCode code))stateChange finished:(void(^)(NSString *filePath))path;
-//不可用
-- (void)startPhoneChat:(int)vadType;
-//不可用
-- (void)stopPhoneChat;
-//不可用
-- (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
-
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
-<plist version="1.0">
-<dict>
- <key>files</key>
- <dict>
- <key>Headers/AIGCErrorCode.h</key>
- <data>
- 6X+BFAl1GUlE673wijlbbmSDK7o=
- </data>
- <key>Headers/StarbaustVoiceChatModel.h</key>
- <data>
- O8K7t0c5zyFzqsMRLB06Q9rMy98=
- </data>
- <key>Headers/StarburstAsrConfig.h</key>
- <data>
- tSk0X4yTu1hQB88SVtxWkHcfTRY=
- </data>
- <key>Headers/StarburstAsrModel.h</key>
- <data>
- YMyp9i53bEO3diakJf+v5x2v2a0=
- </data>
- <key>Headers/StarburstConfig.h</key>
- <data>
- s3KYCCc8Cq0RWmlyfW7qe20T0c8=
- </data>
- <key>Headers/StarburstFileAsrModel.h</key>
- <data>
- KCay85nepjWFLxW32vUBaknoYTk=
- </data>
- <key>Headers/StarburstOffLineFile.h</key>
- <data>
- 28IGQ1ND/MHAAnUNKNBxuvS5ROc=
- </data>
- <key>Headers/StarburstPhoneSdk.h</key>
- <data>
- rwT9UO4f4YJAdgYM9SUrQo6cW0M=
- </data>
- <key>Headers/StarburstSdk.h</key>
- <data>
- aWY4JErrzMt9gCv0UqKyp5t+qGM=
- </data>
- <key>Headers/StarburstSdkManager.h</key>
- <data>
- qhZrrBq0fWMMexpfZdAUj4ZVVNg=
- </data>
- <key>Headers/StarburstStreamModel.h</key>
- <data>
- cdW3VKYRIjOHM5xn0Zzt3fioFro=
- </data>
- <key>Headers/StarbusrtSpeaker.h</key>
- <data>
- SBlLEersGuEueZNxVNc2uyepfts=
- </data>
- <key>Headers/StartburstDecoderConfig.h</key>
- <data>
- CEyiYJhRwvumcRqNLLoJARHeU24=
- </data>
- <key>Headers/StartburstGlassChat.h</key>
- <data>
- EKmAva0NghWkD5BgB3v2JyOqcQo=
- </data>
- <key>Headers/StartburstGlassesSdk.h</key>
- <data>
- zjj7I7WFlFcTzkseAMNaUZyEIyI=
- </data>
- <key>Headers/StartburstMixSdk.h</key>
- <data>
- CLg1FGxHPySPI5qCJH4N1zAZIw4=
- </data>
- <key>Headers/TextToImageCallback.h</key>
- <data>
- djrQqQ5J0JGsXn7fyLOzs0g705Q=
- </data>
- <key>Headers/TextToImageManager.h</key>
- <data>
- f7vVMHfHHqbi4Bi4seJMqHn4wnU=
- </data>
- <key>Headers/TextToSpeechCallback.h</key>
- <data>
- Q6/osX2ZUFgH9dbRA17GNlOraXI=
- </data>
- <key>Headers/TextToSpeechManager.h</key>
- <data>
- /j5GzHn6HDrV0eCdlQiwGi65QEQ=
- </data>
- <key>Info.plist</key>
- <data>
- LYDkUlG3+K2ItUesIisY3Luuk1c=
- </data>
- <key>Modules/module.modulemap</key>
- <data>
- 0SW07sgC8aptSEw6560m065YdrY=
- </data>
- <key>PrivacyInfo.xcprivacy</key>
- <data>
- SRctDO3cqibONLEG7CPcNZVBnXw=
- </data>
- </dict>
- <key>files2</key>
- <dict>
- <key>Headers/AIGCErrorCode.h</key>
- <dict>
- <key>hash</key>
- <data>
- 6X+BFAl1GUlE673wijlbbmSDK7o=
- </data>
- <key>hash2</key>
- <data>
- kB/hT+CxZkfSQW7qym0IydflbAkE3AYBvdij+bCDmlw=
- </data>
- </dict>
- <key>Headers/StarbaustVoiceChatModel.h</key>
- <dict>
- <key>hash</key>
- <data>
- O8K7t0c5zyFzqsMRLB06Q9rMy98=
- </data>
- <key>hash2</key>
- <data>
- Te3DhLKFm7g9Cqh68BOLUikve5gURqN9RWUPumoYzZY=
- </data>
- </dict>
- <key>Headers/StarburstAsrConfig.h</key>
- <dict>
- <key>hash</key>
- <data>
- tSk0X4yTu1hQB88SVtxWkHcfTRY=
- </data>
- <key>hash2</key>
- <data>
- EY1t77d6qelm3wi1yYEcG5Kw1HNnR8mziKSGBadmqOg=
- </data>
- </dict>
- <key>Headers/StarburstAsrModel.h</key>
- <dict>
- <key>hash</key>
- <data>
- YMyp9i53bEO3diakJf+v5x2v2a0=
- </data>
- <key>hash2</key>
- <data>
- r5bjhqHYbfX3MyhkjDOmAbqeXjuBI9fSoQRq/L0POEU=
- </data>
- </dict>
- <key>Headers/StarburstConfig.h</key>
- <dict>
- <key>hash</key>
- <data>
- s3KYCCc8Cq0RWmlyfW7qe20T0c8=
- </data>
- <key>hash2</key>
- <data>
- q5+7n+PJt+RNcfGHp6EMO49CqhiFTaqcIZQbeDtZcTk=
- </data>
- </dict>
- <key>Headers/StarburstFileAsrModel.h</key>
- <dict>
- <key>hash</key>
- <data>
- KCay85nepjWFLxW32vUBaknoYTk=
- </data>
- <key>hash2</key>
- <data>
- Y1+wOB3+K0CSFktnWVRMaxl9SsvQMDAZcFup9gudCFg=
- </data>
- </dict>
- <key>Headers/StarburstOffLineFile.h</key>
- <dict>
- <key>hash</key>
- <data>
- 28IGQ1ND/MHAAnUNKNBxuvS5ROc=
- </data>
- <key>hash2</key>
- <data>
- JqjH7qjguq8OEs3MklD/pyfD9ULJzpCwIyS37AvPIe8=
- </data>
- </dict>
- <key>Headers/StarburstPhoneSdk.h</key>
- <dict>
- <key>hash</key>
- <data>
- rwT9UO4f4YJAdgYM9SUrQo6cW0M=
- </data>
- <key>hash2</key>
- <data>
- kAdf5gAAX2xUk1XeiyxZjeGRvGhNe10TZexUz4PhxWU=
- </data>
- </dict>
- <key>Headers/StarburstSdk.h</key>
- <dict>
- <key>hash</key>
- <data>
- aWY4JErrzMt9gCv0UqKyp5t+qGM=
- </data>
- <key>hash2</key>
- <data>
- rnnCMlslMnwvphEZDLtWFp+XfQ1GqRFbhT7jnUVbBV4=
- </data>
- </dict>
- <key>Headers/StarburstSdkManager.h</key>
- <dict>
- <key>hash</key>
- <data>
- qhZrrBq0fWMMexpfZdAUj4ZVVNg=
- </data>
- <key>hash2</key>
- <data>
- J/65oVgQZfwUd8TWmGj/cvoeb7k9t79kPFQCeVGYRIQ=
- </data>
- </dict>
- <key>Headers/StarburstStreamModel.h</key>
- <dict>
- <key>hash</key>
- <data>
- cdW3VKYRIjOHM5xn0Zzt3fioFro=
- </data>
- <key>hash2</key>
- <data>
- XC3yJkUL3sL1YkFBUADx+q+Q47YB040DrB7QEhOJa7w=
- </data>
- </dict>
- <key>Headers/StarbusrtSpeaker.h</key>
- <dict>
- <key>hash</key>
- <data>
- SBlLEersGuEueZNxVNc2uyepfts=
- </data>
- <key>hash2</key>
- <data>
- yCNcI1umW3Pgn7rtgMv5kZTDZXr/QxvPNRoNjcIrTJU=
- </data>
- </dict>
- <key>Headers/StartburstDecoderConfig.h</key>
- <dict>
- <key>hash</key>
- <data>
- CEyiYJhRwvumcRqNLLoJARHeU24=
- </data>
- <key>hash2</key>
- <data>
- PlYBO1RRT96qRTFSidHUui8kpiVj0/pQW85jqIjCtzY=
- </data>
- </dict>
- <key>Headers/StartburstGlassChat.h</key>
- <dict>
- <key>hash</key>
- <data>
- EKmAva0NghWkD5BgB3v2JyOqcQo=
- </data>
- <key>hash2</key>
- <data>
- YIfvJ+AmQws0QANocYZxmOahypPKgbsEZXeR6wEInTA=
- </data>
- </dict>
- <key>Headers/StartburstGlassesSdk.h</key>
- <dict>
- <key>hash</key>
- <data>
- zjj7I7WFlFcTzkseAMNaUZyEIyI=
- </data>
- <key>hash2</key>
- <data>
- h+sX2xVUY3pWvU9949WQN6IoZau4WG4Ad1qRwJeC6Yk=
- </data>
- </dict>
- <key>Headers/StartburstMixSdk.h</key>
- <dict>
- <key>hash</key>
- <data>
- CLg1FGxHPySPI5qCJH4N1zAZIw4=
- </data>
- <key>hash2</key>
- <data>
- Z6H7+vUoMzMfpR9r7joECzicS9kOX4b/rqZb0fOMoaU=
- </data>
- </dict>
- <key>Headers/TextToImageCallback.h</key>
- <dict>
- <key>hash</key>
- <data>
- djrQqQ5J0JGsXn7fyLOzs0g705Q=
- </data>
- <key>hash2</key>
- <data>
- q/BtJzWpEpHfy9C5Bf07jUccilYQqgy94yGf3KLWwKM=
- </data>
- </dict>
- <key>Headers/TextToImageManager.h</key>
- <dict>
- <key>hash</key>
- <data>
- f7vVMHfHHqbi4Bi4seJMqHn4wnU=
- </data>
- <key>hash2</key>
- <data>
- N96kZDSkodLOSzvpZTi6amQVAYq0AzsFO6tvFFlQEoE=
- </data>
- </dict>
- <key>Headers/TextToSpeechCallback.h</key>
- <dict>
- <key>hash</key>
- <data>
- Q6/osX2ZUFgH9dbRA17GNlOraXI=
- </data>
- <key>hash2</key>
- <data>
- EXuN8dBBPFNJNuxSb0kaSfMs+i0WbS/9uA9tJ95RhlY=
- </data>
- </dict>
- <key>Headers/TextToSpeechManager.h</key>
- <dict>
- <key>hash</key>
- <data>
- /j5GzHn6HDrV0eCdlQiwGi65QEQ=
- </data>
- <key>hash2</key>
- <data>
- ikdltWnYn+xcIZztjJovnuoIDocq2Zwz81BLGh2HmZM=
- </data>
- </dict>
- <key>Modules/module.modulemap</key>
- <dict>
- <key>hash</key>
- <data>
- 0SW07sgC8aptSEw6560m065YdrY=
- </data>
- <key>hash2</key>
- <data>
- js/u3ymUzjIe0pCJDIjb2G3IBfLvIq7aILJo9tH8J8k=
- </data>
- </dict>
- <key>PrivacyInfo.xcprivacy</key>
- <dict>
- <key>hash</key>
- <data>
- SRctDO3cqibONLEG7CPcNZVBnXw=
- </data>
- <key>hash2</key>
- <data>
- cuaVRkQIQRl8fLAPRH2XlUdsPxO0W90uL0WcSHvmSnY=
- </data>
- </dict>
- </dict>
- <key>rules</key>
- <dict>
- <key>^.*</key>
- <true/>
- <key>^.*\.lproj/</key>
- <dict>
- <key>optional</key>
- <true/>
- <key>weight</key>
- <real>1000</real>
- </dict>
- <key>^.*\.lproj/locversion.plist$</key>
- <dict>
- <key>omit</key>
- <true/>
- <key>weight</key>
- <real>1100</real>
- </dict>
- <key>^Base\.lproj/</key>
- <dict>
- <key>weight</key>
- <real>1010</real>
- </dict>
- <key>^version.plist$</key>
- <true/>
- </dict>
- <key>rules2</key>
- <dict>
- <key>.*\.dSYM($|/)</key>
- <dict>
- <key>weight</key>
- <real>11</real>
- </dict>
- <key>^(.*/)?\.DS_Store$</key>
- <dict>
- <key>omit</key>
- <true/>
- <key>weight</key>
- <real>2000</real>
- </dict>
- <key>^.*</key>
- <true/>
- <key>^.*\.lproj/</key>
- <dict>
- <key>optional</key>
- <true/>
- <key>weight</key>
- <real>1000</real>
- </dict>
- <key>^.*\.lproj/locversion.plist$</key>
- <dict>
- <key>omit</key>
- <true/>
- <key>weight</key>
- <real>1100</real>
- </dict>
- <key>^Base\.lproj/</key>
- <dict>
- <key>weight</key>
- <real>1010</real>
- </dict>
- <key>^Info\.plist$</key>
- <dict>
- <key>omit</key>
- <true/>
- <key>weight</key>
- <real>20</real>
- </dict>
- <key>^PkgInfo$</key>
- <dict>
- <key>omit</key>
- <true/>
- <key>weight</key>
- <real>20</real>
- </dict>
- <key>^embedded\.provisionprofile$</key>
- <dict>
- <key>weight</key>
- <real>20</real>
- </dict>
- <key>^version\.plist$</key>
- <dict>
- <key>weight</key>
- <real>20</real>
- </dict>
- </dict>
-</dict>
-</plist>
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+ <key>AvailableLibraries</key>
+ <array>
+ <dict>
+ <key>BinaryPath</key>
+ <string>StarburstSdkDirect.framework/StarburstSdkDirect</string>
+ <key>LibraryIdentifier</key>
+ <string>ios-arm64</string>
+ <key>LibraryPath</key>
+ <string>StarburstSdkDirect.framework</string>
+ <key>SupportedArchitectures</key>
+ <array>
+ <string>arm64</string>
+ </array>
+ <key>SupportedPlatform</key>
+ <string>ios</string>
+ </dict>
+ </array>
+ <key>CFBundlePackageType</key>
+ <string>XFWK</string>
+ <key>XCFrameworkFormatVersion</key>
+ <string>1.0</string>
+</dict>
+</plist>
--- /dev/null
+//
+// CustomChatWebSocketClient.h
+// IOT
+//
+// Created by ByteDance on 2026/1/26.
+//
+#import <Foundation/Foundation.h>
+
+@class CustomVoiceChatConfig;
+
+NS_ASSUME_NONNULL_BEGIN
+
+@protocol CustomChatWebSocketClientDelegate <NSObject>
+@optional
+- (void)chatClientDidOpen;
+- (void)chatClientDidCloseWithCode:(NSInteger)code reason:(NSString *_Nullable)reason wasClean:(BOOL)wasClean;
+- (void)chatClientDidFailWithError:(NSError *)error;
+
+- (void)chatClientDidReceiveText:(NSString *)text;
+
+/// 收到 TTS 二进制(如果服务端有 16字节头:dialogId/index/timestamp)
+- (void)chatClientDidReceiveTtsData:(NSData *)data
+ dialogId:(uint32_t)dialogId
+ index:(uint32_t)index
+ timestamp:(uint64_t)timestamp
+ isFinish:(BOOL)isFinish;
+
+- (void)chatClientDidStartStreaming:(NSInteger)dialogId;
+- (void)chatClientDidStopStreaming:(NSInteger)dialogId;
+- (void)chatClientDidInterrupt:(NSInteger)dialogId;
+@end
+
+@interface CustomChatWebSocketClient : NSObject
+
+@property (class, nonatomic, readonly) CustomChatWebSocketClient *shared;
+
+@property (nonatomic, weak) id<CustomChatWebSocketClientDelegate> delegate;
+@property (nonatomic, assign) BOOL enableLog;
+
+/// 外部只控 VAD:YES => start,NO => stop
+@property (atomic, assign, readonly) BOOL vadActive;
+@property (atomic, assign, readonly) BOOL streaming;
+
+/// role 变更 => contextId 变更(保持旧类行为)
+@property (nonatomic, copy, readonly) NSString *contextId;
+
+/// 缓存策略:VAD=true 但尚未open/start时缓存少量音频,防起声丢帧
+@property (nonatomic, assign) BOOL enablePendingAudioBuffer; // default YES
+@property (nonatomic, assign) NSUInteger maxPendingAudioFrames; // default 50
+
+/// 统一配置(可更新)
+- (void)updateConfig:(void (^)(CustomVoiceChatConfig *config))block;
+
+/// 建连/断连(url内部写死)
+- (void)connect;
+- (void)disconnect;
+
+/// 音频源持续 push;只有 vadActive=true 才会真正发送
+- (void)pushAudioFrame:(NSData *)data;
+
+/// VAD控制
+- (void)updateVadActive:(BOOL)active;
+
+/// 主动 stop(等同 VAD=false 的 stop)
+- (void)stop;
+
+/// 打断(保留)
+- (void)interrupt;
+
+/// (可选)如果你们鉴权header需要外部注入token等:只给一个“注入request”的钩子,不接收URL
+- (void)setRequestDecorator:(void (^ _Nullable)(NSMutableURLRequest *request))decorator;
+
+@end
+
+NS_ASSUME_NONNULL_END
--- /dev/null
+//
+// CustomVoiceChatConfig.h
+// IOT
+//
+// Created by ByteDance on 2026/1/26.
+//
+#import <Foundation/Foundation.h>
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface CustomVoiceChatConfig : NSObject
+
+@property (nonatomic, copy, nullable) NSString *role; /// 对话角色
+@property (nonatomic, copy, nullable) NSString *language; /// 如 zh-CN
+
+/// 输入音频(multi_start 字段:format + codec)
+@property (nonatomic, copy) NSString *format; /// default "raw"
+@property (nonatomic, copy) NSString *codec; /// default "raw" / "opus"
+@property (nonatomic, assign) NSInteger sampleRate; /// default 16000
+@property (nonatomic, assign) NSInteger channel; /// default 1
+
+/// 透传:multi_start.extraInfo
+@property (nonatomic, strong, nullable) NSDictionary *extraInfo;
+
+/// TTS
+@property (nonatomic, assign) BOOL tts;
+@property (nonatomic, copy, nullable) NSString *ttsAudioFormat; /// default "pcm"
+@property (nonatomic, copy, nullable) NSString *ttsSpeakerType; /// "clone" etc
+@property (nonatomic, copy, nullable) NSString *ttsSpeakerId;
+
+/// 其它(如你旧类有)
+@property (nonatomic, assign) BOOL debugEnable; /// default YES
+@property (nonatomic, assign) NSInteger ttsBinaryBurstSize; /// default 0
+@property (nonatomic, assign) NSInteger ttsBinaryBurstDelay; /// default 0
+
+@property (nonatomic, copy, nullable) NSString *customPrompt;
+@property (nonatomic, copy, nullable) NSString *pictureFormat; /// default "jpg"
+
+@end
+
+NS_ASSUME_NONNULL_END
--- /dev/null
+//
+// FileProcessingManager.h
+// IOT
+//
+// Created by ByteDance on 2025/12/24.
+//
+
+#import <Foundation/Foundation.h>
+#import "ITaskProcessStatusListener.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+
+@protocol IFileTaskCreatedCallback <NSObject>
+- (void)onTaskCreated:(NSString *)taskId;
+- (void)onError:(NSInteger)code message:(NSString *)message;
+@end
+
+@interface FileProcessingManager : NSObject
+
++ (instancetype)shared;
+
+- (void)createFileAsrTask:(NSURL *)fileURL
+ language:(NSString *)language
+ summary:(BOOL)summary
+ speakerSplit:(BOOL)speakerSplit
+ sampleRate:(int)sampleRate
+ format:(NSString *)format
+ codec:(NSString *)codec
+ callback:(id<IFileTaskCreatedCallback>)callback;
+
+- (void)createTextSummaryTask:(NSString *)text
+ language:(NSString *)language
+ callback:(id<IFileTaskCreatedCallback>)callback;
+
+- (void)addQueryTaskId:(NSString *)taskId;
+- (void)cancelQueryTaskId:(NSString *)taskId;
+- (void)setTaskProcessStatusListener:(id<ITaskProcessStatusListener>)listener;
+- (void)removeAllQueryTask;
+
+@end
+
+NS_ASSUME_NONNULL_END
--- /dev/null
+//
+// FileResultTaskPoller.h
+// IOT
+//
+// Created by ByteDance on 2026/1/5.
+//
+
+#import <Foundation/Foundation.h>
+#import "ITaskProcessStatusListener.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface FileResultTaskPoller : NSObject
+
+- (void)addTask:(NSString *)taskId;
+- (void)cancelTask:(NSString *)taskId;
+- (void)setListener:(id<ITaskProcessStatusListener>)listener;
+- (void)shutdown;
+- (void)removeAll;
+
+@end
+
+NS_ASSUME_NONNULL_END
--- /dev/null
+//
+// SBFileTaskResult.h
+// IOT
+//
+// Created by ByteDance on 2026/1/5.
+//
+
+#import <Foundation/Foundation.h>
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface SBAudioPiece : NSObject
+@property(nonatomic, copy) NSString *text;
+@property(nonatomic, assign) long long startTime; // start_time
+@property(nonatomic, assign) long long endTime; // end_time
+@property(nonatomic, assign) NSInteger speaker; // additions.speaker,解析不到则 -1
+@end
+
+@interface FileTaskResult : NSObject
+@property(nonatomic, assign) NSInteger code;
+@property(nonatomic, copy) NSString *msg;
+@property(nonatomic, copy) NSString *taskId;
+@property(nonatomic, copy) NSString *requestId;
+@property(nonatomic, copy) NSString *text;
+@property(nonatomic, copy) NSString *summary;
+@property(nonatomic, strong) NSArray<SBAudioPiece *> *pieces;
+
++ (nullable instancetype)fromJSONData:(NSData *)data error:(NSError * _Nullable * _Nullable)error;
+@end
+
+NS_ASSUME_NONNULL_END
--- /dev/null
+//
+// ITaskProcessStatusListener.h
+// IOT
+//
+// Created by ByteDance on 2026/1/5.
+//
+
+#import <Foundation/Foundation.h>
+@class FileTaskResult;
+
+NS_ASSUME_NONNULL_BEGIN
+
+@protocol ITaskProcessStatusListener <NSObject>
+- (void)onProcessing:(NSString *)taskId code:(NSInteger)code;
+- (void)onSuccess:(NSString *)taskId result:(FileTaskResult *)result;
+- (void)onFailure:(NSString *)taskId message:(NSString *)message;
+@end
+
+NS_ASSUME_NONNULL_END
//
// StarbaustVoiceChatModel.h
-// StarburstSdk
+// SBD_StarburstSdk
//
// Created by incar on 2024/11/22.
//
#import <Foundation/Foundation.h>
-#import <StarburstSdk/StarburstAsrModel.h>
+#import "StarburstAsrModel.h"
-@interface StarbaustVoiceChatModel : NSObject
+@interface SBD_StarbaustVoiceChatModel : NSObject
@property (nonatomic, assign) NSInteger code;/// 状态码,200成功
@property (nonatomic, strong) NSString *msg;/// 提示语
@property (nonatomic, strong) NSString *requestId;/// 请求id
@property (nonatomic, assign) NSInteger definiteIndex;/// 已确定的识别结果序列号
//@property (nonatomic, assign) NSInteger conversationIndex;/// 已确定的响应结果序列号
@property (nonatomic, assign) BOOL conversationFinish;/// 对话是否结束
-@property (nonatomic, strong) StarburstTranslateResult *translateResult;///翻译结果
-@property (nonatomic, strong) StarburstAsrTtsResult *ttsResult;///tts音频流
+@property (nonatomic, strong) SBD_StarburstTranslateResult *translateResult;///翻译结果
+@property (nonatomic, strong) SBD_StarburstAsrTtsResult *ttsResult;///tts音频流
@property (nonatomic, assign) NSInteger playAudioSampleRate;
@end
//
// StarburstAsrConfig.h
-// StarburstSdk
+// SBD_StarburstSdk
//
// Created by incar on 2024/9/14.
//
//马来语 ms-MY
/// voice chat配置
-@interface StarburstVoiceChatConfig : NSObject
+@interface SBD_StarburstVoiceChatConfig : NSObject
@property (nonatomic, strong) NSString *role;/// 对话⻆⾊设定;默认为⽆特⾊的智能助⼿
//@property (nonatomic, assign) int channel;/// 默认为1,只⽀持1:单声道、2:双声道
@property (nonatomic, strong) NSString *language;/// 语⾔编码,默认为普通话(zh-CN)
@end
/// 手机录音asr配置
-@interface StarburstAsrConfig : NSObject
+@interface SBD_StarburstAsrConfig : NSObject
/// 是否翻译,默认 false。如果为 true 翻译源语言和目标语言不能是同一种语言
@property (nonatomic, assign) BOOL isTranslate;
/// 源语言编码,默认为普通话(zh-CN),auto_lang 自动识别
@property (nonatomic, strong) NSString *ttsType;
/// TTS 声色设置
@property (nonatomic, strong) NSString *ttsSpeaker;
+/// TTS 声色类型
+@property (nonatomic, strong, nullable) NSString *ttsSpeakerType;
+/// TTS 声色 ID
+@property (nonatomic, strong, nullable) NSString *ttsSpeakerId;
+/// 是否使用 LLM 翻译,默认 NO
+@property (nonatomic, assign) BOOL llmTranslate;
/// 音频封装格式(opus 原始流 raw,封装 ogg)
@property (nonatomic, strong) NSString *format;
/// 音频编码格式(opus、raw)
@end
/// 蓝牙耳机录音asr配置
-@interface StarburstBleAsrConfig : NSObject
+@interface SBD_StarburstBleAsrConfig : NSObject
@property (nonatomic, assign) NSInteger type;/// 0x00实时录音,0x0c通话录音,其他待定
@end
/// 文件/文本asr配置
-@interface StarburstAsrFileConfig : NSObject
+@interface SBD_StarburstAsrFileConfig : NSObject
@property (nonatomic, assign) BOOL isTranslate;/// 是否翻译,默认false
@property (nonatomic, strong) NSString *fromLanguage;/// 语⾔编码
@property (nonatomic, strong) NSString *toLanguage;/// ⽬标语⾔编码
/// 翻译增强,默认 NO
@property (nonatomic, assign) BOOL enableTranslateImprove; // enableTranslateImprove
@property (nonatomic, assign) BOOL speakerSplit;/// 是否区分说话人,默认false
+/// TTS 声色类型(如 "clone" 时配合 ttsSpeakerId 使用)
+@property (nonatomic, strong, nullable) NSString *ttsSpeakerType;
+/// TTS 声色 ID
+@property (nonatomic, strong, nullable) NSString *ttsSpeakerId;
+/// 是否使用 LLM 翻译,默认 NO
+@property (nonatomic, assign) BOOL llmTranslate;
@end
/// 翻译配置
-@interface StarburstTslConfig : NSObject
+@interface SBD_StarburstTslConfig : NSObject
@property (nonatomic, strong) NSString *fromLanguage;/// 语⾔编码
@property (nonatomic, strong) NSString *toLanguage;/// ⽬标语⾔编码
+/// TTS 声色类型(如 "clone" 时配合 ttsSpeakerId 使用)
+@property (nonatomic, strong, nullable) NSString *ttsSpeakerType;
+/// TTS 声色 ID
+@property (nonatomic, strong, nullable) NSString *ttsSpeakerId;
+/// 是否使用 LLM 翻译,默认 NO
+@property (nonatomic, assign) BOOL llmTranslate;
@end
//
// StarburstAsrModel.h
-// StarburstSdk
+// SBD_StarburstSdk
//
// Created by incar on 2024/9/13.
//
NS_ASSUME_NONNULL_BEGIN
/// 说话人分离结果(单段)
-@interface StarburstSpeakerSegment : NSObject
+@interface SBD_StarburstSpeakerSegment : NSObject
@property (nonatomic, copy, nullable) NSString *speakerId; /// 说话人ID(字符串,如 "1")
@property (nonatomic, assign) NSInteger startTime; /// 起始时间(ms)
@property (nonatomic, assign) NSInteger endTime; /// 结束时间(ms)
@end
/// 翻译结果
-@interface StarburstTranslateResult : NSObject
+@interface SBD_StarburstTranslateResult : NSObject
@property (nonatomic, copy, nullable) NSString *text; /// 语音识别后翻译的结果片段
@property (nonatomic, assign) BOOL definite; /// 当前翻译片段是否确定
@property (nonatomic, assign) int definiteIndex; /// 已翻译片段序号
@end
/// tts音频流
-@interface StarburstAsrTtsResult : NSObject
+@interface SBD_StarburstAsrTtsResult : NSObject
@property (nonatomic, assign) NSInteger index; /// 音频数据片段的序号
@property (nonatomic, assign) NSInteger translateIndex; /// 翻译的序号
@property (nonatomic, copy, nullable) NSString *streamPiece; /// 音频流(Base64/文本)
@end
/// 识别结果
-@interface StarburstAsrModel : NSObject
+@interface SBD_StarburstAsrModel : NSObject
@property (nonatomic, assign) NSInteger channel; /// 0非立体声,1左声道,2右声道
@property (nonatomic, assign) NSInteger code; /// 状态码
@property (nonatomic, copy, nullable) NSString *msg; /// 提示语
@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, strong, nullable) SBD_StarburstTranslateResult *translateResult; /// 翻译结果
+@property (nonatomic, strong, nullable) SBD_StarburstAsrTtsResult *ttsResult; /// tts音频流
-@property (nonatomic, copy, nullable) NSArray<StarburstSpeakerSegment *> *speakerResult; /// 说话人分离结果数组
+@property (nonatomic, copy, nullable) NSArray<SBD_StarburstSpeakerSegment *> *speakerResult; /// 说话人分离结果数组
+ (instancetype)modelWith:(NSDictionary *)dict;
@end
--- /dev/null
+//
+// StarburstAudioStreamConfig.h
+// IOT
+//
+// Created by ByteDance on 2026/1/29.
+//
+
+
+// StarburstAudioStreamConfig.h
+#import <Foundation/Foundation.h>
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface SBD_StarburstAudioStreamConfig : NSObject
+
+/// "pcm" / "opus" / "aac" ...(由你们协议约定)
+/// 建议统一小写
+@property (nonatomic, copy) NSString *codec;
+
+/// 通用音频参数(对 pcm 必填;对 opus 视你们服务端要求)
+@property (nonatomic, assign) NSInteger sampleRate; // e.g. 16000
+@property (nonatomic, assign) NSInteger channels; // e.g. 1
+
+/// PCM 专用(codec == "pcm" 时使用)
+@property (nonatomic, assign) NSInteger bitsPerSample; // e.g. 16
+
+@property (nonatomic, assign) NSInteger opusInputPackageSize;
+@property (nonatomic, assign) NSInteger opusOutputPackageSize;
+
+@end
+
+NS_ASSUME_NONNULL_END
//
// StarburstConfig.h
-// StarburstSdk
+// SBD_StarburstSdk
//
// Created by liangshi on 2025/6/18.
//
};
-@interface StarburstConfig : NSObject
+@interface SBD_StarburstConfig : NSObject
@property (nonatomic, readonly)NSString *logs;/// 获取日志
@property (nonatomic, strong)void (^logCallback)(NSString *log);/// 日志输出回调
@property (nonatomic, assign)BOOL isDebug;/// 是否打印日志,默认false
//
// StarburstFileAsrModel.h
-// StarburstSdk
+// SBD_StarburstSdk
//
// Created by incar on 2024/9/27.
//
#import <Foundation/Foundation.h>
/// 该段说话人
-@interface StarburstFileAsrAdditions : NSObject
+@interface SBD_StarburstFileAsrAdditions : NSObject
@property (nonatomic, strong) NSString *speaker;/// 该段说话人编号
@end
/// 识别片段
-@interface StarburstFileAsrPieces : NSObject
+@interface SBD_StarburstFileAsrPieces : NSObject
@property (nonatomic, strong) NSString *text;/// 片段识别的内筒
@property (nonatomic, assign) NSInteger start_time;///片段对应文件进度,单位毫秒
@property (nonatomic, assign) NSInteger end_time;/// 片段对应文件进度,单位毫秒
-@property (nonatomic, strong) StarburstFileAsrAdditions *additions;///该段说话人
+@property (nonatomic, strong) SBD_StarburstFileAsrAdditions *additions;///该段说话人
@end
/// 文件识别结果模型
-@interface StarburstFileAsrModel : NSObject
+@interface SBD_StarburstFileAsrModel : NSObject
@property (nonatomic, assign) NSInteger code;/// 状态码
@property (nonatomic, strong) NSString *msg;/// 提示语
@property (nonatomic, strong) NSString *requestId;/// 请求id
@property (nonatomic, strong) NSString *text;/// 语⾳识别内容
@property (nonatomic, strong) NSString *summary;/// 识别摘要内容
@property (nonatomic, strong) NSString *transText;///识别后翻译结果
-@property (nonatomic, strong) NSArray<StarburstFileAsrPieces *> *pieces;///识别片段
+@property (nonatomic, strong) NSArray<SBD_StarburstFileAsrPieces *> *pieces;///识别片段
-+ (StarburstFileAsrModel *)modelWith:(NSDictionary *)dict;
++ (SBD_StarburstFileAsrModel *)modelWith:(NSDictionary *)dict;
@end
//
// StarburstOffLineFile.h
-// StarburstSdk
+// SBD_StarburstSdk
//
// Created by incar on 2024/10/8.
//
NS_ASSUME_NONNULL_BEGIN
/// 离线文件
-@interface StarburstOffLineFile : NSObject
+@interface SBD_StarburstOffLineFile : NSObject
@property (nonatomic, assign) uint8_t fileType;/// 0x00所有文件、0x01左耳列表、0x02右耳列表
@property (nonatomic, assign) NSInteger fileId;/// 文件id
//
// StarburstPhoneSdk.h
-// StarburstSdk
+// SBD_StarburstSdk
//
// Created by liangshi on 2025/3/11.
//
#import <Foundation/Foundation.h>
-#import <StarburstSdk/StarburstSdkManager.h>
-#import <StarburstSdk/StarburstAsrConfig.h>
-#import <StarburstSdk/StarburstAsrModel.h>
-#import <StarburstSdk/StarbaustVoiceChatModel.h>
-#import <StarburstSdk/StarburstFileAsrModel.h>
-#import <StarburstSdk/StarburstOffLineFile.h>
-#import <StarburstSdk/StarburstStreamModel.h>
-#import <StarburstSdk/StarbusrtSpeaker.h>
+#import "StarburstSdkManager.h"
+#import "StarburstAsrConfig.h"
+#import "StarburstAsrModel.h"
+#import "StarbaustVoiceChatModel.h"
+#import "StarburstFileAsrModel.h"
+#import "StarburstOffLineFile.h"
+#import "StarburstStreamModel.h"
+#import "StarbusrtSpeaker.h"
-@interface StarburstPhoneSdk : NSObject
+@interface SBD_StarburstPhoneSdk : NSObject
@property (nonatomic, readonly)BOOL didAuth;/// 是否已经鉴权
@property (nonatomic, strong)void (^websocketStateCallback)(BOOL connected);/// websocket状态回调,true为已连接,false未链接
///// - path: 文件路径
///// - recognize: 识别结果回调
///// - error: 错误回调
-//- (void)asrByFile:(NSURL *)filePath config:(StarburstAsrFileConfig*)config recognizeText:(void (^)(StarburstFileAsrModel*))recognize error:(void (^)(NSError *err))error;
+//- (void)asrByFile:(NSURL *)filePath config:(SBD_StarburstAsrFileConfig*)config recognizeText:(void (^)(SBD_StarburstFileAsrModel*))recognize error:(void (^)(NSError *err))error;
/// 【文本摘要】
/// - Parameters:
/// - text: 识别的文本
/// - recognize: 识别结果回调
/// - error: 错误回调
-- (void)summaryByText:(NSString *)text config:(StarburstAsrFileConfig*)config recognizeText:(void (^)(StarburstFileAsrModel*))recognize error:(void (^)(NSError *err))error;
+- (void)summaryByText:(NSString *)text config:(SBD_StarburstAsrFileConfig*)config recognizeText:(void (^)(SBD_StarburstFileAsrModel*))recognize error:(void (^)(NSError *err))error;
/// 【文本摘要】--流式
/// - Parameters:
/// - text: 摘要的文字
/// - recognize: 结果回调
/// - error: 错误回调
-- (void)summaryByTextWithSplit:(NSString *)text recognizeText:(void (^)(StarburstStreamModel*))recognize error:(void (^)(NSError *err))error;
+- (void)summaryByTextWithSplit:(NSString *)text recognizeText:(void (^)(SBD_StarburstStreamModel*))recognize error:(void (^)(NSError *err))error;
/// 取消 【文本摘要】--流式
-(void)cancelSummaryByTextWithSplit;
/// - config: 翻译配置
/// - recognize: 识别结果回调
/// - error: 错误回调
-- (void)translateByText:(NSString *)text config:(StarburstAsrFileConfig*)config recognizeText:(void (^)(StarburstFileAsrModel*))recognize error:(void (^)(NSError *err))error;
+- (void)translateByText:(NSString *)text config:(SBD_StarburstAsrFileConfig*)config recognizeText:(void (^)(SBD_StarburstFileAsrModel*))recognize error:(void (^)(NSError *err))error;
/// 【文本翻译】--流式
/// - Parameters:
/// - config: 翻译配置
/// - recognize: 结果回调
/// - error: 错误回调
-- (void)translateByTextWithSplit:(NSString *)text config:(StarburstTslConfig*)config recognizeText:(void (^)(StarburstStreamModel*))recognize error:(void (^)(NSError *err))error;
+- (void)translateByTextWithSplit:(NSString *)text config:(SBD_StarburstTslConfig*)config recognizeText:(void (^)(SBD_StarburstStreamModel*))recognize error:(void (^)(NSError *err))error;
/// 取消 【文本翻译】--流式
-(void)cancelTranslateByTextWithSplit;
/// - voiceRecordData: 录音音频流回调
/// - recognizeText: 识别回调
/// - stateChange: 状态回调
-- (void)startRecordAsr:(StarburstAsrConfig*)config voiceRecord:(void (^)(NSData*))voiceData recognizeText:(void (^)(StarburstAsrModel*))recognize stateChange:(void(^)(StarburstCode code))stateChange interruption:(void(^)(void))interrupt;
+- (void)startRecordAsr:(SBD_StarburstAsrConfig*)config voiceRecord:(void (^)(NSData*))voiceData recognizeText:(void (^)(SBD_StarburstAsrModel*))recognize stateChange:(void(^)(StarburstCode code))stateChange interruption:(void(^)(void))interrupt;
/// 【同声传译】结束手机拾音
/// - Parameter fileCallback: 录音文件回调
/// - 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,NSInteger sampleRate))voiceCallBack stateChange:(void(^)(StarburstCode code))stateChange finished:(void(^)(NSString *filePath))path;
+- (void)setupPhoneChatWith:(SBD_StarburstVoiceChatConfig*)config start:(void (^)(NSInteger dialogId))startCallback textCallback:(void (^)(SBD_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(手动控制开始/结束讲话)
/// 获取音色列表
/// - Parameter callBack: 结果回调
-- (void)getVcSpeekerList:(void (^)(NSArray <StarbusrtSpeaker*> *list,BOOL success))callBack;
+- (void)getVcSpeekerList:(void (^)(NSArray <SBD_StarbusrtSpeaker*> *list,BOOL success))callBack;
@end
--- /dev/null
+//
+// Starburst.h
+// Starburst
+//
+// Created by cookies on 2023/6/12.
+//
+
+#import <Foundation/Foundation.h>
+
+//! Project version number for Starburst.
+//FOUNDATION_EXPORT double StarburstSdkVersionNumber;
+
+//! Project version string for Starburst.
+//FOUNDATION_EXPORT const unsigned char StarburstSdkVersionString[];
+
+// In this header, you should import all the public headers of your framework using statements like #import <SBD_StarburstSdk/PublicHeader.h>
+
+#import "StarburstSdkManager.h"
+#import "StarburstConfig.h"
+#import "StarburstPhoneSdk.h"
+#import "StartburstMixSdk.h"
+#import "StartburstGlassesSdk.h"
+#import "StartburstGlassChat.h"
+#import "StarburstAsrConfig.h"
+#import "StarburstAsrModel.h"
+#import "StarburstFileAsrModel.h"
+#import "StarbaustVoiceChatModel.h"
+#import "StarbusrtSpeaker.h"
+#import "StarburstStreamModel.h"
+#import "StarburstOffLineFile.h"
+#import "StartburstDecoderConfig.h"
+#import "TextToImageManager.h"
+#import "TextToImageCallback.h"
+#import "AIGCErrorCode.h"
+#import "TextToSpeechManager.h"
+#import "TextToSpeechCallback.h"
+#import "FileProcessingManager.h"
+#import "FileResultTaskPoller.h"
+#import "FileTaskResult.h"
+#import "StarburstVoiceChatRecorder.h"
+#import "StarburstAudioStreamConfig.h"
+//#import "CustomChatWebSocketClient.h"
+//#import "CustomVoiceChatConfig.h"
--- /dev/null
+//
+// StarburstSdk.h
+// VoiceDemo
+//
+// Created by incar on 2024/9/12.
+//
+
+#import <Foundation/Foundation.h>
+#import "StarburstAsrConfig.h"
+#import "StarburstAsrModel.h"
+#import "StarbaustVoiceChatModel.h"
+#import "StarburstFileAsrModel.h"
+#import "StarburstOffLineFile.h"
+#import "StarburstStreamModel.h"
+#import "StarbusrtSpeaker.h"
+#import "StartburstDecoderConfig.h"
+#import "StarburstVoiceChatRecorder.h"
+
+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,///未鉴权
+};
+
+typedef void (^AudioIntensityInputCallback)(NSArray<NSNumber*> *left,
+ NSArray<NSNumber*> *right,
+ NSTimeInterval timestampMs);
+
+@interface SBD_StarburstSdk : NSObject
+//@property (nonatomic, strong)void (^authSuccessCallback)(void);/// 鉴权成功回调
+@property (nonatomic, strong)void (^authCallback)(int code,NSString *msg);/// 鉴权结果回调,code200代表成功,其他为失败
+@property (nonatomic, readonly)BOOL didAuth;// 是否已经鉴权
+@property (nonatomic, strong)void (^websocketStateCallback)(BOOL connected);/// websocket状态回调,true为已连接,false未链接
+@property (nonatomic, strong)void (^bleRecordStateCallback)(int state);/// 耳机录音状态回调,1录音,2结束录音
+@property (nonatomic, strong)void (^sendToBleCallback)(NSData *data);/// 发送给蓝牙设备
+
+/// 单例
++ (instancetype)shared;
+
+/// 鉴权用时间戳(毫秒),与服务器对齐的 NTP 时间,供 BLE 设备鉴权等使用
++ (long)authTimestampMs;
+
+/// 收到蓝牙设备传过来的数据,交给sdk处理
+/// - Parameter data:数据
+- (void)receiveBleData:(NSData *)data;
+
+/// 蓝牙设备已经连上(蓝牙连接和断开都需要通知sdk)
+- (void)bleConnected;
+
+/// 蓝牙断开连接(在监听到蓝牙断开的时候,调用该方法通知sdk结束当前任务)
+- (void)bleDisConnected;
+
+///// 【文本摘要】
+///// - Parameters:
+///// - text: 识别的文本
+///// - recognize: 识别结果回调
+///// - error: 错误回调
+- (void)summaryByText:(NSString *)text config:(SBD_StarburstAsrFileConfig*)config recognizeText:(void (^)(SBD_StarburstFileAsrModel*))recognize error:(void (^)(NSError *err))error;
+
+/// 【文本摘要】--流式
+/// - Parameters:
+/// - text: 摘要的文字
+/// - recognize: 结果回调
+/// - error: 错误回调
+- (void)summaryByTextWithSplit:(NSString *)text recognizeText:(void (^)(SBD_StarburstStreamModel*))recognize error:(void (^)(NSError *err))error;
+
+/// 取消 【文本摘要】--流式
+-(void)cancelSummaryByTextWithSplit;
+
+/// 【文本翻译】
+/// - Parameters:
+/// - text: 翻译的文字
+/// - config: 翻译配置
+/// - recognize: 识别结果回调
+/// - error: 错误回调
+- (void)translateByText:(NSString *)text config:(SBD_StarburstAsrFileConfig*)config recognizeText:(void (^)(SBD_StarburstFileAsrModel*))recognize error:(void (^)(NSError *err))error;
+
+/// 【文本翻译】--流式
+/// - Parameters:
+/// - text: 翻译的文字
+/// - config: 翻译配置
+/// - recognize: 结果回调
+/// - error: 错误回调
+- (void)translateByTextWithSplit:(NSString *)text config:(SBD_StarburstTslConfig*)config recognizeText:(void (^)(SBD_StarburstStreamModel*))recognize error:(void (^)(NSError *err))error;
+
+
+/// 取消 【文本翻译】--流式
+-(void)cancelTranslateByTextWithSplit;
+
+/// 【同声传译】开始手机拾音
+/// - Parameters:
+/// - config: 识别配置
+/// - voiceRecordData: 录音音频流回调
+/// - recognizeText: 识别回调
+/// - stateChange: 状态回调
+/// - interrupt:打断回调(接听电话等打断)
+- (void)startRecordAsr:(SBD_StarburstAsrConfig*)config voiceRecord:(void (^)(NSData*))voiceData recognizeText:(void (^)(SBD_StarburstAsrModel*))recognize stateChange:(void(^)(StarburstCode code))stateChange interruption:(void(^)(void))interrupt;
+
+/// 【同声传译】结束手机拾音
+/// - Parameter fileCallback: 录音文件回调
+- (void)stopRecordAsr:(void(^)(NSString *filePath))callback;
+
+/// 【自定义音频流识别】开始
+/// - Parameters:
+/// - config: ASR识别配置(和手机拾音配置一致)
+/// - recognize: 文本识别结果回调
+/// - stateChange: 状态变化回调
+- (void)startCustomAsr:(SBD_StarburstAsrConfig*)config
+ recognizeText:(void (^)(SBD_StarburstAsrModel *model))recognize
+ stateChange:(void(^)(StarburstCode code))stateChange;
+
+/// 【自定义音频流识别】按实例 ID 开始(支持多实例,如双路识别)
+/// - Parameters:
+/// - streamerId: 实例标识,如 @"default"、@"secondary"、@"left"、@"right" 等,nil 或空表示默认实例
+/// - config: ASR识别配置
+/// - recognize: 文本识别结果回调
+/// - stateChange: 状态变化回调
+- (void)startCustomAsrWithId:(NSString *)streamerId
+ config:(SBD_StarburstAsrConfig *)config
+ recognizeText:(void (^)(SBD_StarburstAsrModel *model))recognize
+ stateChange:(void(^)(StarburstCode code))stateChange;
+
+/// 【自定义音频流识别】发送音频数据
+/// - Parameter data: 外部采集的音频 PCM 或其他格式(根据 config 设定)
+- (void)sendCustomAudioData:(NSData *)data;
+
+/// 【自定义音频流识别】向指定实例发送音频数据
+/// - Parameters:
+/// - data: 音频数据
+/// - streamerId: 实例标识,nil 或空表示默认实例
+- (void)sendCustomAudioData:(NSData *)data toStreamerId:(NSString *)streamerId;
+
+/// 【自定义音频流识别】结束
+- (void)stopCustomAsr;
+
+/// 【自定义音频流识别】结束指定实例
+/// - Parameter streamerId: 实例标识,nil 或空表示默认实例
+- (void)stopCustomAsrForId:(NSString *)streamerId;
+
+/// 开始耳机拾音
+/// - Parameters:
+/// - config: 识别配置
+- (void)startDeviceRecord:(SBD_StarburstBleAsrConfig*)config;
+
+/// 结束耳机拾音
+- (void)stopDeviceRecord;
+
+/// 设置耳机拾音回调
+/// - Parameters:
+/// - recordPath: 录音文件保存的路径。如果文件已经存在,则音频数据会追加到尾部;如果不存在,则创建新文件;传nil则会按之前时间格式创建新文件
+/// - asrConfig: 识别配置
+/// - bleConfig: 耳机录音类型回调
+/// - recognize: 识别回调
+/// - stateChange: 状态回调
+/// - path: 录音结束,录音文件地址回调
+- (void)setupDeviceRecordWith:(NSString *)recordPath asrConfig:(SBD_StarburstAsrConfig*)asrConfig bleConfig:(void (^)(SBD_StarburstBleAsrConfig*))bleConfig recognizeText:(void (^)(SBD_StarburstAsrModel*))recognize stateChange:(void(^)(StarburstCode code))stateChange finished:(void(^)(NSString *filePath))path;
+
+
+/// opus输出给app,app解码后将数据通过inputPcmData传回给sdk
+- (void)outputOpusData:(void (^)(SBD_StartburstDecoderConfig *copusConfig,NSData*opusData))recordCallBack;
+
+/// opus解码后传给sdk
+- (void)inputPcmData:(NSData *)pcmData;
+
+
+
+
+
+/// 获取音色列表
+/// - Parameter callBack: 结果回调
+- (void)getVcSpeekerList:(void (^)(NSArray <SBD_StarbusrtSpeaker*> *list,BOOL success))callBack;
+
+/// 设置voice chat回调,目前只支持蓝牙设备发起对话
+/// - Parameters:
+/// - config: 对话配置
+/// - startCallBack: 开始回调
+/// - textCallBack: 文本识别回调
+/// - voiceCallBack: AI语音回复回调
+/// - stateChange: 状态回调
+/// - finished:录音地址回调
+- (void)setupVoiceChatWith:(SBD_StarburstVoiceChatConfig*)config start:(void (^)(NSInteger dialogId))startCallback textCallback:(void (^)(SBD_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;
+
+/// 开始播放tts
+- (void)startPlayTtsAudio:(NSInteger)dialogId;
+
+/// 结束播放tts
+- (void)stopPlayTtsAudio:(NSInteger)dialogId;
+
+/// 发送文字对话
+/// - Parameters:
+/// - text: 对话的文字
+/// - isTts: 是否tts
+- (void)sendVoiceChat:(NSString *)text tts:(BOOL)isTts;
+
+
+/// 手机拾音 voice chat(支持自定义 recorder)
+/// - Parameters:
+/// - config: 对话配置
+/// - recorder: 外部录音器(实现 SBD_StarburstVoiceChatRecorder 协议)
+/// - startCallback: 开始回调
+/// - textCallBack: 文本回调
+/// - voiceCallBack: AI 语音回调
+/// - stateChange: 状态回调
+/// - path: 录音文件路径回调
+///
+- (void)setupPhoneChatWith:(SBD_StarburstVoiceChatConfig*)config start:(void (^)(NSInteger dialogId))startCallback textCallback:(void (^)(SBD_StarbaustVoiceChatModel*))textCallBack responseVoice:(void (^)(NSInteger dialogId,NSData*data,BOOL finish,NSInteger sampleRate))voiceCallBack stateChange:(void(^)(StarburstCode code))stateChange finished:(void(^)(NSString *filePath))path;
+
+/// 配置并绑定“手机通话/语音对话”能力(支持自定义录音机)。
+///
+/// 调用流程建议:
+/// 1) 先调用本方法完成配置与回调绑定;
+/// 2) 再调用 startPhoneChat / stopPhoneChat 控制开始/结束
+///
+/// 注意:
+/// - recorder 需要被外部强持有(或 SDK 内部会强持有),否则可能出现 start 不触发/回调不走。
+/// - recorder 负责通过 setUpStart:stop:data:finished: 将音频数据(NSData)持续回传给 SDK。
+///
+/// @param config 语音对话配置(如鉴权、场景、VAD/ASR/TTS 相关策略等)。
+/// @param recorder 自定义录音机(实现 SBD_StarburstVoiceChatRecorder 协议)。
+/// @param startCallback 对话启动回调:SDK 成功创建/开启一次对话后回调,返回 dialogId。
+/// @param textCallBack 文本回调:服务端返回的识别/对话文本模型(字段以 SBD_StarbaustVoiceChatModel 实际定义为准)。
+/// @param voiceCallBack 语音回调:服务端返回的语音数据流(TTS)。
+/// - dialogId: 对应对话 ID
+/// - data: 音频数据(通常为 opus/pcm,取决于 config)
+/// - finish: 是否为最后一包
+/// - sampleRate: 音频采样率(Hz)
+/// @param stateChange 状态回调:SDK 内部状态变化(连接/鉴权/开始/结束/错误等,取决于 StarburstCode 定义)。
+/// @param path 结束回调:本次对话/录音结束后回调文件路径(由 recorder 或 SDK 生成;没有则可能为空字符串)。
+- (void)setupPhoneChatWith:(SBD_StarburstVoiceChatConfig*)config
+ recorder:(id<SBD_StarburstVoiceChatRecorder>)recorder
+ start:(void (^)(NSInteger dialogId))startCallback
+ textCallback:(void (^)(SBD_StarbaustVoiceChatModel *model))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;
+
+- (void)stopPhoneChat;
+
+//不可用
+- (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;
+- (void)setPhoneInputAudioIntensityCallback:(void(^)(NSArray<NSNumber*> *left, NSArray<NSNumber*> *right, NSTimeInterval frameTimestampMs))callback;
+-(NSString *)getDeviceName;
+@end
+
//
// StarburstStreamModel.h
-// StarburstSdk
+// SBD_StarburstSdk
//
// Created by liangshi on 2024/12/20.
//
NS_ASSUME_NONNULL_BEGIN
-@interface StarburstStreamModel : NSObject
+@interface SBD_StarburstStreamModel : NSObject
@property (nonatomic, assign) NSInteger code;//1: processing, 10: complete -1:fail
@property (nonatomic, strong) NSString *msg;//提示文字
@property (nonatomic, strong) NSString *failReason;//失败原因
--- /dev/null
+//
+// StarburstVoiceChatRecorder.h
+// IOT
+//
+// Created by ByteDance on 2026/1/29.
+//
+
+#import <Foundation/Foundation.h>
+@class SBD_StarburstAudioStreamConfig;
+
+NS_ASSUME_NONNULL_BEGIN
+
+/// 自定义录音机协议。
+///
+/// SDK 通过该协议从业务侧获取“输入音频流”,用于语音对话。
+/// 业务侧需要实现本协议,并在 `start/stop` 中驱动采集或读取音频数据,然后通过
+/// `setUpStart:stop:data:finished:` 提供的回调把数据推给 SDK。
+///
+/// 基本调用关系:
+/// 1. SDK 调用 `setUpStart:stop:data:finished:` 注入回调(业务侧保存这些 block);
+/// 2. SDK 调用 `start` 表示开始一次对话/采集;
+/// 3. 业务侧在合适时机调用:
+/// - onStart(config):告知 SDK 本次输入流的参数(采样率/声道/编码格式等);
+/// - onData(data):持续推送音频数据包;
+/// - onStop():告知本次输入结束(不再发送 onData);
+/// - onFinished(filePath):本次录音/输入结束后的文件路径(如不落盘可传空字符串)。
+///
+/// 注意:
+/// - onStart/onStop 语义是“一次会话”的边界:一次会话只调用一次 onStart 与一次 onStop。
+/// - onData 的数据格式、包大小/时长需与 SBD_StarburstAudioStreamConfig 保持一致(例如 PCM16/Opus 等)。
+/// - 若实现了基于 VAD 的门控:应在检测到“开始说话”时触发 onStart;检测到“说话结束”时触发 onStop。
+@protocol SBD_StarburstVoiceChatRecorder <NSObject>
+
+/// VAD 类型/模式(由业务侧或 SDK 配置)。
+/// 具体枚举含义以 SDK 文档/实现为准(例如:0=关闭 VAD,1=VAD),这个是startPhoneChat的时候传入的参数透传。
+///
+/// SDK 可能在 start 前设置该值,业务侧可在录音策略中读取并决定是否启用 VAD 门控。
+@property (nonatomic, assign) NSInteger vadType;
+
+/// SDK 注入回调,业务侧需要保存并在合适时机调用。
+///
+/// @param start 开始回调:业务侧调用一次,传入本次输入音频流配置(编码、采样率、声道、包大小等)。
+/// @param stop 停止回调:业务侧调用一次,表示本次输入结束,不再继续发送 data。
+/// @param data 数据回调:业务侧持续调用,将音频数据包推送给 SDK(NSData 为一包数据)。
+/// @param path 完成回调:业务侧调用一次,返回本次录音/输入对应的文件路径;不落盘可传空字符串。
+- (void)setUpStart:(void(^)(SBD_StarburstAudioStreamConfig *config))start
+ stop:(void(^)(void))stop
+ data:(void(^)(NSData *data))data
+ finished:(void(^)(NSString *filePath))path;
+
+/// 开始一次输入(由 SDK 触发)。
+/// 业务侧一般在该方法内:启动音频采集/读取文件,并在合适时机回调 start/data。
+- (void)start;
+
+/// 停止当前输入(由 SDK 触发)。
+/// 业务侧一般在该方法内:停止采集/读取,并回调 stop/finished(按实现需要)。
+- (void)stop;
+
+@end
+
+NS_ASSUME_NONNULL_END
//
// StarbusrtSpeaker.h
-// StarburstSdk
+// SBD_StarburstSdk
//
// Created by liangshi on 2025/2/18.
//
NS_ASSUME_NONNULL_BEGIN
-@interface StarbusrtSpeaker : NSObject
+@interface SBD_StarbusrtSpeaker : NSObject
@property (nonatomic, strong) NSString *sid;/// 音色id
@property (nonatomic, strong) NSString *name;/// 名称
@property (nonatomic, strong) NSString *type;/// 类型
////
//// Startburst.h
-//// StarburstSdk
+//// SBD_StarburstSdk
////
//// Created by liangshi on 2025/6/11.
////
//
#import <Foundation/Foundation.h>
-@interface StartburstDecoderConfig : NSObject
+@interface SBD_StartburstDecoderConfig : NSObject
@property (nonatomic, assign)NSInteger sampleRate;/// 采样率
@property (nonatomic, assign)NSInteger numChannels;/// 声道数
@property (nonatomic, assign)NSInteger encodedFrameLength;/// 编码后每帧字节数
//
// StartburstGlassChat.h
-// StarburstSdk
+// SBD_StarburstSdk
//
// Created by liangshi on 2025/5/6.
//
#import <Foundation/Foundation.h>
-#import <StarburstSdk/StarburstSdkManager.h>
-#import <StarburstSdk/StarbaustVoiceChatModel.h>
-#import <StarburstSdk/StarbusrtSpeaker.h>
+#import "StarburstSdkManager.h"
+#import "StarbaustVoiceChatModel.h"
+#import "StarbusrtSpeaker.h"
-@interface StartburstGlassChat : NSObject
+@interface SBD_StartburstGlassChat : NSObject
///
/// 对话设置
/// - Parameters:
/// - voiceCallBack: AI语音回复回调
/// - stateChange: 状态回调
/// - finished:录音地址回调
-- (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)setupPhoneChatWith:(SBD_StarburstVoiceChatConfig*)config textCallback:(void (^)(SBD_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;
/// - Parameter text:文本
- (void)fireText:(NSString *)text;
+- (void)requestSpeakerListWithContextId:(NSString *)contextId
+customPrompt:(NSString *)customPrompt
+callback:(void (^)(NSArray *list, BOOL success))callback;
+
@end
//
// StartburstGlassesSdk.h
-// StarburstSdk
+// SBD_StarburstSdk
//
// Created by liangshi on 2025/4/29.
//
#import <Foundation/Foundation.h>
-#import <StarburstSdk/StarburstSdkManager.h>
-#import <StarburstSdk/StarburstAsrConfig.h>
-#import <StarburstSdk/StarburstAsrModel.h>
-#import <StarburstSdk/StarbaustVoiceChatModel.h>
-#import <StarburstSdk/StarburstFileAsrModel.h>
-#import <StarburstSdk/StarburstOffLineFile.h>
-#import <StarburstSdk/StarburstStreamModel.h>
-#import <StarburstSdk/StarbusrtSpeaker.h>
-#import <StarburstSdk/StartburstGlassChat.h>
-
-@interface StartburstGlassesSdk : NSObject
+#import "StarburstSdkManager.h"
+#import "StarburstAsrConfig.h"
+#import "StarburstAsrModel.h"
+#import "StarbaustVoiceChatModel.h"
+#import "StarburstFileAsrModel.h"
+#import "StarburstOffLineFile.h"
+#import "StarburstStreamModel.h"
+#import "StarbusrtSpeaker.h"
+#import "StartburstGlassChat.h"
+
+@interface SBD_StartburstGlassesSdk : NSObject
@property (nonatomic, strong)void (^sendToBleCallback)(NSData *data);/// 发送给蓝牙设备
@property (nonatomic, strong)void (^authCallback)(int code,NSString *msg);/// 鉴权结果回调,code200代表成功,其他为失败
@property (nonatomic, readonly)BOOL didAuth;/// 是否已经鉴权
-@property (nonatomic, strong)StartburstGlassChat *chat;/// 对话对象
+@property (nonatomic, strong)SBD_StartburstGlassChat *chat;/// 对话对象
/// 单利
+ (instancetype)shared;
/// - text: 识别的文本
/// - recognize: 识别结果回调
/// - error: 错误回调
-- (void)summaryByText:(NSString *)text config:(StarburstAsrFileConfig*)config recognizeText:(void (^)(StarburstFileAsrModel*))recognize error:(void (^)(NSError *err))error;
+- (void)summaryByText:(NSString *)text config:(SBD_StarburstAsrFileConfig*)config recognizeText:(void (^)(SBD_StarburstFileAsrModel*))recognize error:(void (^)(NSError *err))error;
/// 【文本摘要】--流式
/// - Parameters:
/// - text: 摘要的文字
/// - recognize: 结果回调
/// - error: 错误回调
-- (void)summaryByTextWithSplit:(NSString *)text recognizeText:(void (^)(StarburstStreamModel*))recognize error:(void (^)(NSError *err))error;
+- (void)summaryByTextWithSplit:(NSString *)text recognizeText:(void (^)(SBD_StarburstStreamModel*))recognize error:(void (^)(NSError *err))error;
/// 取消 【文本摘要】--流式
-(void)cancelSummaryByTextWithSplit;
/// - config: 翻译配置
/// - recognize: 识别结果回调
/// - error: 错误回调
-- (void)translateByText:(NSString *)text config:(StarburstAsrFileConfig*)config recognizeText:(void (^)(StarburstFileAsrModel*))recognize error:(void (^)(NSError *err))error;
+- (void)translateByText:(NSString *)text config:(SBD_StarburstAsrFileConfig*)config recognizeText:(void (^)(SBD_StarburstFileAsrModel*))recognize error:(void (^)(NSError *err))error;
/// 【文本翻译】--流式
/// - Parameters:
/// - config: 翻译配置
/// - recognize: 结果回调
/// - error: 错误回调
-- (void)translateByTextWithSplit:(NSString *)text config:(StarburstTslConfig*)config recognizeText:(void (^)(StarburstStreamModel*))recognize error:(void (^)(NSError *err))error;
+- (void)translateByTextWithSplit:(NSString *)text config:(SBD_StarburstTslConfig*)config recognizeText:(void (^)(SBD_StarburstStreamModel*))recognize error:(void (^)(NSError *err))error;
/// 取消 【文本翻译】--流式
-(void)cancelTranslateByTextWithSplit;
/// - voiceRecordData: 录音音频流回调
/// - recognizeText: 识别回调
/// - stateChange: 状态回调
-- (void)startRecordAsr:(StarburstAsrConfig*)config voiceRecord:(void (^)(NSData*))voiceData recognizeText:(void (^)(StarburstAsrModel*))recognize stateChange:(void(^)(StarburstCode code))stateChange interruption:(void(^)(void))interrupt;
+- (void)startRecordAsr:(SBD_StarburstAsrConfig*)config voiceRecord:(void (^)(NSData*))voiceData recognizeText:(void (^)(SBD_StarburstAsrModel*))recognize stateChange:(void(^)(StarburstCode code))stateChange interruption:(void(^)(void))interrupt;
/// 【同声传译】结束手机拾音
/// - Parameter fileCallback: 录音文件回调
/// 开始自定义音频流识别
-- (void)startCustomAsr:(StarburstAsrConfig*)config
- recognizeText:(void (^)(StarburstAsrModel *model))recognize
+- (void)startCustomAsr:(SBD_StarburstAsrConfig*)config
+ recognizeText:(void (^)(SBD_StarburstAsrModel *model))recognize
stateChange:(void(^)(StarburstCode code))stateChange;
+/// 开始自定义音频流识别(支持多实例,streamerId 如 @"left"、@"right",nil 为默认实例)
+- (void)startCustomAsrWithId:(NSString *)streamerId
+ config:(SBD_StarburstAsrConfig *)config
+ recognizeText:(void (^)(SBD_StarburstAsrModel *model))recognize
+ stateChange:(void(^)(StarburstCode code))stateChange;
+
/// 发送一段自定义音频数据(采样率、格式需匹配 config 设定)
- (void)sendCustomAudioData:(NSData *)data;
+/// 向指定实例发送自定义音频数据
+- (void)sendCustomAudioData:(NSData *)data toStreamerId:(NSString *)streamerId;
+
/// 停止自定义音频流识别
- (void)stopCustomAsr;
+/// 停止指定实例的自定义音频流识别
+- (void)stopCustomAsrForId:(NSString *)streamerId;
+
/// 获取音色列表
/// - Parameter callBack: 结果回调
-- (void)getVcSpeekerList:(void (^)(NSArray <StarbusrtSpeaker*> *list,BOOL success))callBack;
-
+- (void)getVcSpeekerList:(void (^)(NSArray <SBD_StarbusrtSpeaker*> *list,BOOL success))callBack;
@end
//
// StartburstMixSdk.h
-// StarburstSdk
+// SBD_StarburstSdk
//
// Created by liangshi on 2025/4/22.
//
#import <Foundation/Foundation.h>
-#import <StarburstSdk/StarburstSdkManager.h>
-#import <StarburstSdk/StarburstAsrConfig.h>
-#import <StarburstSdk/StarburstAsrModel.h>
-#import <StarburstSdk/StarbaustVoiceChatModel.h>
-#import <StarburstSdk/StarburstFileAsrModel.h>
-#import <StarburstSdk/StarburstOffLineFile.h>
-#import <StarburstSdk/StarburstStreamModel.h>
-#import <StarburstSdk/StarbusrtSpeaker.h>
-
-@interface StartburstMixSdk : NSObject
+#import "StarburstSdkManager.h"
+#import "StarburstAsrConfig.h"
+#import "StarburstAsrModel.h"
+#import "StarbaustVoiceChatModel.h"
+#import "StarburstFileAsrModel.h"
+#import "StarburstOffLineFile.h"
+#import "StarburstStreamModel.h"
+#import "StarbusrtSpeaker.h"
+#import "StarburstVoiceChatRecorder.h"
+
+@interface SBD_StartburstMixSdk : NSObject
@property (nonatomic, strong)void (^authCallback)(int code,NSString *msg);/// 鉴权结果回调,code200代表成功,其他为失败
@property (nonatomic, readonly)BOOL didAuth;/// 是否已经鉴权
/// - text: 识别的文本
/// - recognize: 识别结果回调
/// - error: 错误回调
-- (void)summaryByText:(NSString *)text config:(StarburstAsrFileConfig*)config recognizeText:(void (^)(StarburstFileAsrModel*))recognize error:(void (^)(NSError *err))error;
+- (void)summaryByText:(NSString *)text config:(SBD_StarburstAsrFileConfig*)config recognizeText:(void (^)(SBD_StarburstFileAsrModel*))recognize error:(void (^)(NSError *err))error;
/// 【文本摘要】--流式
/// - Parameters:
/// - text: 摘要的文字
/// - recognize: 结果回调
/// - error: 错误回调
-- (void)summaryByTextWithSplit:(NSString *)text recognizeText:(void (^)(StarburstStreamModel*))recognize error:(void (^)(NSError *err))error;
+- (void)summaryByTextWithSplit:(NSString *)text recognizeText:(void (^)(SBD_StarburstStreamModel*))recognize error:(void (^)(NSError *err))error;
/// 取消 【文本摘要】--流式
-(void)cancelSummaryByTextWithSplit;
/// - config: 翻译配置
/// - recognize: 识别结果回调
/// - error: 错误回调
-- (void)translateByText:(NSString *)text config:(StarburstAsrFileConfig*)config recognizeText:(void (^)(StarburstFileAsrModel*))recognize error:(void (^)(NSError *err))error;
+- (void)translateByText:(NSString *)text config:(SBD_StarburstAsrFileConfig*)config recognizeText:(void (^)(SBD_StarburstFileAsrModel*))recognize error:(void (^)(NSError *err))error;
/// 【文本翻译】--流式
/// - Parameters:
/// - config: 翻译配置
/// - recognize: 结果回调
/// - error: 错误回调
-- (void)translateByTextWithSplit:(NSString *)text config:(StarburstTslConfig*)config recognizeText:(void (^)(StarburstStreamModel*))recognize error:(void (^)(NSError *err))error;
+- (void)translateByTextWithSplit:(NSString *)text config:(SBD_StarburstTslConfig*)config recognizeText:(void (^)(SBD_StarburstStreamModel*))recognize error:(void (^)(NSError *err))error;
/// 取消 【文本翻译】--流式
-(void)cancelTranslateByTextWithSplit;
/// - voiceRecordData: 录音音频流回调
/// - recognizeText: 识别回调
/// - stateChange: 状态回调
-- (void)startRecordAsr:(StarburstAsrConfig*)config voiceRecord:(void (^)(NSData*))voiceData recognizeText:(void (^)(StarburstAsrModel*))recognize stateChange:(void(^)(StarburstCode code))stateChange interruption:(void(^)(void))interrupt;
+- (void)startRecordAsr:(SBD_StarburstAsrConfig*)config voiceRecord:(void (^)(NSData*))voiceData recognizeText:(void (^)(SBD_StarburstAsrModel*))recognize stateChange:(void(^)(StarburstCode code))stateChange interruption:(void(^)(void))interrupt;
/// 【同声传译】结束手机拾音
/// - Parameter fileCallback: 录音文件回调
/// - 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, NSInteger sampleRate))voiceCallBack stateChange:(void(^)(StarburstCode code))stateChange finished:(void(^)(NSString *filePath))path;
+- (void)setupPhoneChatWith:(SBD_StarburstVoiceChatConfig*)config start:(void (^)(NSInteger dialogId))startCallback textCallback:(void (^)(SBD_StarbaustVoiceChatModel*))textCallBack responseVoice:(void (^)(NSInteger dialogId,NSData*data,BOOL finish, NSInteger sampleRate))voiceCallBack stateChange:(void(^)(StarburstCode code))stateChange finished:(void(^)(NSString *filePath))path;
+#pragma mark - voice chat (新:支持自定义 recorder)
+- (void)setupPhoneChatWith:(SBD_StarburstVoiceChatConfig*)config
+ recorder:(id<SBD_StarburstVoiceChatRecorder>)recorder
+ start:(void (^)(NSInteger dialogId))startCallback
+ textCallback:(void (^)(SBD_StarbaustVoiceChatModel *model))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
/// 获取音色列表
/// - Parameter callBack: 结果回调
-- (void)getVcSpeekerList:(void (^)(NSArray <StarbusrtSpeaker*> *list,BOOL success))callBack;
+- (void)getVcSpeekerList:(void (^)(NSArray <SBD_StarbusrtSpeaker*> *list,BOOL success))callBack;
@end
#import <Foundation/Foundation.h>
-#import <StarburstSdk/AIGCErrorCode.h>
+#import "AIGCErrorCode.h"
/**
* 文本生成图片回调协议
#import <Foundation/Foundation.h>
-#import <StarburstSdk/TextToImageCallback.h>
+#import "TextToImageCallback.h"
NS_ASSUME_NONNULL_BEGIN
#import <Foundation/Foundation.h>
-#import <StarburstSdk/TextToSpeechCallback.h>
+#import "TextToSpeechCallback.h"
NS_ASSUME_NONNULL_BEGIN
* @param reqId 请求唯一标识,用于排查日志或防重复请求
* @param speedRatio 合成语音的语速倍率(1.0 为正常语速,>1.0 为加快,<1.0 为减慢)
* @param voiceType 音色类型标识(例如 "zh_female_qingchezizi_moon_bigtts")
- * @param encoding 音频编码格式(如 "pcm"、"mp3"、"wav"),可为 nil 使用默认编码
+ * @param encoding wav / pcm / ogg_opus / mp3,默认为 pcm
* @param callback 回调对象,须实现 TextToSpeechCallback 协议,用于接收结果或错误
*
- * @discussion 此方法会向云端发送 TTS 请求,云端返回后通过 callback 通知调用方。
- * 建议:
- * - 确保 text 不超过服务端最大长度限制
- * - speedRatio 和 voiceType 需符合云端支持范围
- * - callback 在主线程回调,可直接更新 UI 或播放音频
*/
- (void)textToSpeech:(NSString *)companyId
text:(NSString *)text
-framework module StarburstSdk {
+framework module StarburstSdkDirect {
umbrella header "StarburstSdk.h"
export *
-
module * { export * }
}
);
target = 3F887B9B2E38D8DC00C98658 /* ShenYin */;
};
+ 3FCB2E7F2F6AAE8C007AB47F /* Exceptions for "DeepChordsSdk" folder in "playboy" target */ = {
+ isa = PBXFileSystemSynchronizedBuildFileExceptionSet;
+ membershipExceptions = (
+ StarburstSdkDirect.xcframework,
+ );
+ target = 3FD1DFE32F0E00BF00A62733 /* playboy */;
+ };
3FD1DFF52F0E00BF00A62733 /* Exceptions for "ShenYin" folder in "playboy" target */ = {
isa = PBXFileSystemSynchronizedBuildFileExceptionSet;
membershipExceptions = (
);
target = 3FD1DFE32F0E00BF00A62733 /* playboy */;
};
- 3FFB77C82F17A14C00EF9A60 /* Exceptions for "DeepChordsSdk" folder in "playboy" target */ = {
- isa = PBXFileSystemSynchronizedBuildFileExceptionSet;
- membershipExceptions = (
- StarburstSdk.framework,
- );
- target = 3FD1DFE32F0E00BF00A62733 /* playboy */;
- };
/* End PBXFileSystemSynchronizedBuildFileExceptionSet section */
/* Begin PBXFileSystemSynchronizedGroupBuildPhaseMembershipExceptionSet section */
Channel/PLAYBOY/DcSdk/tool/JLAudioUnitKit.xcframework,
);
};
- 3FFB77C62F17A11100EF9A60 /* Exceptions for "DeepChordsSdk" folder in "Embed Frameworks" phase from "DeepChordsSdk" target */ = {
+ 3FCB2E832F6AAEC8007AB47F /* Exceptions for "DeepChordsSdk" folder in "Embed Frameworks" phase from "DeepChordsSdk" target */ = {
isa = PBXFileSystemSynchronizedGroupBuildPhaseMembershipExceptionSet;
attributesByRelativePath = {
- StarburstSdk.framework = (CodeSignOnCopy, RemoveHeadersOnCopy, );
+ StarburstSdkDirect.xcframework = (CodeSignOnCopy, RemoveHeadersOnCopy, );
};
buildPhase = 3FFB77C52F17A11100EF9A60 /* Embed Frameworks */;
membershipExceptions = (
- StarburstSdk.framework,
+ StarburstSdkDirect.xcframework,
+ );
+ };
+ 3FCB2E862F6AAEEE007AB47F /* Exceptions for "DeepChordsSdk" folder in "Embed Frameworks" phase from "playboy" target */ = {
+ isa = PBXFileSystemSynchronizedGroupBuildPhaseMembershipExceptionSet;
+ attributesByRelativePath = {
+ StarburstSdkDirect.xcframework = (CodeSignOnCopy, RemoveHeadersOnCopy, );
+ };
+ buildPhase = 3FD1DFEF2F0E00BF00A62733 /* Embed Frameworks */;
+ membershipExceptions = (
+ StarburstSdkDirect.xcframework,
);
};
/* End PBXFileSystemSynchronizedGroupBuildPhaseMembershipExceptionSet section */
0D54E0F02F0A61E600A80EE7 /* DeepChordsSdk */ = {
isa = PBXFileSystemSynchronizedRootGroup;
exceptions = (
- 3FFB77C62F17A11100EF9A60 /* Exceptions for "DeepChordsSdk" folder in "Embed Frameworks" phase from "DeepChordsSdk" target */,
- 3FFB77C82F17A14C00EF9A60 /* Exceptions for "DeepChordsSdk" folder in "playboy" target */,
+ 3FCB2E832F6AAEC8007AB47F /* Exceptions for "DeepChordsSdk" folder in "Embed Frameworks" phase from "DeepChordsSdk" target */,
+ 3FCB2E7F2F6AAE8C007AB47F /* Exceptions for "DeepChordsSdk" folder in "playboy" target */,
+ 3FCB2E862F6AAEEE007AB47F /* Exceptions for "DeepChordsSdk" folder in "Embed Frameworks" phase from "playboy" target */,
);
path = DeepChordsSdk;
sourceTree = "<group>";
CODE_SIGN_ENTITLEMENTS = ShenYin/Channel/PLAYBOY/PLAYBOY.entitlements;
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
- CURRENT_PROJECT_VERSION = 202603171655;
+ CURRENT_PROJECT_VERSION = 202603181655;
DEVELOPMENT_TEAM = JKLJ58J33Q;
FRAMEWORK_SEARCH_PATHS = (
"$(inherited)",
"$(PROJECT_DIR)/ShenYin/Sdk/Ota",
"$(PROJECT_DIR)/ShenYin/Sdk/JoySdk",
"$(PROJECT_DIR)/ShenYin/Sdk/JoySdk/tool",
+ "$(PROJECT_DIR)/ShenYin/Channel/DeepChords/JoySdk/tool",
);
GENERATE_INFOPLIST_FILE = YES;
INFOPLIST_FILE = ShenYin/Channel/PLAYBOY/PLAYBOY.plist;
CODE_SIGN_ENTITLEMENTS = ShenYin/Channel/PLAYBOY/PLAYBOY.entitlements;
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
- CURRENT_PROJECT_VERSION = 202603171655;
+ CURRENT_PROJECT_VERSION = 202603181655;
DEVELOPMENT_TEAM = JKLJ58J33Q;
FRAMEWORK_SEARCH_PATHS = (
"$(inherited)",
"$(PROJECT_DIR)/ShenYin/Sdk/JoySdk",
"$(PROJECT_DIR)/ShenYin/Sdk/JoySdk/tool",
"$(PROJECT_DIR)/DeepChordsSdk",
+ "$(PROJECT_DIR)/ShenYin/Channel/DeepChords/JoySdk/tool",
);
GENERATE_INFOPLIST_FILE = YES;
INFOPLIST_FILE = ShenYin/Channel/PLAYBOY/PLAYBOY.plist;
HttpClient.request(CommomApi.token) { [weak self](model:UserInfoRoot,res) in
guard let self = self else{return}
if model.isSuccess {
- self.info = model.data
self.info = model.data
UserCache.shared.save(self.info)
finished?(true)
}
}
func getUserInfo(finished: ((Bool) -> Void)? = nil){
- if CCDevice.isJoy {
+ if CCConfig.appType == .deepchords {
HttpClient.request(CommomApi.getUserInfo) { [weak self](model:UserInfoRoot,res) in
guard let self = self else{return}
if model.isSuccess{
--- /dev/null
+//
+// CCCommon.swift
+// ShenYin
+//
+// Created by liangshi on 2026/3/18.
+//
+
+enum CCAppType{
+ case deepchords
+ case playboy
+ case common
+}
+
+enum CCSdkType{
+ case joy
+ case lianJuXing
+}
let nc4 = BaseNC(rootViewController: mineVC)
nc4.tabBarItem = item4
- if CCDevice.showRaisound {
+ if CCConfig.showRaisoundChat {
nc3 = BaseNC(rootViewController: RSChatVC())
nc3.tabBarItem = UITabBarItem(title: "AI".l10n, image: UIImage(named: "tab_2_normal")?.withRenderingMode(.alwaysOriginal), selectedImage: UIImage(named: "tab_2_selected")?.withRenderingMode(.alwaysOriginal))
}
self.tabBar.backgroundColor = .white
view.backgroundColor = .color(.bgColor)
-
-
-
-
// self.selectedIndex = 3
}
}
//// devices.append(DCPeripheral(device: peripheral,mac: mac))
//// discoverDeviceCallback?(devices)
// }
- if CCDevice.isJoy{
+ if CCConfig.sdkType == .joy{
let mac = JoySdkManager.getMac(advertisementData) ?? ""
devices.append(DCPeripheral(device: peripheral,mac: mac))
discoverDeviceCallback?(devices)
stopScanDevice()
Logger.debug("蓝牙已连接 \(peripheral)")
peripheral.delegate = self
- if CCDevice.isJoy{
+ if CCConfig.sdkType == .joy{
peripheral.discoverServices([CBUUID(string: JoySdkManager.serviceUUID),CBUUID(string: OtaMananger.otaServiceUUId)]);
}
else{
Logger.debug("蓝牙已断开 \(peripheral)","error \(error)")
YLprogressHUD.showAutoHiden("蓝牙已断开".l10n)
self.isConnetd = false
- if CCDevice.isJoy{
+ if CCConfig.sdkType == .joy{
JoySdkManager.shared.bleDisConnected()
}
else{
}
func peripheral(_ peripheral: CBPeripheral, didDiscoverCharacteristicsFor service: CBService, error: Error?) {
- if CCDevice.isJoy{
+ if CCConfig.sdkType == .joy{
if (service.uuid.uuidString == JoySdkManager.serviceUUID) {
JoySdkManager.shared.peripheral(peripheral, didDiscoverCharacteristicsFor: service, error: error)
}
}
func peripheral(_ peripheral: CBPeripheral, didUpdateNotificationStateFor characteristic: CBCharacteristic, error: (any Error)?) {
- if CCDevice.isJoy{
+ if CCConfig.sdkType == .joy{
if (characteristic.isNotifying == true && characteristic.service?.uuid.uuidString == JoySdkManager.serviceUUID && characteristic.uuid.uuidString == JoySdkManager.notifyUUID) {
- Logger.debug("特征使能成功")
JoySdkManager.shared.bleConnected()
}
if OtaMananger.isOtadata(characteristic){
func peripheral(_ peripheral: CBPeripheral, didUpdateValueFor characteristic: CBCharacteristic, error: Error?) {
// Logger.debug("收到数据 ===uUId ",characteristic.uuid)
- if CCDevice.isJoy{
+ if CCConfig.sdkType == .joy{
if OtaMananger.isOtadata(characteristic){
if let _ = characteristic.value,error == nil {
OtaMananger.shared.otaManager.peripheral(peripheral, didUpdateValueFor: characteristic)
// devices.append(DCPeripheral(device: item,mac: mac))
// }
// }
- if CCDevice.isJoy{
+ if CCConfig.sdkType == .joy{
centralManager.scanForPeripherals(withServices: [CBUUID(string: JoySdkManager.serviceUUID)],options: [CBCentralManagerScanOptionAllowDuplicatesKey : false])
}
else{
}
func checkSettingsConnected()->[CBPeripheral]{
- if CCDevice.isJoy {
+ if CCConfig.sdkType == .joy {
let list = centralManager.retrieveConnectedPeripherals(withServices: [CBUUID(string: JoySdkManager.serviceUUID)])
Logger.debug("已连接设备",list)
return list
//
class CCConfig{
+ /// app类型
+ static let appType = CCAppType.deepchords
+ /// sdk类型
+ static let sdkType = CCSdkType.joy
+ /// 是否显示北科AI
+ static var showRaisoundChat = false
+
+ /// app语言
static var appLanguage = AppSupportLanguage.english
-
+ /// 微信id
static let wxAppID = "wxd9d677e0024caa90"
+ // 通用链接
static let wxUniversalLink = "https://dc-cloud-pub.tos-cn-guangzhou.volces.com/app/"
+ /// appstore地址
static let appStoreLink = "https://itunes.apple.com/cn/app/6752551504?mt=8"
/// 版本检测
static let appStoreVersionURL = "https://itunes.apple.com/cn/lookup?id=6752551504"
/// 用户隐私协议地址
static let yonghuBaseURL = "https://pub-tos.deepchords.com"
+
+
+
+
+
+
+
+
+ static let revokeText = "请您确保您是有权进行本撤回同意隐私政策操作的相关当事人。撤回同意隐私政策,您将放弃以下资产或者权益:\n\n1.数据清空\n将会停止收集您的个人信息。您使用DeepChords应用过程中产生的数据将被清空;手机中DeepChords应用的缓存数据将被清除。\n\n2.设备解除绑定\nDeepChords账号中,所有设备会与您当前登录的账号解除绑定,并清除设备之前存储在服务器的数据。存储在物理设备中的数据请通过人工本地物理重置来清除。如果您需要重新使用设备,需要您再次进行绑定并且重新授权。\n\n3.其他\n此举还将撤回您对用户协议的同意,并退出DeepChords应用。\n\n请您知悉,撤回同意隐私政策不代表撤回同意前的相关行为和责任得到豁免或减轻。若您需要重新在该账号管理设备,需要您重新授权并绑定。请谨慎操作!"
}
//
import JoyGemAI
class CCDevice{
- static var isJoy = true
- static var showRaisound = false
static func initSdk(){
- if CCDevice.isJoy {
+ if CCConfig.sdkType == .joy {
JoySdkManager.shared.setupSdk()
}
else{
}
}
static func translate(text:String,from:String,to:String,finished:@escaping ((stream:String,finish:Bool)?)->Void){
- if isJoy {
+ if CCConfig.sdkType == .joy {
JoyGemAIManager.shared().cancelTranslateRequest()
JoyGemAIManager.shared().translate(text, from: from, to: to) { result, finish in
finished((result,finish))
}
}
static func summary(text:String,finished:@escaping ((stream:String,finish:Bool)?)->Void){
- if isJoy {
+ if CCConfig.sdkType == .joy {
JoyGemAIManager.shared().cancelSummaryRequest()
JoyGemAIManager.shared().summary(text) { text, finish in
finished((text,finish))
}
extension CCDevice{
static func findHeadphone(_ mode:FindType){
- if CCDevice.isJoy {
+ if CCConfig.sdkType == .joy {
var value:JoyGemFindHeadphoneMode = .all
switch mode {
case .left:
}
}
static func getEQMode(finished:@escaping (ModeEffectsType?)->Void){
- if CCDevice.isJoy {
+ if CCConfig.sdkType == .joy {
JoyGemAIManager.shared().device.getEQMode { mode in
var value:ModeEffectsType = .normal
switch mode {
}
}
static func setEQMode(_ type:ModeEffectsType){
- if CCDevice.isJoy {
+ if CCConfig.sdkType == .joy {
var value:JoyGemEQMode = .normal
switch type {
case .normal:
static func getCustomEQ(finished:@escaping ([NSNumber]?)->Void){
- if CCDevice.isJoy {
+ if CCConfig.sdkType == .joy {
JoyGemAIManager.shared().device.getCustomEQ { eq in
Logger.debug("getCustomEQ:\(eq)");
finished(eq.bands)
}
}
static func resetCustomEQ(){
- if CCDevice.isJoy {
+ if CCConfig.sdkType == .joy {
JoyGemAIManager.shared().device.resetCustomEQ { err in
Logger.debug("resetCustomEQ:\(err)");
}
}
}
static func setCustomEQ(index:Int,value:Int){
- if CCDevice.isJoy {
+ if CCConfig.sdkType == .joy {
JoyGemAIManager.shared().device.setCustomEQ(UInt(index), withGain: value) { err in
Logger.debug("setCustomEQ:\(err)");
}
// }
// }
static func getDN(finished:@escaping ((_ mac:String?)->Void)) {
- if CCDevice.isJoy {
+ if CCConfig.sdkType == .joy {
JoyGemAIManager.shared().device.getDN { deviceName in
finished(deviceName)
} error: { error in
}
}
static func getVersion(finished:@escaping ((_ version:String?)->Void)) {
- if CCDevice.isJoy {
+ if CCConfig.sdkType == .joy {
JoyGemAIManager.shared().device.software { version in
finished(version)
} error: { error in
class CCPage{
static func gotoChat(){
AudioPlayView.shared.closeAction()
- if CCDevice.isJoy {
+ if CCConfig.sdkType == .joy {
App.shared.goToPage(JoyChatVC())
}
else{
}
static func gotoFieldRecord(){
AudioPlayView.shared.closeAction()
- if CCDevice.isJoy {
+ if CCConfig.sdkType == .joy {
App.shared.goToPage(JoyXclyVC())
}
else{
}
static func gotoCallRecord(){
AudioPlayView.shared.closeAction()
- if CCDevice.isJoy {
+ if CCConfig.sdkType == .joy {
if JoySdkManager.shared.callRecord.supportStereo{
App.shared.goToPage(JoyStereoCallVC())
}
}
static func gotoChinese2Enlgish(){
AudioPlayView.shared.closeAction()
- if CCDevice.isJoy {
+ if CCConfig.sdkType == .joy {
App.shared.goToPage(JoyChinese2EnglishVC())
}
else{
}
static func gotoTcty(){
AudioPlayView.shared.closeAction()
- if CCDevice.isJoy {
+ if CCConfig.sdkType == .joy {
App.shared.goToPage(JoyTctyVC())
}
else{
}
static func gotoDialogTranslate(){
AudioPlayView.shared.closeAction()
- if CCDevice.isJoy {
+ if CCConfig.sdkType == .joy {
App.shared.goToPage(JoyDialogTranslateVC())
}
else{
}
}
static func gotoSubTitle(){
- if CCDevice.isJoy {
+ if CCConfig.sdkType == .joy{
if #available(iOS 15.0, *) {
App.shared.goToPage(JoySubTitleVC())
} else {
override func setupViews() {
navBar.title = device.productName
navBar.backgroundColor = .color(.bgColor)
-// navBar.rightView.isHidden = false
+ navBar.rightView.isHidden = false
navBar.rightView.setTitle("字幕翻译", for: .normal)
view.backgroundColor = .color(.bgColor)
// navBar.rightView.setImage(UIImage(named: "add_icon"), for: .normal)
DcChatManager.shared.getVcSpeekerList {[weak self] speakers in
guard let self = self,let speakers = speakers,speakers.count > 0 else{return}
self.roleList = speakers.map{CCRole(sid: $0.sid, name: $0.name, type: $0.type, role: $0.role)}
- if CCDevice.isJoy{
- self.roleList.insert( CCRole.xiaoYin, at: 0)
+
+ var xiaotu:CCRole?
+ for (index,value) in self.roleList.enumerated(){
+ if value.role == "playboy_xiaotu" {
+ xiaotu = value
+ self.roleList.remove(at: index)
+ break
+ }
+ }
+ if let item = xiaotu{
+ self.roleList.insert(item, at: 0)
}
}
@objc func findAction(){
if CCBleManager.shared.isConnetd {
- if CCDevice.isJoy{
+ if CCConfig.appType == .deepchords{
App.shared.goToPage(FindVC())
}
else{
translateTextView.do { v in
v.textView.textColor = .color(.level1)
v.placeHolde = "此处将显示译文".l10n
- if CCDevice.isJoy{
+ if CCConfig.appType == .deepchords{
v.bgView.yc.addgradientLayer(colors: [.color(.theme),.color(.bgColor)], direction: .top2down,rect: CGRect(x: 0, y: 0, width: kScreenWid, height: (kScreenHei - kNavBtm - 120 - 10)/2))
v.bgView.alpha = 0.1
}
@unknown default:
break
}
- OtaMananger.shared.otaManager.centralManagerDidUpdateState(central)
}
func centralManager(_ central: CBCentralManager, didDiscover peripheral: CBPeripheral, advertisementData: [String : Any], rssi RSSI: NSNumber) {
devices.append(DCPeripheral(device: peripheral,mac: mac))
discoverDeviceCallback?(devices)
}
- else{
-// let mac = JoySdkManager.getMac(advertisementData) ?? ""
-// devices.append(DCPeripheral(device: peripheral,mac: mac))
-// discoverDeviceCallback?(devices)
- }
-// if CCDevice.isJoy{
-// let mac = JoySdkManager.getMac(advertisementData) ?? ""
-// devices.append(DCPeripheral(device: peripheral,mac: mac))
-// discoverDeviceCallback?(devices)
-// }
-// else{
-// let mac = DcSdkManager.getMac(advertisementData) ?? ""
-// devices.append(DCPeripheral(device: peripheral,mac: mac))
-// discoverDeviceCallback?(devices)
-// }
}
func centralManager(_ central: CBCentralManager, didConnect peripheral: CBPeripheral) {
stopScanDevice()
Logger.debug("蓝牙已连接 \(peripheral)")
peripheral.delegate = self
- if CCDevice.isJoy{
-// peripheral.discoverServices([CBUUID(string: JoySdkManager.serviceUUID),CBUUID(string: OtaMananger.otaServiceUUId)]);
- }
- else{
DCBleManager.shared.centralManager(central, didConnect: peripheral)
- peripheral.discoverServices([CBUUID(string: DCBleManager.serviceUUID),CBUUID(string: OtaMananger.otaServiceUUId)]);
- }
+ peripheral.discoverServices([CBUUID(string: DCBleManager.serviceUUID)]);
}
func centralManager(_ central: CBCentralManager, didFailToConnect peripheral: CBPeripheral, error: Error?) {
Logger.debug("peripheral: %@ failed to connect", peripheral)
Logger.debug("蓝牙已断开 \(peripheral)",error?.localizedDescription ?? "",error.debugDescription)
YLprogressHUD.showAutoHiden("蓝牙已断开".l10n)
self.isConnetd = false
- if CCDevice.isJoy{
-
- }
- else{
- DCBleManager.shared.centralManager(central, didDisconnectPeripheral: peripheral, error: nil)
- }
+ DCBleManager.shared.centralManager(central, didDisconnectPeripheral: peripheral, error: nil)
NotificationManager.post(type: .deviceValidChange, objtect: nil)
- OtaMananger.shared.otaManager.centralManager(central, didDisconnectPeripheral: peripheral, error: error)
checkConectState()
}
}
}
func peripheral(_ peripheral: CBPeripheral, didDiscoverCharacteristicsFor service: CBService, error: Error?) {
- if CCDevice.isJoy{
-// if (service.uuid.uuidString == JoySdkManager.serviceUUID) {
-// JoySdkManager.shared.peripheral(peripheral, didDiscoverCharacteristicsFor: service, error: error)
-// }
-// else if service.uuid.uuidString == OtaMananger.otaServiceUUId{
-// OtaMananger.shared.otaManager.peripheral(peripheral, didDiscoverCharacteristicsFor: service, error: error)
-// }
- }
- else{
- DCBleManager.shared.peripheral(peripheral, didDiscoverCharacteristicsFor: service, error: error)
- }
+ DCBleManager.shared.peripheral(peripheral, didDiscoverCharacteristicsFor: service, error: error)
}
func peripheral(_ peripheral: CBPeripheral, didUpdateNotificationStateFor characteristic: CBCharacteristic, error: (any Error)?) {
- if CCDevice.isJoy{
-// if (characteristic.isNotifying == true && characteristic.service?.uuid.uuidString == JoySdkManager.serviceUUID && characteristic.uuid.uuidString == JoySdkManager.notifyUUID) {
-// Logger.debug("特征使能成功")
-// JoySdkManager.shared.bleConnected()
-// }
-// if OtaMananger.isOtadata(characteristic){
-// OtaMananger.shared.otaManager.peripheral(peripheral, didUpdateNotificationStateFor: characteristic, error: error)
-// }
- }
}
func peripheral(_ peripheral: CBPeripheral, didUpdateValueFor characteristic: CBCharacteristic, error: Error?) {
- // Logger.debug("收到数据 ===uUId ",characteristic.uuid)
- if CCDevice.isJoy{
-// if OtaMananger.isOtadata(characteristic){
-// if let _ = characteristic.value,error == nil {
-// OtaMananger.shared.otaManager.peripheral(peripheral, didUpdateValueFor: characteristic)
-// }
-// else{
-// Logger.debug("ota 收到数据 ===\(characteristic.uuid)","无数据")
-// }
-// }
-// else {
-// //MARK: 需要配置传入数据
-// JoySdkManager.shared.receiveValue(characteristic)
-// }
- }
- else{
+ //Logger.debug("收到数据 ===uUId ",characteristic.uuid)
DCBleManager.shared.peripheral(peripheral, didUpdateValueFor: characteristic, error: error)
- }
}
func peripheral(_ peripheral: CBPeripheral, didModifyServices invalidatedServices: [CBService]) {
// devices.append(DCPeripheral(device: item,mac: mac))
// }
// }
- if CCDevice.isJoy{
-// centralManager.scanForPeripherals(withServices: [CBUUID(string: JoySdkManager.serviceUUID)],options: [CBCentralManagerScanOptionAllowDuplicatesKey : false])
- }
- else{
- centralManager.scanForPeripherals(withServices: [CBUUID(string: DCBleManager.serviceUUID)],options: [CBCentralManagerScanOptionAllowDuplicatesKey : false])
- }
+ centralManager.scanForPeripherals(withServices: [CBUUID(string: DCBleManager.serviceUUID)],options: [CBCentralManagerScanOptionAllowDuplicatesKey : false])
discoverDeviceCallback?(devices)
}
func connectPeripheral(_ peripheral: DCPeripheral) {
connectPeripheral = peripheral
-// if let name = peripheral.device.name,name.hasPrefix("AI") {
-// CCDevice.isJoy = false
-// }
-// else{
-// CCDevice.isJoy = true
-// }
CCDevice.initSdk()
Logger.debug(peripheral.device.name ?? "","连接中...")
centralManager.connect(peripheral.device, options: [CBConnectPeripheralOptionEnableTransportBridgingKey:true])
}
func checkSettingsConnected()->[CBPeripheral]{
- if CCDevice.isJoy {
-// let list = centralManager.retrieveConnectedPeripherals(withServices: [CBUUID(string: JoySdkManager.serviceUUID)])
-// Logger.debug("已连接设备",list)
-// return list
- return []
- }
- else{
let list = centralManager.retrieveConnectedPeripherals(withServices: [CBUUID(string: DCBleManager.serviceUUID)])
Logger.debug("已连接设备",list)
return list
- }
}
}
// ShenYin
//
// Created by liangshi on 2026/1/28.
-//
-//class CCConfig{
-// static var appLanguage = AppSupportLanguage.english
-//
-// static let wxAppID = "wxeb3291e720293abc"
-// static let wxUniversalLink = "https://www.playboykq.com/app/"
-// static let appStoreLink = "https://itunes.apple.com/cn/app/6757697090?mt=8"
-// /// 版本检测
-// static let appStoreVersionURL = "https://itunes.apple.com/cn/lookup?id=6757697090"
-//
-// /// 服务器地址
-// static let baseURL = "https://app-api.deepchords.com"
-//
-// /// 用户隐私协议地址
-// static let yonghuBaseURL = "https://pub-cdn.playboykq.com"
-//
-//}
class CCConfig{
+ /// app类型
+ static let appType = CCAppType.playboy
+ /// sdk类型
+ static let sdkType = CCSdkType.lianJuXing
+ /// app语言
static var appLanguage = AppSupportLanguage.english
-
+ /// 微信id
static let wxAppID = "wxeb3291e720293abc"
+ /// 通用链接
static let wxUniversalLink = "https://www.playboykq.com/app/"
+ /// appstore地址
static let appStoreLink = "https://itunes.apple.com/cn/app/6757697090?mt=8"
/// 版本检测
static let appStoreVersionURL = "https://itunes.apple.com/cn/lookup?id=6757697090"
-
/// 服务器地址
static let baseURL = "https://app-api.playboykq.com"
-
+ /// 服务器地址
+// static let baseURL = "https://app-api.deepchords.com""
/// 用户隐私协议地址
static let yonghuBaseURL = "https://pub-cdn.playboykq.com"
+
+
+
+
+
+
+
+
+
+
+
+
+ static let revokeText = "请您确保您是有权进行本撤回同意隐私政策操作的相关当事人。撤回同意隐私政策,您将放弃以下资产或者权益:\n\n1.数据清空\n将会停止收集您的个人信息。您使用PLAYBOY应用过程中产生的数据将被清空;手机中PLAYBOY应用的缓存数据将被清除。\n\n2.设备解除绑定\nPLAYBOY账号中,所有设备会与您当前登录的账号解除绑定,并清除设备之前存储在服务器的数据。存储在物理设备中的数据请通过人工本地物理重置来清除。如果您需要重新使用设备,需要您再次进行绑定并且重新授权。\n\n3.其他\n此举还将撤回您对用户协议的同意,并退出PLAYBOY应用。\n\n请您知悉,撤回同意隐私政策不代表撤回同意前的相关行为和责任得到豁免或减轻。若您需要重新在该账号管理设备,需要您重新授权并绑定。请谨慎操作!"
}
//import JoyGemAI
import DeepChordsSdk
class CCDevice{
- static var isJoy = false
- static var showRaisound = false
static func initSdk(){
- if CCDevice.isJoy {
-// JoySdkManager.shared.setupSdk()
- }
- else{
- DcSdkManager.shared.initSdk()
- }
+ DcSdkManager.shared.initSdk()
}
static func translate(text:String,from:String,to:String,finished:@escaping ((stream:String,finish:Bool)?)->Void){
- if isJoy {
-// JoyGemAIManager.shared().cancelTranslateRequest()
-// JoyGemAIManager.shared().translate(text, from: from, to: to) { result, finish in
-// finished((result,finish))
-// } error: { error in
-// finished(nil)
-// }
- }
- else{
DCText.cancelTranslateByTextWithSplit()
DCText.translate(text: text, from: from, to: to) { result in
finished(result)
}
- }
}
static func summary(text:String,finished:@escaping ((stream:String,finish:Bool)?)->Void){
- if isJoy {
-// JoyGemAIManager.shared().cancelSummaryRequest()
-// JoyGemAIManager.shared().summary(text) { text, finish in
-// finished((text,finish))
-// } error: { error in
-// finished(nil)
-// }
- }
- else{
DCText.cancelSummaryByTextWithSplit()
DCText.sumary(text: text) { result in
finished(result)
}
- }
}
}
extension CCDevice{
static func findHeadphone(_ mode:FindType){
- if CCDevice.isJoy {
-// var value:JoyGemFindHeadphoneMode = .all
-// switch mode {
-// case .left:
-// value = .left
-// case .right:
-// value = .right
-// case .cancel:
-// value = .cancel
-// case .all:
-// value = .all
-// }
-// JoyGemAIManager.shared().device.findHeadphone(value) { err in
-// Logger.debug("findHeadphone:\(err)");
-// }
- }
- else{
let value:UInt8 = mode == .cancel ? 0:1
DCDevice.shared.findDevice(state: value) { result in
}
- }
}
static func getEQMode(finished:@escaping (ModeEffectsType?)->Void){
- if CCDevice.isJoy {
-// JoyGemAIManager.shared().device.getEQMode { mode in
-// var value:ModeEffectsType = .normal
-// switch mode {
-// case .normal:
-// value = .normal
-// case .pop:
-// value = .pop
-// case .classic:
-// value = .classic
-// case .rock:
-// value = .rock
-// case .jazz:
-// value = .jazz
-// case .custom:
-// value = .custom
-// }
-// finished(value)
-// } error: { err in
-// Logger.debug("getEQMode:\(err)");
-// finished(nil)
-// }
- }
- else{
- /// type, 0x00(正常模式)
- // 0x01(流行)
- // 0x02(经典)
- // 0x03(爵士)
- // 0x04(摇滚)
- // 0x05(自定义)
- DCDevice.shared.getEQ { (arg0,result) in
- guard let (type,list) = arg0 else{
- finished(nil)
- return
- }
- switch type{
- case 0:
- finished(.normal)
- case 1:
- finished(.pop)
- case 2:
- finished(.classic)
- case 3:
- finished(.jazz)
- case 4:
- finished(.rock)
- case 5:
- finished(.custom)
- default:
- finished(nil)
- }
+ /// type, 0x00(正常模式)
+ // 0x01(流行)
+ // 0x02(经典)
+ // 0x03(爵士)
+ // 0x04(摇滚)
+ // 0x05(自定义)
+ DCDevice.shared.getEQ { (arg0,result) in
+ guard let (type,list) = arg0 else{
+ finished(nil)
+ return
+ }
+ switch type{
+ case 0:
+ finished(.normal)
+ case 1:
+ finished(.pop)
+ case 2:
+ finished(.classic)
+ case 3:
+ finished(.jazz)
+ case 4:
+ finished(.rock)
+ case 5:
+ finished(.custom)
+ default:
+ finished(nil)
}
}
}
static func setEQMode(_ type:ModeEffectsType){
- if CCDevice.isJoy {
-// var value:JoyGemEQMode = .normal
-// switch type {
-// case .normal:
-// value = .normal
-// case .pop:
-// value = .pop
-// case .classic:
-// value = .classic
-// case .rock:
-// value = .rock
-// case .jazz:
-// value = .jazz
-// case .custom:
-// value = .custom
-// }
-//
-// JoyGemAIManager.shared().device.setEQMode(value) { err in
-// Logger.debug("setEQMode:\(err)");
-// }
- }else{
let value:UInt8 = UInt8(type.rawValue)
DCDevice.shared.setEQ(type: value) { success in
}
- }
}
static func getCustomEQ(finished:@escaping ([NSNumber]?)->Void){
- if CCDevice.isJoy {
-// JoyGemAIManager.shared().device.getCustomEQ { eq in
-// Logger.debug("getCustomEQ:\(eq)");
-// finished(eq.bands)
-// } error: { err in
-// Logger.debug("getCustomEQ:\(err)");
-// finished(nil)
-// }
- }
- else{
DCDevice.shared.getEQ { (arg0,result) in
guard let (type,list) = arg0 else{
finished(nil)
finished(nil)
}
}
- }
}
static func resetCustomEQ(){
- if CCDevice.isJoy {
-// JoyGemAIManager.shared().device.resetCustomEQ { err in
-// Logger.debug("resetCustomEQ:\(err)");
-// }
- }
- else{
let list = [
0,0,0,0,0,0,0,0,0,0,0,0
]
DCDevice.shared.setEQ(type: 0x05) {result in
}
}
- }
}
static func setCustomEQ(index:Int,value:Int){
- if CCDevice.isJoy {
-// JoyGemAIManager.shared().device.setCustomEQ(UInt(index), withGain: value) { err in
-// Logger.debug("setCustomEQ:\(err)");
-// }
- }
- else{
DCDevice.shared.setCustomEQ(index: UInt8(index), value: value) {result in
}
- }
}
}
extension CCDevice{
-// static func getMac(finished:@escaping ((_ mac:String?)->Void)) {
-// if CCDevice.isJoy {
-// JoyGemAIManager.shared().device.macAddress { edr, ble in
-// Logger.debug("edr:\(edr),ble:\(ble)");
-// finished(edr.uppercased())
-// } error: { error in
-// Logger.debug("\(error!.localizedDescription)")
-// finished(nil)
-// }
-// }
-// else{
-//// DCDevice.shared.getSoftVersion {result in
-//// finished(result)
-//// }
-// }
-// }
static func getDN(finished:@escaping ((_ mac:String?)->Void)) {
- if CCDevice.isJoy {
-// JoyGemAIManager.shared().device.getDN { deviceName in
-// finished(deviceName)
-// } error: { error in
-// Logger.debug("获取dn失败","\(error!.localizedDescription)")
-// finished(nil)
-// }
- }
- else{
let dn = DCText.getDeviceName()
finished(dn)
- }
}
static func getVersion(finished:@escaping ((_ version:String?)->Void)) {
- if CCDevice.isJoy {
-// JoyGemAIManager.shared().device.software { version in
-// finished(version)
-// } error: { error in
-// Logger.debug("\(error!.localizedDescription)");
-// finished(nil)
-// }
- }
- else{
DCDevice.shared.getSoftVersion {result in
finished(result)
}
- }
}
}
class CCPage{
static func gotoChat(){
AudioPlayView.shared.closeAction()
- if CCDevice.isJoy {
-// App.shared.goToPage(JoyChatVC())
- }
- else{
- App.shared.goToPage(PbChatVC())
- }
+ App.shared.goToPage(PbChatVC())
}
static func gotoFieldRecord(){
AudioPlayView.shared.closeAction()
- if CCDevice.isJoy {
-// App.shared.goToPage(JoyXclyVC())
- }
- else{
- App.shared.goToPage(PbXclyVC())
- }
+ App.shared.goToPage(PbXclyVC())
}
static func gotoCallRecord(){
AudioPlayView.shared.closeAction()
- if CCDevice.isJoy {
-// if JoySdkManager.shared.callRecord.supportStereo{
-// App.shared.goToPage(JoyStereoCallVC())
-// }
-// else{
-// App.shared.goToPage(JoyCallingRecordVC())
-// }
- }
- else{
-// if JoySdkManager.shared.callRecord.supportStereo{
- App.shared.goToPage(PbStereoCallVC())
-// }
-// else{
-// App.shared.goToPage(JoyCallingRecordVC())
-// }
- }
+ App.shared.goToPage(PbStereoCallVC())
}
static func gotoChinese2Enlgish(){
AudioPlayView.shared.closeAction()
- if CCDevice.isJoy {
-// App.shared.goToPage(JoyChinese2EnglishVC())
- }
- else{
- App.shared.goToPage(PbChinese2EnglishVC())
- }
+ App.shared.goToPage(PbChinese2EnglishVC())
}
static func gotoTcty(){
AudioPlayView.shared.closeAction()
- if CCDevice.isJoy {
-// App.shared.goToPage(JoyTctyVC())
- }
- else{
- App.shared.goToPage(PbTctyVC())
- }
+ App.shared.goToPage(PbTctyVC())
}
static func gotoDialogTranslate(){
AudioPlayView.shared.closeAction()
- if CCDevice.isJoy {
-// App.shared.goToPage(JoyDialogTranslateVC())
- }
- else{
- App.shared.goToPage(PbDialogTranslateVC())
- }
+ App.shared.goToPage(PbDialogTranslateVC())
}
static func gotoSubTitle(){
- if CCDevice.isJoy {
- // App.shared.goToPage(JoyDialogTranslateVC())
- }
- else{
- if #available(iOS 15.0, *) {
- App.shared.goToPage(PbSubTitleVC())
- } else {
- // Fallback on earlier versions
- }
+ if #available(iOS 15.0, *) {
+ App.shared.goToPage(PbSubTitleVC())
+ } else {
+ // Fallback on earlier versions
}
}
}
extension YLColor: ColorRGBProviderProtocol {
public var rgbValue: Int {
- if CCDevice.isJoy {
+ if CCConfig.appType == .deepchords {
switch self {
case .bgColor:
return 0xF7F7F7
KingfisherManager.shared.cache.clearMemoryCache()
}
open override var preferredStatusBarStyle: UIStatusBarStyle {
- if CCDevice.isJoy{
+ if CCConfig.appType == .deepchords{
return .darkContent
}
else{
didSet{
originalLabel.text = data.content
if data.isSend {
- bgView.backgroundColor = CCDevice.isJoy ? .color(.theme) : UIColor.color(.cellBg)
+ bgView.backgroundColor = CCConfig.appType == .deepchords ? .color(.theme) : UIColor.color(.cellBg)
originalLabel.textColor = .white
icon.snp.remakeConstraints { make in
else{
bgView.backgroundColor = .color(.cellBg)
originalLabel.textColor = .color(.level1)
- icon.image = CCDevice.isJoy ? UIImage(named: "logo_2"):UIImage(named: "logo_4")
+ icon.image = CCConfig.appType == .deepchords ? UIImage(named: "logo_2"):UIImage(named: "logo_4")
icon.snp.remakeConstraints { make in
make.size.equalTo(36)
make.top.equalToSuperview().inset(16)
}
static var xiaoYin:CCRole{
- if CCDevice.isJoy {
+ if CCConfig.appType == .deepchords {
let model = CCRole()
model.sid = "zh_female_tianmeitaozi_mars_bigtts"
model.name = "小音"
v.language = CCAiLanguage.chinse
v.yc.addTap(target: self, action: #selector(leftLanguageAction))
v.language = .chinse
- v.valueLabel.text = CCDevice.isJoy ? "耳机".l10n:"眼镜".l10n
+ v.valueLabel.text = CCConfig.appType == .deepchords ? "耳机".l10n:"眼镜".l10n
}
rightItem.do { (v) in
v.language = CCAiLanguage.english
valueLabel.do { v in
v.textColor = .color(.level2)
v.font = .regular(10)
- v.text = CCDevice.isJoy ? "耳机".l10n:"眼镜".l10n
+ v.text = CCConfig.appType == .deepchords ? "耳机".l10n:"眼镜".l10n
}
}
}
stopWave.image = UIImage(named: "audio_record_normal")
- startWave.kf.setImage(with: Bundle.main.url(forResource: CCDevice.isJoy ? "record_start_joy":"record_start", withExtension: "gif")!)
+ startWave.kf.setImage(with: Bundle.main.url(forResource: CCConfig.appType == .deepchords ? "record_start_joy":"record_start", withExtension: "gif")!)
startWave.isHidden = true
}
override func setupLayout() {
invariantViewProperties.textColor = .color(.level2)
}
if let date = date,date > Date(){
- invariantViewProperties.textColor = CCDevice.isJoy ? .color(.placeholder):.rgb(0x333333)
+ invariantViewProperties.textColor = CCConfig.appType == .deepchords ? .color(.placeholder):.rgb(0x333333)
}
}
override func setupLayout() {
- if CCDevice.isJoy {
+ if CCConfig.appType == .deepchords {
imageView.snp.makeConstraints { make in
make.width.equalTo(168)
make.height.equalTo(138)
var radarImageView = UIImageView()
override func setupViews() {
- if CCDevice.isJoy {
+ if CCConfig.appType == .deepchords {
addSubviews([rippleView,radarImageView])
rippleView.startAnimating()
UIApplication.shared.open(url) { (success) in
// 提示用户是否成功打开了设置
if success {
- print("成功跳转到蓝牙设置")
+ Logger.debug("成功跳转到蓝牙设置")
} else {
- print("跳转失败")
+ Logger.debug("跳转到设置失败")
}
}
} else {
- print("链接不可用")
+ Logger.debug("链接不可用")
}
}
}
self.window?.rootViewController = BaseTC()
}
func goToLogin(){
- if CCDevice.isJoy{
+ if CCConfig.appType == .deepchords{
window?.rootViewController = BaseNC(rootViewController: LoginVC())
}
else{
}
override func setupLayout(){
logoImg.snp.makeConstraints { make in
- if CCDevice.isJoy{
+ if CCConfig.appType == .deepchords{
make.left.equalToSuperview().inset(28)
make.top.equalTo(kNavBtm + 20)
make.centerX.equalToSuperview()
}
bgView.snp.makeConstraints { make in
make.left.right.equalToSuperview()
- make.top.equalToSuperview().inset(CCDevice.isJoy ? 244:180)
+ make.top.equalToSuperview().inset(CCConfig.appType == .deepchords ? 244:180)
make.bottom.equalToSuperview()
}
}
override func setupLayout(){
logoImg.snp.makeConstraints { make in
- if CCDevice.isJoy{
+ if CCConfig.appType == .deepchords{
make.left.equalToSuperview().inset(28)
make.top.equalTo(kNavBtm + 20)
make.centerX.equalToSuperview()
}
override func setupLayout(){
logoImg.snp.makeConstraints { make in
- if CCDevice.isJoy{
+ if CCConfig.appType == .deepchords{
make.left.equalToSuperview().inset(28)
make.top.equalTo(kNavBtm + 20)
make.centerX.equalToSuperview()
}
bgView.snp.makeConstraints { make in
make.left.right.equalToSuperview()
- make.top.equalToSuperview().inset(CCDevice.isJoy ? 244:180)
+ make.top.equalToSuperview().inset(CCConfig.appType == .deepchords ? 244:180)
make.bottom.equalToSuperview()
}
}
override func setupLayout(){
logoImg.snp.makeConstraints { make in
- if CCDevice.isJoy{
+ if CCConfig.appType == .deepchords{
make.left.equalToSuperview().inset(28)
make.top.equalTo(kNavBtm + 20)
make.centerX.equalToSuperview()
}
bgView.snp.makeConstraints { make in
make.left.right.equalToSuperview()
- make.top.equalToSuperview().inset(CCDevice.isJoy ? 244:180)
+ make.top.equalToSuperview().inset(CCConfig.appType == .deepchords ? 244:180)
make.bottom.equalToSuperview()
}
v.label.text = "点击获取".l10n
}
- inputBgView.backgroundColor = CCDevice.isJoy ? .rgb(0xF3F4F8): .color(.cellBg)
+ inputBgView.backgroundColor = CCConfig.appType == .deepchords ? .rgb(0xF3F4F8): .color(.cellBg)
inputBgView.layer.cornerRadius = 12
inputBgView.layer.masksToBounds = true
v.leftViewMode = .never
}
- inputBgView.backgroundColor = CCDevice.isJoy ? .rgb(0xF3F4F8): .color(.cellBg)
+ inputBgView.backgroundColor = CCConfig.appType == .deepchords ? .rgb(0xF3F4F8): .color(.cellBg)
inputBgView.layer.cornerRadius = 10
inputBgView.layer.masksToBounds = true
addSubviews([inputBgView])
class LoginBgView: BaseView {
override func setupViews() {
- if CCDevice.isJoy {
+ if CCConfig.appType == .deepchords {
backgroundColor = UIColor.white
yc.setCorners(withRoundedRect: CGRect(x: 0, y: 0, width: kScreenWid, height: kScreenHei - 244), roundingCorners: [.topLeft,.topRight], cornerRadii: CGSize(width: 50, height: 50))
}
class LoginHeaderView: BaseView {
override func setupViews() {
- if CCDevice.isJoy {
+ if CCConfig.appType == .deepchords {
let tipsLabel = UILabel()
// tipsLabel.backgroundColor = .red
// backgroundColor = .green
textField.rightView = btn
textField.rightViewMode = .always
- inputBgView.backgroundColor = CCDevice.isJoy ? .rgb(0xF3F4F8): .color(.cellBg)
+ inputBgView.backgroundColor = CCConfig.appType == .deepchords ? .rgb(0xF3F4F8): .color(.cellBg)
inputBgView.layer.cornerRadius = 10
inputBgView.layer.masksToBounds = true
addSubviews([inputBgView])
addSubviews([inputBgView])
inputBgView.addSubviews([titleLabel,valeLabel,arrrowIcon])
- inputBgView.backgroundColor = CCDevice.isJoy ? .rgb(0xF3F4F8): .color(.cellBg)
+ inputBgView.backgroundColor = CCConfig.appType == .deepchords ? .rgb(0xF3F4F8): .color(.cellBg)
inputBgView.layer.cornerRadius = 10
inputBgView.layer.masksToBounds = true
inputBgView.yc.addTap(target: self, action: #selector(tapAction))
}
@objc func chatAction(){
App.shared.popToRootPage()
- if CCDevice.isJoy {
+ if CCConfig.appType == .deepchords {
App.shared.tabController?.selectedIndex = 3
}
else{
override func setupData() {
let lan = CCConfig.appLanguage.yonghuCode
// let fileUrl = "https://dc-cloud-pub.tos-cn-guangzhou.volces.com/protocol/\(lan)/\(type.rawValue).pdf"
- if CCDevice.isJoy{
+ if CCConfig.appType == .deepchords{
let fileUrl = CCConfig.yonghuBaseURL + "/protocol/\(lan)/\(type.rawValue).pdf"
self.dowmload(url:fileUrl)
}
v.font = .regular(14)
v.textColor = .color(.level2)
v.numberOfLines = 0
- var text = ""
- if CCDevice.isJoy{
- text = "请您确保您是有权进行本撤回同意隐私政策操作的相关当事人。撤回同意隐私政策,您将放弃以下资产或者权益:\n\n1.数据清空\n将会停止收集您的个人信息。您使用DeepChords应用过程中产生的数据将被清空;手机中DeepChords应用的缓存数据将被清除。\n\n2.设备解除绑定\nDeepChords账号中,所有设备会与您当前登录的账号解除绑定,并清除设备之前存储在服务器的数据。存储在物理设备中的数据请通过人工本地物理重置来清除。如果您需要重新使用设备,需要您再次进行绑定并且重新授权。\n\n3.其他\n此举还将撤回您对用户协议的同意,并退出DeepChords应用。\n\n请您知悉,撤回同意隐私政策不代表撤回同意前的相关行为和责任得到豁免或减轻。若您需要重新在该账号管理设备,需要您重新授权并绑定。请谨慎操作!".l10n
- }
- else{
- text = "请您确保您是有权进行本撤回同意隐私政策操作的相关当事人。撤回同意隐私政策,您将放弃以下资产或者权益:\n\n1.数据清空\n将会停止收集您的个人信息。您使用PLAYBOY应用过程中产生的数据将被清空;手机中PLAYBOY应用的缓存数据将被清除。\n\n2.设备解除绑定\nPLAYBOY账号中,所有设备会与您当前登录的账号解除绑定,并清除设备之前存储在服务器的数据。存储在物理设备中的数据请通过人工本地物理重置来清除。如果您需要重新使用设备,需要您再次进行绑定并且重新授权。\n\n3.其他\n此举还将撤回您对用户协议的同意,并退出PLAYBOY应用。\n\n请您知悉,撤回同意隐私政策不代表撤回同意前的相关行为和责任得到豁免或减轻。若您需要重新在该账号管理设备,需要您重新授权并绑定。请谨慎操作!".l10n
- }
+ let text = CCConfig.revokeText.l10n
let attributedString = NSMutableAttributedString(string: text)
}
override func setupLayout() {
-// if CCDevice.isJoy{
+// if CCConfig.appType == .deepchords{
// titleLabel.snp.makeConstraints { (m) in
// m.top.equalToSuperview().inset(10)
// m.left.equalToSuperview().inset(38)
refreshUI()
}
override func setupData() {
- if CCDevice.isJoy {
+ if CCConfig.appType == .deepchords {
list = [.avatar,.nickName,.gender,.birthday,.height,.weight,.hobbies,.area]
}
- else{
+ else {
list = [.avatar,.nickName,.gender,.area]
}
tableView.reloadData()
bgView.addSubviews([resetBtn,titleLabel,unitLabel,valueLabel1,valueLabel2,valueLabel3])
bgView.do { v in
- v.backgroundColor = CCDevice.isJoy ? UIColor.white:UIColor.rgb(0x242424)
+ v.backgroundColor = CCConfig.appType == .deepchords ? UIColor.white:UIColor.rgb(0x242424)
v.yc.setCornerRadius(12.fitR)
}
sliderBgView.do { v in
}
override func setupViews() {
- self.navBar.title = CCDevice.isJoy ? "查找耳机".l10n:"查找眼镜".l10n
+ self.navBar.title = CCConfig.appType == .playboy ? "查找眼镜".l10n:"查找耳机".l10n
navBar.backgroundColor = .clear
view.backgroundColor = .color(.bgColor)
view.addSubviews([titleLabel,desLabel,leftRadar,rightRadar,leftBtn,rightBtn])
icon.image = UIImage(named: "find_icon")
titleLabel.do { v in
- v.text = CCDevice.isJoy ? "查找耳机".l10n:"查找眼镜".l10n
+ v.text = CCConfig.appType == .playboy ? "查找眼镜".l10n:"查找耳机".l10n
v.font = .bold(16)
v.textColor = .color(.level1)
didSet{
originalLabel.text = data.content
if data.isSend {
- bgView.backgroundColor = CCDevice.isJoy ? .color(.theme) : UIColor.color(.cellBg)
+ bgView.backgroundColor = .color(.theme)
originalLabel.textColor = .white
icon.snp.remakeConstraints { make in
else{
bgView.backgroundColor = .color(.cellBg)
originalLabel.textColor = .color(.level1)
- icon.image = CCDevice.isJoy ? UIImage(named: "logo_2"):UIImage(named: "logo_4")
+ icon.image = UIImage(named: "logo_2")
icon.snp.remakeConstraints { make in
make.size.equalTo(36)
make.top.equalToSuperview().inset(16)
private func setupShapeLayer() {
shapeLayer = CAShapeLayer()
- shapeLayer.strokeColor = CCDevice.isJoy ? UIColor.rgb(0x93C6EC).cgColor: UIColor.color(.separateLine).cgColor
+ shapeLayer.strokeColor = CCConfig.appType == .deepchords ? UIColor.rgb(0x93C6EC).cgColor: UIColor.color(.separateLine).cgColor
shapeLayer.fillColor = UIColor.clear.cgColor
shapeLayer.lineWidth = 0.5
shapeLayer.lineDashPattern = [NSNumber(value: 5.0), NSNumber(value: 3.0)]
class CustomButton: UIButton {
func set(title:String,font:UIFont = .bold(14),style:CustomButtonStyle = .theme1, target: Any?, action: Selector) {
- if CCDevice.isJoy{
+ if CCConfig.appType == .deepchords{
setTitle(title, for: .normal)
addTarget(target, action: action, for: .touchUpInside)
layer.cornerRadius = 12
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
- if CCDevice.isJoy {
+ if CCConfig.appType == .deepchords {
}
else{
v.text = "保存录音".l10n
}
textFiledBg.do { v in
- if CCDevice.isJoy{
+ if CCConfig.appType == .deepchords{
v.yc.setBorder(width: 2, color: .color(.theme), radius: 10)
}
else{
okButton.do { (v) in
v.setTitle("确定".l10n, for: .normal)
v.titleLabel?.font = .bold(16)
- if CCDevice.isJoy{
+ if CCConfig.appType == .deepchords{
v.setTitleColor(.white, for: .normal)
v.backgroundColor = UIColor.color(.theme)
}
}
}
var des1:String{
- if CCDevice.isJoy {
+ if CCConfig.appType == .deepchords {
switch self {
case .dialog:
return "一方手持手机,一方戴上耳机,对手机发言时,耳机播放译文,对耳机发言时,手机播放译文".l10n
}
}
var des2:String{
- if CCDevice.isJoy {
+ if CCConfig.appType == .deepchords {
switch self {
case .dialog:
return "- 情景示例 -\n张张靠近手机讲中文,对方耳机播放英语".l10n
v.numberOfLines = 0
}
actionbtn.do { v in
- if CCDevice.isJoy{
+ if CCConfig.appType == .deepchords{
v.backgroundColor = .color(.theme)
v.setTitleColor(.white, for: .normal)
}