From: liangzhenying <867174124@qq.com>
Date: Mon, 5 Jan 2026 04:10:28 +0000 (+0800)
Subject: 骨传导完成录音暂停
X-Git-Tag: 1.0.2~7
X-Git-Url: http://git.snicker.com.cn/?a=commitdiff_plain;h=e42b57f4783cf6b18a64051ae98704d5fb65f756;p=mirrors%2FShenYin.git
骨传导完成录音暂停
---
diff --git a/ShenYin/DeepChordsSdkTests/DeepChordsSdkTests.swift b/ShenYin/DeepChordsSdkTests/DeepChordsSdkTests.swift
deleted file mode 100644
index 6ec3507..0000000
--- a/ShenYin/DeepChordsSdkTests/DeepChordsSdkTests.swift
+++ /dev/null
@@ -1,17 +0,0 @@
-//
-// DeepChordsSdkTests.swift
-// DeepChordsSdkTests
-//
-// Created by lianzi on 2026/1/4.
-//
-
-import Testing
-@testable import DeepChordsSdk
-
-struct DeepChordsSdkTests {
-
- @Test func example() async throws {
- // Write your test here and use APIs like `#expect(...)` to check expected conditions.
- }
-
-}
diff --git a/ShenYin/Podfile.lock b/ShenYin/Podfile.lock
index acd287b..0d7b5fd 100644
--- a/ShenYin/Podfile.lock
+++ b/ShenYin/Podfile.lock
@@ -157,7 +157,7 @@ SPEC CHECKSUMS:
SwiftHTTP: e94f1aa8cde58637dcc0100f6349de31a3337fde
TabPageViewController: 8bd4104909754416b35a98f3b72a5b674ab20dd5
TZImagePickerController: 456f470b5dea97b37226ec7a694994a8663340b2
- WechatOpenSDK-XCFramework: ff342ae616bb86df3d236aca38059dfd4bc4a949
+ WechatOpenSDK-XCFramework: b072030c9eeee91dfff1856a7846f70f7b9a88ed
YYModel: 2a7fdd96aaa4b86a824e26d0c517de8928c04b30
YYText: 5c461d709e24d55a182d1441c41dc639a18a4849
ZipArchive: e25a4373192673e3229ac8d6e9f64a3e5713c966
diff --git a/ShenYin/Pods/Kingfisher/PrivacyInfo.xcprivacy b/ShenYin/Pods/Kingfisher/PrivacyInfo.xcprivacy
index b951586..e540750 100644
--- a/ShenYin/Pods/Kingfisher/PrivacyInfo.xcprivacy
+++ b/ShenYin/Pods/Kingfisher/PrivacyInfo.xcprivacy
@@ -2,13 +2,13 @@
+ NSPrivacyTracking
+
+ NSPrivacyAccessedAPITypes
+
NSPrivacyCollectedDataTypes
NSPrivacyTrackingDomains
- NSPrivacyAccessedAPITypes
-
- NSPrivacyTracking
-
diff --git a/ShenYin/Pods/MBProgressHUD/PrivacyInfo.xcprivacy b/ShenYin/Pods/MBProgressHUD/PrivacyInfo.xcprivacy
index b951586..e540750 100644
--- a/ShenYin/Pods/MBProgressHUD/PrivacyInfo.xcprivacy
+++ b/ShenYin/Pods/MBProgressHUD/PrivacyInfo.xcprivacy
@@ -2,13 +2,13 @@
+ NSPrivacyTracking
+
+ NSPrivacyAccessedAPITypes
+
NSPrivacyCollectedDataTypes
NSPrivacyTrackingDomains
- NSPrivacyAccessedAPITypes
-
- NSPrivacyTracking
-
diff --git a/ShenYin/ShenYin.xcodeproj/project.pbxproj b/ShenYin/ShenYin.xcodeproj/project.pbxproj
index 67f4f6d..debd2f1 100644
--- a/ShenYin/ShenYin.xcodeproj/project.pbxproj
+++ b/ShenYin/ShenYin.xcodeproj/project.pbxproj
@@ -7,7 +7,7 @@
objects = {
/* Begin PBXBuildFile section */
- 0D54E4482F0A62F700A80EE7 /* DeepChordsSdk.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0D54E0EF2F0A61E600A80EE7 /* DeepChordsSdk.framework */; };
+ 3F469CB12F0B539600121DBD /* DeepChordsSdk.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0D54E0EF2F0A61E600A80EE7 /* DeepChordsSdk.framework */; };
3F8F58292EBCA2B800FFC00B /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = 3F8F58282EBCA2B800FFC00B /* PrivacyInfo.xcprivacy */; };
644D1BB5EDD3EA1D77C57786 /* Pods_DeepChordsSdk.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 248D8B53B5A178ACA5867275 /* Pods_DeepChordsSdk.framework */; };
F2E449CAD5874BE652A69B50 /* Pods_ShenYin.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3862D5561144E20721225B96 /* Pods_ShenYin.framework */; };
@@ -34,6 +34,16 @@
name = "Embed Frameworks";
runOnlyForDeploymentPostprocessing = 0;
};
+ 3F469CAF2F0B539400121DBD /* Embed Frameworks */ = {
+ isa = PBXCopyFilesBuildPhase;
+ buildActionMask = 2147483647;
+ dstPath = "";
+ dstSubfolderSpec = 10;
+ files = (
+ );
+ name = "Embed Frameworks";
+ runOnlyForDeploymentPostprocessing = 0;
+ };
/* End PBXCopyFilesBuildPhase section */
/* Begin PBXFileReference section */
@@ -52,6 +62,13 @@
/* End PBXFileReference section */
/* Begin PBXFileSystemSynchronizedBuildFileExceptionSet section */
+ 3F469CAC2F0B539000121DBD /* Exceptions for "DeepChordsSdk" folder in "ShenYin" target */ = {
+ isa = PBXFileSystemSynchronizedBuildFileExceptionSet;
+ membershipExceptions = (
+ StarburstSdk.framework,
+ );
+ target = 3F887B9B2E38D8DC00C98658 /* ShenYin */;
+ };
3F887BAE2E38D8DD00C98658 /* Exceptions for "ShenYin" folder in "ShenYin" target */ = {
isa = PBXFileSystemSynchronizedBuildFileExceptionSet;
membershipExceptions = (
@@ -76,31 +93,39 @@
/* End PBXFileSystemSynchronizedBuildFileExceptionSet section */
/* Begin PBXFileSystemSynchronizedGroupBuildPhaseMembershipExceptionSet section */
- 0D54E4472F0A62D900A80EE7 /* Exceptions for "DeepChordsSdk" folder in "Embed Frameworks" build phase */ = {
+ 0D54E4472F0A62D900A80EE7 /* Exceptions for "DeepChordsSdk" folder in "Embed Frameworks" phase from "DeepChordsSdk" target */ = {
isa = PBXFileSystemSynchronizedGroupBuildPhaseMembershipExceptionSet;
+ attributesByRelativePath = {
+ StarburstSdk.framework = (CodeSignOnCopy, RemoveHeadersOnCopy, );
+ };
buildPhase = 0D54E4462F0A62D900A80EE7 /* Embed Frameworks */;
membershipExceptions = (
StarburstSdk.framework,
);
};
+ 3F469CB02F0B539500121DBD /* Exceptions for "DeepChordsSdk" folder in "Embed Frameworks" phase from "ShenYin" target */ = {
+ isa = PBXFileSystemSynchronizedGroupBuildPhaseMembershipExceptionSet;
+ attributesByRelativePath = {
+ StarburstSdk.framework = (CodeSignOnCopy, RemoveHeadersOnCopy, );
+ };
+ buildPhase = 3F469CAF2F0B539400121DBD /* Embed Frameworks */;
+ membershipExceptions = (
+ StarburstSdk.framework,
+ );
+ };
/* End PBXFileSystemSynchronizedGroupBuildPhaseMembershipExceptionSet section */
/* Begin PBXFileSystemSynchronizedRootGroup section */
0D54E0F02F0A61E600A80EE7 /* DeepChordsSdk */ = {
isa = PBXFileSystemSynchronizedRootGroup;
exceptions = (
- 0D54E4472F0A62D900A80EE7 /* Exceptions for "DeepChordsSdk" folder in "Embed Frameworks" build phase */,
+ 3F469CAC2F0B539000121DBD /* Exceptions for "DeepChordsSdk" folder in "ShenYin" target */,
+ 3F469CB02F0B539500121DBD /* Exceptions for "DeepChordsSdk" folder in "Embed Frameworks" phase from "ShenYin" target */,
+ 0D54E4472F0A62D900A80EE7 /* Exceptions for "DeepChordsSdk" folder in "Embed Frameworks" phase from "DeepChordsSdk" target */,
);
path = DeepChordsSdk;
sourceTree = "";
};
- 0D54E0FF2F0A61E600A80EE7 /* DeepChordsSdkTests */ = {
- isa = PBXFileSystemSynchronizedRootGroup;
- exceptions = (
- );
- path = DeepChordsSdkTests;
- sourceTree = "";
- };
3F887B9E2E38D8DC00C98658 /* ShenYin */ = {
isa = PBXFileSystemSynchronizedRootGroup;
exceptions = (
@@ -124,7 +149,7 @@
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
- 0D54E4482F0A62F700A80EE7 /* DeepChordsSdk.framework in Frameworks */,
+ 3F469CB12F0B539600121DBD /* DeepChordsSdk.framework in Frameworks */,
F2E449CAD5874BE652A69B50 /* Pods_ShenYin.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
@@ -152,7 +177,6 @@
3F887B9E2E38D8DC00C98658 /* ShenYin */,
3F8F68802EC1F25700FFC00B /* New Group */,
0D54E0F02F0A61E600A80EE7 /* DeepChordsSdk */,
- 0D54E0FF2F0A61E600A80EE7 /* DeepChordsSdkTests */,
3F887B9D2E38D8DC00C98658 /* Products */,
34A14A83ECF09370871C891F /* Pods */,
676B86A4BA2639E8694D56B4 /* Frameworks */,
@@ -230,6 +254,7 @@
3F887B992E38D8DC00C98658 /* Frameworks */,
3F887B9A2E38D8DC00C98658 /* Resources */,
5A934A35F54A5620CFD3C08A /* [CP] Embed Pods Frameworks */,
+ 3F469CAF2F0B539400121DBD /* Embed Frameworks */,
);
buildRules = (
);
@@ -331,10 +356,14 @@
inputFileListPaths = (
"${PODS_ROOT}/Target Support Files/Pods-ShenYin/Pods-ShenYin-frameworks-${CONFIGURATION}-input-files.xcfilelist",
);
+ inputPaths = (
+ );
name = "[CP] Embed Pods Frameworks";
outputFileListPaths = (
"${PODS_ROOT}/Target Support Files/Pods-ShenYin/Pods-ShenYin-frameworks-${CONFIGURATION}-output-files.xcfilelist",
);
+ outputPaths = (
+ );
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-ShenYin/Pods-ShenYin-frameworks.sh\"\n";
diff --git a/ShenYin/ShenYin/Sdk/DcSdk/DcXcly.swift b/ShenYin/ShenYin/Sdk/DcSdk/DcXcly.swift
index 75a42dc..03f6302 100644
--- a/ShenYin/ShenYin/Sdk/DcSdk/DcXcly.swift
+++ b/ShenYin/ShenYin/Sdk/DcSdk/DcXcly.swift
@@ -16,8 +16,8 @@ class DcXcly:NSObject{
var recordList : [(String,UInt)] = []
var recordText = ""
private var pausText = ""
- private var recordPath:String?
- private var wavPath:String?
+ private var lastPath:String?
+ private var isPause:Bool = false
/// ç¶æç åè°
public var codeCallback:((Int)->Void)?
@@ -37,18 +37,16 @@ class DcXcly:NSObject{
}
DCBleRecord.shared.filePathCallBack = { [weak self] path in
guard let self = self else{return}
- if recordText.isEmpty{
+ if isPause {
+ lastPath = YLToos.mergeFile(path1: lastPath, path2: path)
return
}
- guard let path = path,path.isNotEmpty else{
+ guard let desPath = YLToos.mergeFile(path1: lastPath, path2: path) else{
return
}
- let path1 = OpusTool.opusFile(toWAVFile: path)
+
+ let path1 = OpusTool.opusFile(toWAVFile: desPath)
guard let wavPath = DCFolder.recordFileResave(srcPath: path1) else{return}
- self.wavPath = wavPath
- if path == recordPath {
- return
- }
recordFinish?(wavPath)
}
}
@@ -60,46 +58,28 @@ class DcXcly:NSObject{
recordList.removeAll()
recordText = ""
pausText = ""
- wavPath = nil
setupSdk()
- recordPath = DcXcly.getFilePath()
- DCBleRecord.shared.start(type: 0x00, recordPath: recordPath )
+ lastPath = nil
+ isPause = false
+ DCBleRecord.shared.start(type: 0x00, recordPath: nil )
}
func recordResume(){
- wavPath = nil
+ isPause = false
pausText = recordText
- DCBleRecord.shared.start(type: 0x00, recordPath: recordPath )
+ DCBleRecord.shared.start(type: 0x00, recordPath: nil )
}
func recordPause(){
+ isPause = true
DCBleRecord.shared.stop()
}
func recordStop(){
- recordPath = nil
- DCBleRecord.shared.stop()
- if let path = wavPath {
- recordFinish?(path)
+ if isPause {
+ let path1 = OpusTool.opusFile(toWAVFile: lastPath!)
+ guard let wavPath = DCFolder.recordFileResave(srcPath: path1) else{return}
+ recordFinish?(wavPath)
}
- }
-}
-
-extension DcXcly{
- static func getFilePath()->String?{
- // è·åç¼åç®å½è·¯å¾
- guard let cacheDirectory = FileManager.default.urls(for:.cachesDirectory, in:.userDomainMask).first else {
- print("æ æ³è·åç¼åç®å½")
- return nil
+ else{
+ DCBleRecord.shared.stop()
}
- // æå»ºå缩æä»¶è·¯å¾
- let name = "\(Int(Date().timeIntervalSince1970*1000)).opus"
- let path = cacheDirectory.appendingPathComponent(name).path
- return path
}
-// static func getFilePath()->String?{
-// // è·åç¼åç®å½è·¯å¾
-// let cacheDirectory = DCFolder.record
-// // æå»ºå缩æä»¶è·¯å¾
-// let name = "\(Int(Date().timeIntervalSince1970*1000)).opus"
-// let path = cacheDirectory + name
-// return path
-// }
}
diff --git a/ShenYin/ShenYin/Tools/YLTools.swift b/ShenYin/ShenYin/Tools/YLTools.swift
index 30e833f..3e7abd7 100644
--- a/ShenYin/ShenYin/Tools/YLTools.swift
+++ b/ShenYin/ShenYin/Tools/YLTools.swift
@@ -104,6 +104,37 @@ class YLToos {
}
return randomString
}
+
+ static func mergeFile(path1:String?,path2:String?)->String?{
+
+ var data = Data()
+ if let path11 = path1,path11.isNotEmpty,FileManager.default.fileExists(atPath: path11){
+ do{
+ let data1 = try Data(contentsOf: URL(fileURLWithPath: path11))
+ data.append(data1)
+ }catch{}
+ }
+ if let path22 = path2,path22.isNotEmpty,FileManager.default.fileExists(atPath: path22){
+ do{
+ let data2 = try Data(contentsOf: URL(fileURLWithPath: path22))
+ data.append(data2)
+ }catch{}
+ }
+
+ guard let destPath = FileManager.default.urls(for: .cachesDirectory, in: .userDomainMask).first?.appendingPathComponent("\(Date().timeIntervalSince1970).opus").path else{
+ return nil
+ }
+ if data.isEmpty{
+ return nil
+ }
+ do{
+ try data.write(to: URL(fileURLWithPath: destPath))
+ return destPath
+ }
+ catch{
+ return nil
+ }
+ }
}
extension Data {
@@ -128,13 +159,11 @@ import Photos
extension UIImage {
func tinted(with color: UIColor) -> UIImage? {
- print("å¼å§å¤çå¾åé¢è²ä¿®æ¹ï¼Core Graphicsæ¹å¼ï¼")
UIGraphicsBeginImageContextWithOptions(size, false, scale)
defer {
UIGraphicsEndImageContext()
}
guard let context = UIGraphicsGetCurrentContext() else {
- print("æ æ³è·åå½åå¾å½¢ä¸ä¸æ")
return nil
}
context.translateBy(x: 0, y: size.height)
diff --git a/document/JoyGemAI.framework/Headers/JoyGemAI-Swift.h b/document/JoyGemAI.framework/Headers/JoyGemAI-Swift.h
new file mode 100644
index 0000000..344f048
--- /dev/null
+++ b/document/JoyGemAI.framework/Headers/JoyGemAI-Swift.h
@@ -0,0 +1,315 @@
+#if 0
+#elif defined(__arm64__) && __arm64__
+// Generated by Apple Swift version 6.0.3 effective-5.10 (swiftlang-6.0.3.1.10 clang-1600.0.30.1)
+#ifndef JOYGEMAI_SWIFT_H
+#define JOYGEMAI_SWIFT_H
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wgcc-compat"
+
+#if !defined(__has_include)
+# define __has_include(x) 0
+#endif
+#if !defined(__has_attribute)
+# define __has_attribute(x) 0
+#endif
+#if !defined(__has_feature)
+# define __has_feature(x) 0
+#endif
+#if !defined(__has_warning)
+# define __has_warning(x) 0
+#endif
+
+#if __has_include()
+# include
+#endif
+
+#pragma clang diagnostic ignored "-Wauto-import"
+#if defined(__OBJC__)
+#include
+#endif
+#if defined(__cplusplus)
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#else
+#include
+#include
+#include
+#include
+#endif
+#if defined(__cplusplus)
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wnon-modular-include-in-framework-module"
+#if defined(__arm64e__) && __has_include()
+# include
+#else
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wreserved-macro-identifier"
+# ifndef __ptrauth_swift_value_witness_function_pointer
+# define __ptrauth_swift_value_witness_function_pointer(x)
+# endif
+# ifndef __ptrauth_swift_class_method_pointer
+# define __ptrauth_swift_class_method_pointer(x)
+# endif
+#pragma clang diagnostic pop
+#endif
+#pragma clang diagnostic pop
+#endif
+
+#if !defined(SWIFT_TYPEDEFS)
+# define SWIFT_TYPEDEFS 1
+# if __has_include()
+# include
+# elif !defined(__cplusplus)
+typedef uint_least16_t char16_t;
+typedef uint_least32_t char32_t;
+# endif
+typedef float swift_float2 __attribute__((__ext_vector_type__(2)));
+typedef float swift_float3 __attribute__((__ext_vector_type__(3)));
+typedef float swift_float4 __attribute__((__ext_vector_type__(4)));
+typedef double swift_double2 __attribute__((__ext_vector_type__(2)));
+typedef double swift_double3 __attribute__((__ext_vector_type__(3)));
+typedef double swift_double4 __attribute__((__ext_vector_type__(4)));
+typedef int swift_int2 __attribute__((__ext_vector_type__(2)));
+typedef int swift_int3 __attribute__((__ext_vector_type__(3)));
+typedef int swift_int4 __attribute__((__ext_vector_type__(4)));
+typedef unsigned int swift_uint2 __attribute__((__ext_vector_type__(2)));
+typedef unsigned int swift_uint3 __attribute__((__ext_vector_type__(3)));
+typedef unsigned int swift_uint4 __attribute__((__ext_vector_type__(4)));
+#endif
+
+#if !defined(SWIFT_PASTE)
+# define SWIFT_PASTE_HELPER(x, y) x##y
+# define SWIFT_PASTE(x, y) SWIFT_PASTE_HELPER(x, y)
+#endif
+#if !defined(SWIFT_METATYPE)
+# define SWIFT_METATYPE(X) Class
+#endif
+#if !defined(SWIFT_CLASS_PROPERTY)
+# if __has_feature(objc_class_property)
+# define SWIFT_CLASS_PROPERTY(...) __VA_ARGS__
+# else
+# define SWIFT_CLASS_PROPERTY(...)
+# endif
+#endif
+#if !defined(SWIFT_RUNTIME_NAME)
+# if __has_attribute(objc_runtime_name)
+# define SWIFT_RUNTIME_NAME(X) __attribute__((objc_runtime_name(X)))
+# else
+# define SWIFT_RUNTIME_NAME(X)
+# endif
+#endif
+#if !defined(SWIFT_COMPILE_NAME)
+# if __has_attribute(swift_name)
+# define SWIFT_COMPILE_NAME(X) __attribute__((swift_name(X)))
+# else
+# define SWIFT_COMPILE_NAME(X)
+# endif
+#endif
+#if !defined(SWIFT_METHOD_FAMILY)
+# if __has_attribute(objc_method_family)
+# define SWIFT_METHOD_FAMILY(X) __attribute__((objc_method_family(X)))
+# else
+# define SWIFT_METHOD_FAMILY(X)
+# endif
+#endif
+#if !defined(SWIFT_NOESCAPE)
+# if __has_attribute(noescape)
+# define SWIFT_NOESCAPE __attribute__((noescape))
+# else
+# define SWIFT_NOESCAPE
+# endif
+#endif
+#if !defined(SWIFT_RELEASES_ARGUMENT)
+# if __has_attribute(ns_consumed)
+# define SWIFT_RELEASES_ARGUMENT __attribute__((ns_consumed))
+# else
+# define SWIFT_RELEASES_ARGUMENT
+# endif
+#endif
+#if !defined(SWIFT_WARN_UNUSED_RESULT)
+# if __has_attribute(warn_unused_result)
+# define SWIFT_WARN_UNUSED_RESULT __attribute__((warn_unused_result))
+# else
+# define SWIFT_WARN_UNUSED_RESULT
+# endif
+#endif
+#if !defined(SWIFT_NORETURN)
+# if __has_attribute(noreturn)
+# define SWIFT_NORETURN __attribute__((noreturn))
+# else
+# define SWIFT_NORETURN
+# endif
+#endif
+#if !defined(SWIFT_CLASS_EXTRA)
+# define SWIFT_CLASS_EXTRA
+#endif
+#if !defined(SWIFT_PROTOCOL_EXTRA)
+# define SWIFT_PROTOCOL_EXTRA
+#endif
+#if !defined(SWIFT_ENUM_EXTRA)
+# define SWIFT_ENUM_EXTRA
+#endif
+#if !defined(SWIFT_CLASS)
+# if __has_attribute(objc_subclassing_restricted)
+# define SWIFT_CLASS(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) __attribute__((objc_subclassing_restricted)) SWIFT_CLASS_EXTRA
+# define SWIFT_CLASS_NAMED(SWIFT_NAME) __attribute__((objc_subclassing_restricted)) SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_CLASS_EXTRA
+# else
+# define SWIFT_CLASS(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) SWIFT_CLASS_EXTRA
+# define SWIFT_CLASS_NAMED(SWIFT_NAME) SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_CLASS_EXTRA
+# endif
+#endif
+#if !defined(SWIFT_RESILIENT_CLASS)
+# if __has_attribute(objc_class_stub)
+# define SWIFT_RESILIENT_CLASS(SWIFT_NAME) SWIFT_CLASS(SWIFT_NAME) __attribute__((objc_class_stub))
+# define SWIFT_RESILIENT_CLASS_NAMED(SWIFT_NAME) __attribute__((objc_class_stub)) SWIFT_CLASS_NAMED(SWIFT_NAME)
+# else
+# define SWIFT_RESILIENT_CLASS(SWIFT_NAME) SWIFT_CLASS(SWIFT_NAME)
+# define SWIFT_RESILIENT_CLASS_NAMED(SWIFT_NAME) SWIFT_CLASS_NAMED(SWIFT_NAME)
+# endif
+#endif
+#if !defined(SWIFT_PROTOCOL)
+# define SWIFT_PROTOCOL(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) SWIFT_PROTOCOL_EXTRA
+# define SWIFT_PROTOCOL_NAMED(SWIFT_NAME) SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_PROTOCOL_EXTRA
+#endif
+#if !defined(SWIFT_EXTENSION)
+# define SWIFT_EXTENSION(M) SWIFT_PASTE(M##_Swift_, __LINE__)
+#endif
+#if !defined(OBJC_DESIGNATED_INITIALIZER)
+# if __has_attribute(objc_designated_initializer)
+# define OBJC_DESIGNATED_INITIALIZER __attribute__((objc_designated_initializer))
+# else
+# define OBJC_DESIGNATED_INITIALIZER
+# endif
+#endif
+#if !defined(SWIFT_ENUM_ATTR)
+# if __has_attribute(enum_extensibility)
+# define SWIFT_ENUM_ATTR(_extensibility) __attribute__((enum_extensibility(_extensibility)))
+# else
+# define SWIFT_ENUM_ATTR(_extensibility)
+# endif
+#endif
+#if !defined(SWIFT_ENUM)
+# define SWIFT_ENUM(_type, _name, _extensibility) enum _name : _type _name; enum SWIFT_ENUM_ATTR(_extensibility) SWIFT_ENUM_EXTRA _name : _type
+# if __has_feature(generalized_swift_name)
+# define SWIFT_ENUM_NAMED(_type, _name, SWIFT_NAME, _extensibility) enum _name : _type _name SWIFT_COMPILE_NAME(SWIFT_NAME); enum SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_ENUM_ATTR(_extensibility) SWIFT_ENUM_EXTRA _name : _type
+# else
+# define SWIFT_ENUM_NAMED(_type, _name, SWIFT_NAME, _extensibility) SWIFT_ENUM(_type, _name, _extensibility)
+# endif
+#endif
+#if !defined(SWIFT_UNAVAILABLE)
+# define SWIFT_UNAVAILABLE __attribute__((unavailable))
+#endif
+#if !defined(SWIFT_UNAVAILABLE_MSG)
+# define SWIFT_UNAVAILABLE_MSG(msg) __attribute__((unavailable(msg)))
+#endif
+#if !defined(SWIFT_AVAILABILITY)
+# define SWIFT_AVAILABILITY(plat, ...) __attribute__((availability(plat, __VA_ARGS__)))
+#endif
+#if !defined(SWIFT_WEAK_IMPORT)
+# define SWIFT_WEAK_IMPORT __attribute__((weak_import))
+#endif
+#if !defined(SWIFT_DEPRECATED)
+# define SWIFT_DEPRECATED __attribute__((deprecated))
+#endif
+#if !defined(SWIFT_DEPRECATED_MSG)
+# define SWIFT_DEPRECATED_MSG(...) __attribute__((deprecated(__VA_ARGS__)))
+#endif
+#if !defined(SWIFT_DEPRECATED_OBJC)
+# if __has_feature(attribute_diagnose_if_objc)
+# define SWIFT_DEPRECATED_OBJC(Msg) __attribute__((diagnose_if(1, Msg, "warning")))
+# else
+# define SWIFT_DEPRECATED_OBJC(Msg) SWIFT_DEPRECATED_MSG(Msg)
+# endif
+#endif
+#if defined(__OBJC__)
+#if !defined(IBSegueAction)
+# define IBSegueAction
+#endif
+#endif
+#if !defined(SWIFT_EXTERN)
+# if defined(__cplusplus)
+# define SWIFT_EXTERN extern "C"
+# else
+# define SWIFT_EXTERN extern
+# endif
+#endif
+#if !defined(SWIFT_CALL)
+# define SWIFT_CALL __attribute__((swiftcall))
+#endif
+#if !defined(SWIFT_INDIRECT_RESULT)
+# define SWIFT_INDIRECT_RESULT __attribute__((swift_indirect_result))
+#endif
+#if !defined(SWIFT_CONTEXT)
+# define SWIFT_CONTEXT __attribute__((swift_context))
+#endif
+#if !defined(SWIFT_ERROR_RESULT)
+# define SWIFT_ERROR_RESULT __attribute__((swift_error_result))
+#endif
+#if defined(__cplusplus)
+# define SWIFT_NOEXCEPT noexcept
+#else
+# define SWIFT_NOEXCEPT
+#endif
+#if !defined(SWIFT_C_INLINE_THUNK)
+# if __has_attribute(always_inline)
+# if __has_attribute(nodebug)
+# define SWIFT_C_INLINE_THUNK inline __attribute__((always_inline)) __attribute__((nodebug))
+# else
+# define SWIFT_C_INLINE_THUNK inline __attribute__((always_inline))
+# endif
+# else
+# define SWIFT_C_INLINE_THUNK inline
+# endif
+#endif
+#if defined(_WIN32)
+#if !defined(SWIFT_IMPORT_STDLIB_SYMBOL)
+# define SWIFT_IMPORT_STDLIB_SYMBOL __declspec(dllimport)
+#endif
+#else
+#if !defined(SWIFT_IMPORT_STDLIB_SYMBOL)
+# define SWIFT_IMPORT_STDLIB_SYMBOL
+#endif
+#endif
+#if defined(__OBJC__)
+#if __has_feature(objc_modules)
+#if __has_warning("-Watimport-in-framework-header")
+#pragma clang diagnostic ignored "-Watimport-in-framework-header"
+#endif
+#endif
+
+#endif
+#pragma clang diagnostic ignored "-Wproperty-attribute-mismatch"
+#pragma clang diagnostic ignored "-Wduplicate-method-arg"
+#if __has_warning("-Wpragma-clang-attribute")
+# pragma clang diagnostic ignored "-Wpragma-clang-attribute"
+#endif
+#pragma clang diagnostic ignored "-Wunknown-pragmas"
+#pragma clang diagnostic ignored "-Wnullability"
+#pragma clang diagnostic ignored "-Wdollar-in-identifier-extension"
+#pragma clang diagnostic ignored "-Wunsafe-buffer-usage"
+
+#if __has_attribute(external_source_symbol)
+# pragma push_macro("any")
+# undef any
+# pragma clang attribute push(__attribute__((external_source_symbol(language="Swift", defined_in="JoyGemAI",generated_declaration))), apply_to=any(function,enum,objc_interface,objc_category,objc_protocol))
+# pragma pop_macro("any")
+#endif
+
+#if defined(__OBJC__)
+#endif
+#if __has_attribute(external_source_symbol)
+# pragma clang attribute pop
+#endif
+#if defined(__cplusplus)
+#endif
+#pragma clang diagnostic pop
+#endif
+
+#else
+#error unsupported Swift architecture
+#endif
diff --git a/document/JoyGemAI.framework/Headers/JoyGemAI.h b/document/JoyGemAI.framework/Headers/JoyGemAI.h
new file mode 100644
index 0000000..f16e0fe
--- /dev/null
+++ b/document/JoyGemAI.framework/Headers/JoyGemAI.h
@@ -0,0 +1,28 @@
+//
+// JoyGemAI.h
+// JoyGemAI
+//
+// Created by JoyGem on 2025/2/10.
+//
+
+#import
+
+//! Project version number for JoyGemAI.
+FOUNDATION_EXPORT double JoyGemAIVersionNumber;
+
+//! Project version string for JoyGemAI.
+FOUNDATION_EXPORT const unsigned char JoyGemAIVersionString[];
+
+// In this header, you should import all the public headers of your framework using statements like #import
+
+#import
+#import
+#import
+#import
+#import
+#import
+#import
+#import
+#import
+#import
+#import
diff --git a/document/JoyGemAI.framework/Headers/JoyGemAIManager.h b/document/JoyGemAI.framework/Headers/JoyGemAIManager.h
new file mode 100644
index 0000000..f60ed8d
--- /dev/null
+++ b/document/JoyGemAI.framework/Headers/JoyGemAIManager.h
@@ -0,0 +1,140 @@
+//
+// JoyGemAIManager.h
+// JoyGemAI
+//
+// Created by JoyGem on 2025/2/10.
+//
+
+#import
+#import
+#import
+#import
+#import
+#import
+
+NS_ASSUME_NONNULL_BEGIN
+
+@protocol JoyGemAIManagerDelegate
+
+/// é´ææåæ¶åè°
+-(void)joyGemAuthSuccessCallback;
+
+/// é´æå¤±è´¥æ¶åè°
+-(void)joyGemAuthFailedCallback;
+
+/// AIè³æºå¨ä½åè°
+/// - NOTE: 对è¯ç¸å
³å¨ä½æ¯éç¥ï¼å³æ¶æ¯æ¥æ¶å·²ç»åçï¼å½é³ç¸å
³å¨ä½æ¯è¯·æ±ï¼å³è³æºæ²¡æå®é
æä½
+@optional
+-(void)joyGemAction:(JoyGemActionMode)action;
+
+@end
+
+@protocol JoyGemAIManagerDataSource
+
+///å®ç°è¯¥æ¹æ³ï¼å°æ°æ®è½¬åç»èç
+@required
+-(void)joyGemSendData:(NSData*)data withCharacteristic:(CBCharacteristic*)characteristic;
+
+@end
+
+@class JoyGemDeviceManager;
+
+@interface JoyGemAIManager : NSObject
+
+@property(nonatomic, weak) id delegate;
+@property(nonatomic, weak) id dataSource;
+
+@property(nonatomic, strong) JoyGemDeviceManager *device;
+
+// å®ä¾å¯¹è±¡
++ (instancetype)shared;
+
+/// åå§åsdk
+- (void)initSdk;
+
+/// åå§åsdk
+/// - Parameter projectID: å¯éæ¹æ³
+- (void)initSdk:(nullable NSString*)projectID;
+
+/// æ¥å¿æå°çº§å«
+/// - Parameter level: æ¥å¿ç级 å为å
³éï¼ç®ç¥ï¼å®å
¨
+- (void)setLogMode:(JoyGemLogMode)mode;
+
+/// æ¥å¿åå¨è·¯å¾
+/// - Parameter path: æ¥å¿åå¨æä»¶è·¯å¾
+/// - Description: 为空æ¶ä¸è¿è¡æ¥å¿åå¨ï¼ 䏿¯æå¤æ¬¡é
ç½®
+- (void)setLogPath:(nullable NSString*)path;
+
+/// ä¼ å
¥èçæå¡å¯¹è±¡
+/// - Parameters:
+/// - service: æå¡å¯¹è±¡
+/// - characteristics: éè¦notifyçç¹å¾
+/// - Returns: æ¯å¦æ£ç¡®çé
ç½®äºç¸å
³æå¡ç¹å¾
+/// - Description: Blockä¸ºåæ¥æä½
+- (BOOL)configService:(CBService*)service needNotify:(void (^)(NSArray*))characteristics;
+
+/// æ¶å°èç设å¤ä¼ è¿æ¥çæ°æ®ï¼è°ç¨æ¤æ¹æ³äº¤ç»sdkå¤ç
+/// - Parameter characteristic:æ´æ°çç¹å¾
+- (void)receiveValue:(CBCharacteristic *)characteristic;
+
+/// èç设å¤å·²è¿æ¥
+- (void)bleConnected;
+
+/// èçæå¼è¿æ¥
+- (void)bleDisConnected;
+
+/// SDKæä»¶å卿件夹
+/// - Parameter path: SDKæä»¶åå¨è·¯å¾ï¼SDKéè¦ç¨å°æä»¶å卿¶ææåçè·¯å¾ï¼
+- (void)setCacheDirectory:(nullable NSString*)path;
+
+/// æ¸
é¤ä¸´æ¶æä»¶
+/// - Description: åªä¼æ¸
é¤å½åé
置路å¾ä¸çæä»¶
+- (void)clearCacheDirectory;
+
+/// TWSè³æºä¸»ä»åæ¢æ¶æ¯å¦å°è¯å½åAIåè½èªå¨å»¶ç»
+/// - Parameters:
+/// - enable: é»è®¤ä¸ºfalse
+-(void)setTWSAutoSync:(BOOL)enable;
+
+-(void)setTextAutoSync:(BOOL)enable;
+
+-(void)setEmotionAutoSync:(BOOL)enable;
+
+/// ææ¬ç¿»è¯
+/// - Parameters:
+/// - text: ç¿»è¯çæå
+/// - fromLanguage: åå§è¯è¨
+/// - toLanguage: ç¿»è¯è¯è¨
+/// - stream: ç»æåè°
+/// - error: é误åè°
+/// - Description: æå¤§ææ¬æ¯æ30K
+- (void)translate:(NSString *)text from:(NSString*)fromLanguage to:(NSString*)toLanguage stream:(void (^)(NSString* llmResponse,BOOL finish))stream error:(void (^)( NSError * _Nullable err))error;
+
+/// åæ¶ææ¬ç¿»è¯
+-(void)cancelTranslateRequest;
+
+/// ææ¬æè¦
+/// - Parameters:
+/// - text: æè¦çæå
+/// - stream: ç»æåè°
+/// - error: é误åè°
+/// - Description: æå¤§ææ¬æ¯æ30K
+- (void)summary:(NSString *)text stream:(void (^)(NSString* llmResponse,BOOL finish))stream error:(void (^)( NSError * _Nullable err))error;
+
+/// åæ¶ææ¬æè¦
+-(void)cancelSummaryRequest;
+
+
+/// 设置åä¼ çttsååºé度
+/// - Parameters:
+/// - speed: é»è®¤1.0ï¼èå´[0.8,2]
+-(void)setTtsSpeed:(float)speed;
+
+/// é
ç½®æµè¯ç¯å¢
+/// - Parameters:
+/// - info: æµè¯ç¯å¢åå
¸
+-(void)setDebugEnvironment:(NSDictionary*)info;
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/document/JoyGemAI.framework/Headers/JoyGemCallManager.h b/document/JoyGemAI.framework/Headers/JoyGemCallManager.h
new file mode 100644
index 0000000..5a4dd0f
--- /dev/null
+++ b/document/JoyGemAI.framework/Headers/JoyGemCallManager.h
@@ -0,0 +1,132 @@
+//
+// JoyGemCallController.h
+// JoyGemAI
+//
+// Created by jjjs on 2025/7/12.
+//
+
+#import
+#import
+
+NS_ASSUME_NONNULL_BEGIN
+
+@class JoyGemCallManager;
+@class JoyGemAsrModel;
+
+//éè¯å½é³çå§æç±»
+@protocol JoyGemCallManagerDelegate
+
+///å½é³æåè¯å«æ¶
+/// - Parameters:
+/// - model: asrè¯å«ç对象
+@optional
+-(void)callManager:(JoyGemCallManager*)manager didUpdateAsr:(JoyGemAsrModel*)model DEPRECATED_MSG_ATTRIBUTE("Use callManager:didUpdateMonoAsr instead if supportStereo is false");;
+
+///æä»¶çæåçåè°
+/// - Parameters:
+/// - path: æä»¶åå¨è·¯å¾ wavæ ¼å¼
+-(void)callManager:(JoyGemCallManager*)manager saveFile:(NSString*)path;
+
+///å½é³ç¶æåè°
+/// - Parameters:
+/// - code: ç¶æåå
+-(void)callManager:(JoyGemCallManager*)manager stateChange:(JoyGemStateCode)code;
+
+/// å½é³é误åè°
+/// - Parameters:
+/// - mode:é误代ç
+-(void)callManager:(JoyGemCallManager*)manager onError:(JoyGemErrorCode)code;
+
+/// éè¯å½é³å¼å¯æ¶ï¼ä¸å¤äºéè¯ç¶æ
+/// - Description: éè¦ç¡®è®¤è³æºæ¯å¦æ¯æè¯¥å¤æï¼å¦æè³æºä¸æ¯æå°ä¸ä¼æ¶å°åè°
+@optional
+-(void)callManagerNotonCall:(JoyGemCallManager*)manager;
+
+///ç»ææ¶çåè°
+/// - Parameters:
+/// - code: å½é³ç»æçåå
+-(void)callManagerStopped:(JoyGemCallManager*)manager reason:(JoyGemRecordStopCode)code;
+
+/// å½é³å®ææ¶çåè°
+/// - Description: å½é³ä»»å¡è°ç¨ç»æåï¼ä¼å¨æå¡å¨ææååºç»æåè¿è¡åè°
+/// - Note: 该æ¥å£ä»
å¨ä»»å¡æåå®ææ¶æä¼è¿è¡åè°ï¼å¹¶ä¸ä¿è¯åstopæ¹æ³å®ç°ä¸ä¸å¯¹åº
+@optional
+-(void)callManagerCompleted:(JoyGemCallManager*)manager;
+
+@end
+
+@protocol JoyGemCallMonoDelegate
+
+///å½é³æåè¯å«æ¶
+/// - Parameters:
+/// - model: asrè¯å«ç对象
+@required
+-(void)callManager:(JoyGemCallManager*)manager didUpdateMonoAsr:(JoyGemAsrModel*)model;
+
+/// å½é³æ¶ç声波强度åè°
+/// - Parameters:
+/// - list: 强度æ°ç»
+/// - timestamp: æ¶é´æ³(ms)
+@optional
+-(void)callManager:(JoyGemCallManager*)manager monoIntensity:(NSArray*)list timestamp:(NSTimeInterval)timestamp;
+
+@end
+
+@protocol JoyGemCallStereoDelegate
+
+///å½é³æåè¯å«
+/// - Parameters:
+/// - model: asrè¯å«ç对象
+/// - index: 声éåºå· 1,2
+@required
+-(void)callManager:(JoyGemCallManager*)manager didUpdateStereoAsr:(JoyGemAsrModel*)model channel:(NSUInteger)index;
+
+/// å½é³æ¶ç声波强度åè°
+/// - Parameters:
+/// - lists: 强度æ°ç»(äºç»´æ°ç»ï¼0为左声éï¼1为å³å£°é)
+/// - timestamp: æ¶é´æ³(ms)
+@optional
+-(void)callManager:(JoyGemCallManager*)manager stereoIntensity:(NSArray*>*)lists timestamp:(NSTimeInterval)timestamp;
+
+
+@end
+
+
+/// éè¯å½é³ç管çç±»
+@interface JoyGemCallManager : NSObject
+
+/// å§æç±»
+/// - Description: éè¯å½é³ç¶æå§æ
+@property(nonatomic, weak) id delegate;
+
+/// è³æºè¯å«è¯è¨
+@property(nonatomic, strong) NSString* originalLanguage;
+
+/// æ¯å¦æ£å¨å½é³
+@property(nonatomic, assign) BOOL isRecording;
+
+/// æ¯å¦æ¯æç«ä½å£°å½é³
+/// - NOTE:é´æåå使ç¨è¯¥å段
+@property(nonatomic, assign ,readonly) BOOL supportStereo;
+
+/// å声éå§æ
+/// - Description: åºä»¶æ¯æå声ééè¯å½é³æ¶ä¼éè¿æ¤å§æè¿è¡åè°
+@property(nonatomic, weak) id monoDelegate;
+
+/// ç«ä½å£°å§æ
+/// - Description: åºä»¶æ¯æå声ééè¯å½é³æ¶ä¼éè¿æ¤å§æè¿è¡åè°
+@property(nonatomic, weak) id stereoDelegate;
+
+/// å®ä¾å¯¹è±¡
++ (instancetype)shared;
+
+/// å¼å§éè¯å½é³
+- (void)start;
+
+/// ç»æéè¯å½é³
+- (void)stop;
+
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/document/JoyGemAI.framework/Headers/JoyGemChatManager.h b/document/JoyGemAI.framework/Headers/JoyGemChatManager.h
new file mode 100644
index 0000000..32c1303
--- /dev/null
+++ b/document/JoyGemAI.framework/Headers/JoyGemChatManager.h
@@ -0,0 +1,122 @@
+//
+// JoyGemChatManager.h
+// JoyGemAI
+//
+// Created by JoyGem on 2025/2/21.
+//
+
+#import
+#import
+
+@class JoyGemChatManager;
+@class JoyGemSpeaker;
+
+
+NS_ASSUME_NONNULL_BEGIN
+
+@protocol JoyGemChatManagerDelegate
+
+///AIè¯é³æ¥æ¶
+/// - Parameters:
+/// - data: é³é¢æ°æ® pcmæ ¼å¼
+/// - index: è¯å¥ID
+/// - sampleRate: éæ ·ç
+/// - finish: è¯¥å¥æ¯å¦ç»æ
+-(void)chatManager:(JoyGemChatManager*)manager audioData:(nullable NSData*)data index:(NSUInteger)index sampleRate:(NSUInteger)sampleRate finish:(BOOL)isFinish;
+
+///ç¨æ·è¯é³è¯å«
+/// - Parameters:
+/// - text: æåæ°æ®
+/// - index: è¯å¥ID
+-(void)chatManager:(JoyGemChatManager*)manager requestText:(nullable NSString*)text index:(NSUInteger)index;
+
+///AIè¯é³è¯å«
+/// - Parameters:
+/// - text: æåæ°æ®
+/// - index: è¯å¥ID
+/// - isFinishï¼å次对è¯ç»æ
+-(void)chatManager:(JoyGemChatManager*)manager responseText:(nullable NSString*)text index:(NSUInteger)index finish:(BOOL)isFinish;
+
+///对è¯ç¶æåè°
+/// - Parameters:
+/// - code: ç¶æåå
+@optional
+-(void)chatManager:(JoyGemChatManager*)manager stateChange:(JoyGemStateCode)code DEPRECATED_MSG_ATTRIBUTE("Use chatManager:eventUpdate instead");
+
+///对è¯äºä»¶åè°
+/// - Parameters:
+/// - event: 对è¯ç¸å
³äºä»¶åè°
+/// - NOTE: éè¦ç¸å
³åºä»¶æ¯æ
+@optional
+-(void)chatManager:(JoyGemChatManager*)manager eventUpdate:(JoyGemChatEvent)event;
+
+/// é误åè°
+/// - Parameters:
+/// - mode:é误代ç
+-(void)chatManager:(JoyGemChatManager*)manager onError:(JoyGemErrorCode)code;
+
+@optional
+-(void)chatManagerStopped:(JoyGemChatManager*)manager DEPRECATED_MSG_ATTRIBUTE("Use isActive instead");
+
+@end
+
+//AI对è¯ç管çç±»
+@interface JoyGemChatManager : NSObject
+
+@property(nonatomic, weak) id delegate;
+
+//æ¯å¦æ£å¨å¯¹è¯å½é³ä¸
+@property(nonatomic, assign) BOOL isRecording;
+
+///æ¯å¦æ£å¨æ´»è·ä¸
+/// - NOTE:å¯ä»¥éç¨KVOçæ¹å¼çå¬è¯¥å¯¹è±¡ï¼ 忬¡å¯¹è¯ä¸ä¼é æè¯¥ç¶ææ¹å
+@property(atomic, assign) BOOL isActive DEPRECATED_MSG_ATTRIBUTE("Use chatManager:eventUpdate instead if supportEvent is true");
+
+///æ¯å¦æ¯æäºä»¶ä¸æ¥æ¨¡å¼
+/// - NOTE:é´æåå使ç¨è¯¥å段
+@property(nonatomic,assign,readonly) BOOL supportEvent;
+
+// å®ä¾å¯¹è±¡
++ (instancetype)shared;
+
+/// å¼å¯å次对è¯
+/// - Note: 妿£å¨ææ¥ï¼éè¦æåå
³éttsååè°ç¨ï¼å¦åå¼å¯æ æ
+- (void)startSingleChat;
+
+/// ç»æåæ¬¡å¯¹è¯
+/// - Note:请å¿å¨å¼å¯å次对è¯åç«å»è°ç¨è¯¥æ¹æ³ï¼å¦åè³æºå¯è½ä¸ä¼å¤ç该次请æ±
+- (void)stopSingleChat;
+
+/// å¼å¯è¿ç»å¯¹è¯
+- (void)startChat;
+
+/// ç»æè¿ç»å¯¹è¯
+- (void)stopChat;
+
+/// ææ¾é³é¢å¼å§åéè¦è°ç¨æ¤æ¹æ³åè¯è³æº
+- (void)playAudioStart;
+
+/// ææ¾é³é¢ç»ææ¶éè¦è°ç¨æ¤æ¹æ³åè¯è³æº
+/// - Description: 妿å¤äºè¿ç»å¯¹è¯ç¶æï¼åå¨è°ç¨è¯¥æ¹æ³åä¼ç´æ¥å¼å¯ä¸ä¸è½®å¯¹è¯
+- (void)playAudioEnd;
+
+///è·åæ¯æè§è²å表
+/// - Parameters:
+/// - list: è§è²å表
+-(void)getSpeakerList:(void (^)(NSArray*))list;
+
+/// é
ç½®å½åè§è²
+-(void)setSpeaker:(JoyGemSpeaker*)speaker;
+
+/// é置为é»è®¤è§è²
+-(void)resetSpearker;
+
+/// è¿å
¥è±è¯å£è¯éªç»æ¨¡å¼
+-(void)startSpoken;
+
+/// éåºè±è¯å£è¯éªç»æ¨¡å¼
+-(void)stopSpoken;
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/document/JoyGemAI.framework/Headers/JoyGemDeviceManager.h b/document/JoyGemAI.framework/Headers/JoyGemDeviceManager.h
new file mode 100644
index 0000000..39217c0
--- /dev/null
+++ b/document/JoyGemAI.framework/Headers/JoyGemDeviceManager.h
@@ -0,0 +1,101 @@
+//
+// JoyGemDeviceManager.h
+// JoyGemAI
+//
+// Created by jjjs on 2025/9/1.
+//
+
+#import
+#import "JoyGemEnum.h"
+#import "JoyGemModel.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface JoyGemDeviceManager : NSObject
+
+@property(nonatomic,assign) BOOL twsStatus;
+
+/// è·åmacå°å
+/// - Returns:
+/// - edrAddress: ç»å
¸èçå°å
+/// - bleAddress: bleèçå°å
+-(void)macAddress:(void (^)(NSString* edrAddress,NSString* bleAddress))address error:(void (^)( NSError * _Nullable err))error;
+
+/// è·åè½¯ä»¶çæ¬
+/// - Returns:
+/// - version: è½¯ä»¶çæ¬
+-(void)software:(void (^)(NSString* version))infomation error:(void (^)( NSError * _Nullable err))error;
+
+
+/// 设置çµéçå¬
+/// - Parameters:
+/// - left: å·¦è³çµé
+/// - right: å³è³çµé
+/// - Description: çµéèå´ä¸º0~100ï¼å½æªè·åå°çµéæ¶ï¼çµé为-1ï¼é
ç½®åè°æ¶ï¼å¦ææå岿°æ®ï¼ä¼è¿åæåçå岿°æ®ï¼è³æºä¼å¨çµéåæ´æ¶ä¸»å¨ä¸æ¥æ°æ®
+-(void)setBatteryListener:(void (^)(NSInteger left, NSInteger right))batteryListener;
+
+/// 主å¨è·åçµé
+-(void)updateBattery;
+
+/// è®¾ç½®è³æºç¶æçå¬
+/// - Parameters:
+/// - btConnected: ç»å
¸èçè¿æ¥ç¶æ
+/// - twsConnected : åè³æ¨¡å¼è¿æ¥ç¶æ
+/// - Description: é¨å设置éè¦å¨åè³æ¨¡å¼ä¸æè½çæ
+-(void)setStatusListener:(void (^)(BOOL btConnected,BOOL twsConnected))statusListener;
+
+/// 主å¨è·åè³æºç¶æ
+-(void)updateStatus;
+
+/// 设置VADææç¶æ
+/// - Parameters:
+/// - isOpen: VADæææ¯å¦å¼å¯
+/// - Description: 该设置å¿
é¡»å¨åè³æ¨¡å¼ä¸æè½çæï¼å¦åè¿å失败
+-(void)setVADInterruptedStatus:(BOOL)isOpen callback:(void (^)( NSError * _Nullable err))error;
+
+/// è·åVADææç¶æ
+/// - Returns:
+/// - status: VADæææ¯å¦å¼å¯
+-(void)getVADInterruptedStatus:(void (^)(BOOL isOpen))status error:(void (^)( NSError * _Nullable err))error;
+
+
+/// 设置EQ模å¼
+/// - Parameters:
+/// - mode: EQ模å¼
+/// - Description: 该设置å¿
é¡»å¨åè³æ¨¡å¼ä¸æè½çæï¼å¦åè¿å失败
+-(void)setEQMode:(JoyGemEQMode)mode callback:(void (^)( NSError * _Nullable err))error;
+
+/// è·åEQ模å¼
+/// - Returns:
+/// - mode: VADæææ¯å¦å¼å¯
+-(void)getEQMode:(void (^)(JoyGemEQMode mode))mode error:(void (^)( NSError * _Nullable err))error;
+
+/// 设置èªå®ä¹EQ
+/// - Parameters:
+/// - index: 颿®µ èå´ä¸º0~9
+/// - gain: å¢ç èå´ä¸º -12~12
+/// - Description: 该设置å¿
é¡»å¨åè³æ¨¡å¼ä¸æè½çæï¼å¦åè¿å失败
+-(void)setCustomEQ:(NSUInteger)index withGain:(NSInteger)gain callback:(void (^)( NSError * _Nullable err))error;
+
+/// éç½®èªå®ä¹EQ
+/// - Description: 该设置å¿
é¡»å¨åè³æ¨¡å¼ä¸æè½çæï¼å¦åè¿å失败
+-(void)resetCustomEQ:(void (^)( NSError * _Nullable err))error;
+
+/// è·åèªå®ä¹EQ
+/// - Returns:
+/// - custom: èªå®ä¹EQç±»å
+-(void)getCustomEQ:(void (^)(JoyGemCustomEQ*))custom error:(void (^)( NSError * _Nullable err))error;
+
+/// æ¥æ¾è³æº
+/// - Parameters:
+/// - mode: æ¥æ¾è³æºå½ä»¤ç±»å
+-(void)findHeadphone:(JoyGemFindHeadphoneMode)mode callback:(void (^)( NSError * _Nullable err))error;
+
+/// è·å设å¤DNç
+/// - Parameters:
+/// - dn: 设å¤DNï¼åä¸å°åè¿å空å¼
+-(void)getDN:(void (^)(NSString*))dn error:(void (^)( NSError * _Nullable err))error;
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/document/JoyGemAI.framework/Headers/JoyGemEnum.h b/document/JoyGemAI.framework/Headers/JoyGemEnum.h
new file mode 100644
index 0000000..b95de14
--- /dev/null
+++ b/document/JoyGemAI.framework/Headers/JoyGemEnum.h
@@ -0,0 +1,86 @@
+//
+// JoyGemAIEnum.h
+// JoyGemAI
+//
+// Created by JoyGem on 2025/2/21.
+//
+
+#ifndef JoyGemAIEnum_h
+#define JoyGemAIEnum_h
+
+/// ç¶æåå
+typedef NS_OPTIONS(NSInteger,JoyGemStateCode) {
+ JoyGemStateCodeStartRecord = 1001,///å¼å§å½é³
+ JoyGemStateCodeStopRecord = 1002,///忢å½é³
+ JoyGemStateCodeWebsocketConnected = 3001,///socketè¿ä¸
+ JoyGemStateCodeWebsocketDisconnected = 3002,///socketæå¼è¿æ¥
+};
+
+/// é误
+typedef NS_OPTIONS(NSInteger,JoyGemErrorCode) {
+ JoyGemErrorCodeRecordError = 1003,///å½é³åºé
+ JoyGemErrorCodeNetError = 3003,///ç½ç»é误
+ JoyGemErrorCodeUnAuth = 9999,///æªé´æ
+};
+
+/// å½é³ç±»å
+typedef NS_ENUM(NSUInteger, JoyGemRecordMode) {
+ JoyGemRecordModeLive = 1, ///ç°åºå½é³
+ JoyGemRecordModeCall = 2, ///éè¯å½é³
+};
+
+/// æ¥å¿ç±»å
+typedef NS_ENUM(NSUInteger, JoyGemLogMode) {
+ JoyGemLogModeClose, ///å
³éæ¥å¿
+ JoyGemLogModeSimple, ///ç®ç¥æ¥å¿
+ JoyGemLogModeAll, ///宿´æ¥å¿
+};
+
+/// å¨ä½ç±»å
+typedef NS_ENUM(NSUInteger, JoyGemActionMode) {
+ JoyGemActionModeCancel = 0, ///å
³éå½åAIåè½
+ JoyGemActionModeRecordLive = 1, ///ç°åºå½é³
+ JoyGemActionModeRecordCall = 2, ///éè¯å½é³
+ JoyGemActionModeSi = 3, ///åå£°ä¼ è¯
+ JoyGemActionModeChat = 4, ///AI对è¯
+};
+
+/// å½é³ç»æç±»å
+typedef NS_ENUM(NSUInteger, JoyGemRecordStopCode) {
+ JoyGemRecordStopCodeActively = 0, ///ç¨æ·ä¸»å¨å
³éå½é³
+ JoyGemRecordStopCodePassively = 1, ///ç¨æ·è¢«å¨å
³éå½é³
+};
+
+
+/// 对è¯äºä»¶ç±»å
+typedef NS_ENUM(NSUInteger, JoyGemChatEvent) {
+ JoyGemChatEventIdle = 0, /// 空é²ä¸
+ JoyGemChatEventBegin, /// å¼å§å¯¹è¯ï¼å轮对è¯ä¸ä¼äº§ç该äºä»¶ï¼
+ JoyGemChatEventEnd, /// ç»æå¯¹è¯ï¼å轮对è¯ä¸ä¼äº§ç该äºä»¶ï¼
+ JoyGemChatEventNewRound, /// å¼å§æ°ä¸è½®å¯¹è¯
+ JoyGemChatEventRecording, /// å½é³ä¸
+ JoyGemChatEventRspWaiting, /// çå¾
ä¸
+ JoyGemChatEventPlaying, /// æ£å¨ææ¾å£°é³
+ JoyGemChatEventPlayEnd, /// ç»æææ¾å£°é³
+};
+
+/// EQç±»å
+typedef NS_ENUM(NSUInteger, JoyGemEQMode) {
+ JoyGemEQModeNormal, ///æ®é
+ JoyGemEQModeRock, ///ææ»
+ JoyGemEQModePop, ///æµè¡
+ JoyGemEQModeClassic, ///ç»å
¸
+ JoyGemEQModeJazz, ///çµå£«
+ JoyGemEQModeCustom, ///èªå®ä¹
+};
+
+
+/// EQç±»å
+typedef NS_ENUM(NSUInteger, JoyGemFindHeadphoneMode) {
+ JoyGemFindHeadphoneModeCancel, ///å
³éæ¥æ¾è³æº
+ JoyGemFindHeadphoneModeLeft, ///æ¥æ¾å·¦è³
+ JoyGemFindHeadphoneModeRight, ///æ¥æ¾å³è³
+ JoyGemFindHeadphoneModeAll, ///æ¥æ¾åè³
+};
+
+#endif /* JoyGemAIEnum_h */
diff --git a/document/JoyGemAI.framework/Headers/JoyGemModel.h b/document/JoyGemAI.framework/Headers/JoyGemModel.h
new file mode 100644
index 0000000..3a7cf57
--- /dev/null
+++ b/document/JoyGemAI.framework/Headers/JoyGemModel.h
@@ -0,0 +1,55 @@
+//
+// JoyGemAIModel.h
+// JoyGemAI
+//
+// Created by JoyGem on 2025/2/10.
+//
+
+#import
+
+NS_ASSUME_NONNULL_BEGIN
+
+///AI对è¯è§è²
+@interface JoyGemSpeaker : NSObject
+
+@property (nonatomic, strong) NSString *sid;/// é³è²id
+@property (nonatomic, strong) NSString *name;/// åç§°
+@property (nonatomic, strong) NSString *type;/// ç±»å
+@property (nonatomic, strong) NSString *role;/// è§è²
+
+///é»è®¤è§è²
++(JoyGemSpeaker*)defaultRole;
+
+///é»è®¤çå£è¯éªç»è§è²
++(JoyGemSpeaker*)defaultSpoken;
+
+@end
+
+///ASR对象
+@interface JoyGemAsrModel : NSObject
+
+@property (nonatomic, strong) NSString *text; /// ææ¬
+@property (nonatomic, assign) NSUInteger index; /// åºå·
+@property (nonatomic, assign) BOOL definite; /// çæ®µåç¡®å®(ä¸å»ºè®®ä½ä¸ºæå¥æ è¯)
+
+@end
+
+///èªå®ä¹EQ设置对象
+@interface JoyGemCustomEQ : NSObject
+
+@property (nonatomic, strong) NSArray *bands;
+
+@end
+
+///å½é³å£°çº¹è¯å«
+@interface JoyGemRecordSpeaker : NSObject
+
+@property (nonatomic, copy, nullable) NSString *speakerId; /// 说è¯äººIDï¼å符串ï¼å¦ "1"ï¼
+@property (nonatomic, assign) NSInteger startTime; /// èµ·å§æ¶é´(ms)
+@property (nonatomic, assign) NSInteger endTime; /// ç»ææ¶é´(ms)
+@property (nonatomic, copy, nullable) NSString *text; /// è¯¥æ®µææ¬
+@property (nonatomic, assign) NSInteger index; /// 该段确å®åºå·
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/document/JoyGemAI.framework/Headers/JoyGemParam.h b/document/JoyGemAI.framework/Headers/JoyGemParam.h
new file mode 100644
index 0000000..b1f5ab6
--- /dev/null
+++ b/document/JoyGemAI.framework/Headers/JoyGemParam.h
@@ -0,0 +1,75 @@
+//
+// JoyGemAIParam.h
+// JoyGemAI
+//
+// Created by JoyGem on 2025/2/10.
+//
+
+#import
+
+NS_ASSUME_NONNULL_BEGIN
+
+///MARK: è¯é³è¯è¨
+
+//èªå¨è¯å«ä¸è±
+extern NSString* const kJoyGemAILocalizationAuto;
+
+//ç®ä½ä¸æ zh-CN
+extern NSString* const kJoyGemAILocalizationZH;
+
+//è±æ en-US
+extern NSString* const kJoyGemAILocalizationEN;
+
+//æ¥è¯ ja-JP
+extern NSString* const kJoyGemAILocalizationJA;
+
+//é©è¯ ko-KR
+extern NSString* const kJoyGemAILocalizationKO;
+
+//æ³è¯ fr-FR
+extern NSString* const kJoyGemAILocalizationFR;
+
+//西ççè¯ es-MX
+extern NSString* const kJoyGemAILocalizationES;
+
+//è¡èçè¯ pt-BR
+extern NSString* const kJoyGemAILocalizationPT;
+
+//å°å°¼è¯ id-ID
+extern NSString* const kJoyGemAILocalizationID;
+
+//ä¿è¯(è¾å
¥) ru-RU
+extern NSString* const kJoyGemAILocalizationRU_Original;
+
+//ä¿è¯(è¾åº) ru
+extern NSString* const kJoyGemAILocalizationRU_Target;
+
+//马æ¥è¯ ms-MY
+extern NSString* const kJoyGemAILocalizationMS;
+
+//å¾·è¯ de-DE
+extern NSString* const kJoyGemAILocalizationDE;
+
+//è²å¾å®¾è¯ fil-PH
+extern NSString* const kJoyGemAILocalizationFIL;
+
+//æ³°è¯ th-TH
+extern NSString* const kJoyGemAILocalizationTH;
+
+//é¿æä¼¯è¯ ar-SA
+extern NSString* const kJoyGemAILocalizationAR;
+
+//è¶åè¯ vi
+extern NSString* const kJoyGemAILocalizationVI;
+
+
+
+///MARK: èçç¸å
³
+///
+///AIåè½ä½¿ç¨çèçæå¡
+extern NSString* const kJoyGemAIServiceUUID;
+
+extern NSString* const kJoyGemAICharacteristicNotifyUUID;
+
+
+NS_ASSUME_NONNULL_END
diff --git a/document/JoyGemAI.framework/Headers/JoyGemRecordManager.h b/document/JoyGemAI.framework/Headers/JoyGemRecordManager.h
new file mode 100644
index 0000000..e95de63
--- /dev/null
+++ b/document/JoyGemAI.framework/Headers/JoyGemRecordManager.h
@@ -0,0 +1,102 @@
+//
+// JoyGemRecordManager.h
+// JoyGemAI
+//
+// Created by JoyGem on 2025/2/21.
+//
+
+#import
+#import
+
+NS_ASSUME_NONNULL_BEGIN
+
+@class JoyGemRecordManager;
+@class JoyGemAsrModel;
+@class JoyGemRecordSpeaker;
+
+//ç°åºå½é³çå§æç±»
+@protocol JoyGemRecordManagerDelegate
+
+///å½é³æåè¯å«æ¶
+/// - Parameters:
+/// - model: asrè¯å«ç对象
+@required
+-(void)recordManager:(JoyGemRecordManager*)manager didUpdateAsr:(JoyGemAsrModel*)model;
+
+///æä»¶çæåçåè°
+/// - Parameters:
+/// - path: æä»¶åå¨è·¯å¾ wavæ ¼å¼
+-(void)recordManager:(JoyGemRecordManager*)manager saveFile:(NSString*)path;
+
+///å½é³ç¶æåè°
+/// - Parameters:
+/// - code: ç¶æåå
+-(void)recordManager:(JoyGemRecordManager*)manager stateChange:(JoyGemStateCode)code;
+
+/// å½é³é误åè°
+/// - Parameters:
+/// - mode:é误代ç
+-(void)recordManager:(JoyGemRecordManager*)manager onError:(JoyGemErrorCode)code;
+
+///ç»ææ¶çåè°
+/// - Parameters:
+/// - code: å½é³ç»æçåå
+-(void)recordManagerStopped:(JoyGemRecordManager*)manager reason:(JoyGemRecordStopCode)code;
+
+/// å½é³å®ææ¶çåè°
+/// - Description: å½é³ä»»å¡è°ç¨ç»æåï¼ä¼å¨æå¡å¨ææååºç»æåè¿è¡åè°
+/// - Note: 该æ¥å£ä»
å¨ä»»å¡æåå®ææ¶æä¼è¿è¡åè°ï¼å¹¶ä¸ä¿è¯åstopæ¹æ³å®ç°ä¸ä¸å¯¹åºï¼
+@optional
+-(void)recordManagerCompleted:(JoyGemRecordManager*)manager;
+
+/// å½é³æ¶ç声波强度åè°
+/// - Parameters:
+/// - list: 强度æ°ç»
+/// - timestamp: æ¶é´æ³(ms)
+@optional
+-(void)recordManager:(JoyGemRecordManager*)manager intensity:(NSArray*)list timestamp:(NSTimeInterval)timestamp;
+
+/// å½é³æ¶ç说è¯äººåºå
+/// - Parameters:
+/// - list: 强度æ°ç»
+/// - timestamp: æ¶é´æ³(ms)
+@optional
+-(void)recordManager:(JoyGemRecordManager*)manager speakers:(NSArray*)list;
+
+@end
+
+/// ç°åºå½é³ç管çç±»
+@interface JoyGemRecordManager : NSObject
+
+/// å§æç±»
+@property(nonatomic, weak) id delegate;
+
+/// è³æºè¯å«è¯è¨
+@property(nonatomic, strong) NSString* originalLanguage;
+
+/// æ¯å¦æ£å¨æåä¸
+@property(nonatomic,assign) BOOL isPause;
+
+/// æ¯å¦å¼å¯å£°çº¹è¯å«
+@property(nonatomic,assign) BOOL useVpr;
+
+/// å®ä¾å¯¹è±¡
++ (instancetype)shared;
+
+/// å¼å¯ç°åºå½é³
+- (void)start;
+
+/// ç»æç°åºå½é³
+- (void)stop;
+
+/// æåå½é³
+- (void)pause;
+
+/// æ¢å¤å½é³
+- (void)resume;
+
+
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/document/JoyGemAI.framework/Headers/JoyGemSIDeviceManager.h b/document/JoyGemAI.framework/Headers/JoyGemSIDeviceManager.h
new file mode 100644
index 0000000..826b9c6
--- /dev/null
+++ b/document/JoyGemAI.framework/Headers/JoyGemSIDeviceManager.h
@@ -0,0 +1,91 @@
+//
+// JoyGemSIDeviceManager.h
+// JoyGemAI
+//
+// Created by jjjs on 2025/5/21.
+//
+
+#import
+#import
+
+NS_ASSUME_NONNULL_BEGIN
+
+@class JoyGemSIDeviceManager;
+@class JoyGemAsrModel;
+
+/// åå£°ä¼ è¯ï¼è®¾å¤ï¼ç管çç±»
+@protocol JoyGemSIDeviceManagerDelegate
+
+///å½é³æåè¯å«æ¶
+/// - Parameters:
+/// - model: asrè¯å«ç对象
+@required
+-(void)siDeviceManager:(JoyGemSIDeviceManager*)manager didUpdateRaw:(JoyGemAsrModel*)model;
+
+///å½é³æåç¿»è¯æ¶
+/// - Parameters:
+/// - model: asrè¯å«ç对象
+@required
+-(void)siDeviceManager:(JoyGemSIDeviceManager*)manager didUpdateTranslate:(JoyGemAsrModel*)model;
+
+///é³é¢æ°æ®æ´æ°æ¶
+/// - Parameters:
+/// - data: æµæ°æ® pcmæ ¼å¼
+@required
+-(void)siDeviceManager:(JoyGemSIDeviceManager*)manager didUpdateAudioData:(NSData*)data sampleRate:(NSUInteger)sampleRate;
+
+///ç»ææ¶çåè°
+/// - Parameters:
+/// - code: å½é³ç»æçåå
+-(void)siDeviceManagerStopped:(JoyGemSIDeviceManager*)manager reason:(JoyGemRecordStopCode)code;
+
+/// å½é³å®ææ¶çåè°
+/// - Description: å½é³ä»»å¡è°ç¨ç»æåï¼ä¼å¨æå¡å¨ææååºç»æåè¿è¡åè°
+/// - Note: 该æ¥å£ä»
å¨ä»»å¡æåå®ææ¶æä¼è¿è¡åè°ï¼å¹¶ä¸ä¿è¯åstopæ¹æ³å®ç°ä¸ä¸å¯¹åº
+@optional
+-(void)siDeviceManagerCompleted:(JoyGemSIDeviceManager*)manager;
+
+///æä»¶çæåçåè°
+/// - Parameters:
+/// - path: æä»¶åå¨è·¯å¾ wavæ ¼å¼
+-(void)siDeviceManager:(JoyGemSIDeviceManager*)manager saveFile:(NSString*)path;
+
+///å½é³ç¶æåè°
+/// - Parameters:
+/// - code: ç¶æåå
+-(void)siDeviceManager:(JoyGemSIDeviceManager*)manager stateChange:(JoyGemStateCode)code;
+
+/// å½é³é误åè°
+/// - Parameters:
+/// - mode:é误代ç
+-(void)siDeviceManager:(JoyGemSIDeviceManager*)manager onError:(JoyGemErrorCode)code;
+
+@end
+
+/// åå£°ä¼ è¯ï¼è®¾å¤ï¼ç管çç±»
+@interface JoyGemSIDeviceManager : NSObject
+
+/// å§æç±»
+@property(nonatomic, weak) id delegate;
+
+/// è³æºè¯å«è¯è¨
+@property(nonatomic, strong) NSString* originalLanguage;
+
+/// è³æºè¾åºè¯è¨
+@property(nonatomic, strong) NSString* targetLanguage;
+
+/// æ¯å¦æ£å¨å½é³
+@property(nonatomic,assign) BOOL isRecording;
+
+/// å®ä¾å¯¹è±¡
++ (instancetype)shared;
+
+/// å¼å§åå£°ä¼ è¯ï¼è®¾å¤ï¼
+- (void)start;
+
+/// ç»æåå£°ä¼ è¯ï¼è®¾å¤ï¼
+- (void)stop;
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/document/JoyGemAI.framework/Headers/JoyGemSIManager.h b/document/JoyGemAI.framework/Headers/JoyGemSIManager.h
new file mode 100644
index 0000000..bf64e1c
--- /dev/null
+++ b/document/JoyGemAI.framework/Headers/JoyGemSIManager.h
@@ -0,0 +1,91 @@
+//
+// JoyGemSIManager.h
+// JoyGemAI
+//
+// Created by JoyGem on 2025/2/21.
+//
+
+#import
+#import
+
+@class JoyGemSIManager;
+@class JoyGemAsrModel;
+
+NS_ASSUME_NONNULL_BEGIN
+
+//åå£°ä¼ è¯çå§æç±»
+@protocol JoyGemSIManagerDelegate
+
+///å½é³æåè¯å«æ¶
+/// - Parameters:
+/// - model: asrè¯å«ç对象
+@required
+-(void)siManager:(JoyGemSIManager*)manager didUpdateRaw:(JoyGemAsrModel*)model;
+
+///å½é³æåç¿»è¯æ¶
+/// - Parameters:
+/// - model: asrè¯å«ç对象
+@required
+-(void)siManager:(JoyGemSIManager*)manager didUpdateTranslate:(JoyGemAsrModel*)model;
+
+///é³é¢æ°æ®æ´æ°æ¶
+/// - Parameters:
+/// - data: æµæ°æ® pcmæ ¼å¼
+@required
+-(void)siManager:(JoyGemSIManager*)manager didUpdateAudioData:(NSData*)data sampleRate:(NSUInteger)sampleRate;
+
+///å½é³ç¶æåæ¢æ¶
+-(void)siManager:(JoyGemSIManager*)manager stateChange:(JoyGemStateCode)code;
+
+///ç»ææ¶çåè°
+/// - Parameters:
+/// - code: å½é³ç»æçåå
+-(void)siManagerStopped:(JoyGemSIManager*)manager reason:(JoyGemRecordStopCode)code;
+
+/// å½é³å®ææ¶çåè°
+/// - Description: å½é³ä»»å¡è°ç¨ç»æåï¼ä¼å¨æå¡å¨ææååºç»æåè¿è¡åè°
+/// - Note: 该æ¥å£ä»
å¨ä»»å¡æåå®ææ¶æä¼è¿è¡åè°ï¼å¹¶ä¸ä¿è¯åstopæ¹æ³å®ç°ä¸ä¸å¯¹åº
+@optional
+-(void)siManagerCompleted:(JoyGemSIManager*)manager;
+
+///æä»¶çæåçåè°
+/// - Parameters:
+/// - path: æä»¶åå¨è·¯å¾ wavæ ¼å¼
+-(void)siManager:(JoyGemSIManager*)manager saveFile:(NSString*)path;
+
+/// é误åè°
+-(void)siManager:(JoyGemSIManager*)manager onError:(JoyGemErrorCode)code;
+
+@end
+
+/// åå£°ä¼ è¯ç管çç±»
+@interface JoyGemSIManager : NSObject
+
+@property(nonatomic, weak) id delegate;
+
+///åå§è¯è¨
+///ç®ååå§è¯è¨è®¾ç½®æ æï¼é»è®¤ä¸ºkJoyGemAILocalizationAuto
+@property(nonatomic, strong) NSString* originalLanguage;
+
+///ç®æ è¯è¨
+///é»è®¤ä¸ºkJoyGemAILocalizationAutoï¼å¯ä»¥è®¾ç½®ä¸ºä¸ææè
è±æ
+@property(nonatomic, strong) NSString* targetLanguage;
+
+/// æ¯å¦æ£å¨å½é³
+@property(nonatomic,assign) BOOL isRecording;
+
+
+/// å®ä¾å¯¹è±¡
++ (instancetype)shared;
+
+/// å¼å¯åå£°ä¼ è¯
+- (void)start;
+
+/// ç»æåå£°ä¼ è¯
+- (void)stop;
+
+
+@end
+
+NS_ASSUME_NONNULL_END
+
diff --git a/document/JoyGemAI.framework/Headers/JoyGemSubtitleManager.h b/document/JoyGemAI.framework/Headers/JoyGemSubtitleManager.h
new file mode 100644
index 0000000..18f6bc5
--- /dev/null
+++ b/document/JoyGemAI.framework/Headers/JoyGemSubtitleManager.h
@@ -0,0 +1,79 @@
+//
+// JoyGemSubtitleManager.h
+// JoyGemAI
+//
+// Created by jjjs on 2025/10/17.
+//
+
+#import
+#import
+
+NS_ASSUME_NONNULL_BEGIN
+
+@class JoyGemSubtitleManager;
+@class JoyGemAsrModel;
+
+/// åå¹ç¿»è¯çå§æ
+@protocol JoyGemSubtitleManagerDelegate
+
+///å½é³æåè¯å«æ¶
+/// - Parameters:
+/// - model: asrè¯å«ç对象
+@required
+-(void)subtitleManager:(JoyGemSubtitleManager*)manager didUpdateRaw:(JoyGemAsrModel*)model;
+
+///å½é³æåç¿»è¯æ¶
+/// - Parameters:
+/// - model: asrè¯å«ç对象
+@required
+-(void)subtitleManager:(JoyGemSubtitleManager*)manager didUpdateTranslate:(JoyGemAsrModel*)model;
+
+///ç»ææ¶çåè°
+/// - Parameters:
+/// - code: å½é³ç»æçåå
+-(void)subtitleManagerStopped:(JoyGemSubtitleManager*)manager;
+
+///å½é³ç¶æåè°
+/// - Parameters:
+/// - code: ç¶æåå
+-(void)subtitleManager:(JoyGemSubtitleManager*)manager stateChange:(JoyGemStateCode)code;
+
+/// å½é³é误åè°
+/// - Parameters:
+/// - mode:é误代ç
+-(void)subtitleManager:(JoyGemSubtitleManager*)manager onError:(JoyGemErrorCode)code;
+
+@end
+
+//åå¹ç¿»è¯ç管çç±»
+@interface JoyGemSubtitleManager : NSObject
+
+/// å§æç±»
+/// - Description: åå¹ç¿»è¯ç¶æå§æ
+@property(nonatomic, weak) id delegate;
+
+/// è³æºè¯å«è¯è¨
+@property(nonatomic, strong) NSString* originalLanguage;
+
+/// è³æºè¾åºè¯è¨
+@property(nonatomic, strong) NSString* targetLanguage;
+
+/// æ¯å¦æ£å¨å½é³
+@property(nonatomic, assign) BOOL isRecording;
+
+/// æ¯å¦æ¯æåå¹ç¿»è¯åè½
+@property(nonatomic, assign) BOOL support;
+
+
+/// å®ä¾å¯¹è±¡
++ (instancetype)shared;
+
+/// å¼å§åå¹ç¿»è¯
+- (void)start;
+
+/// ç»æåå¹ç¿»è¯
+- (void)stop;
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/document/JoyGemAI.framework/Info.plist b/document/JoyGemAI.framework/Info.plist
new file mode 100644
index 0000000..3374824
Binary files /dev/null and b/document/JoyGemAI.framework/Info.plist differ
diff --git a/document/JoyGemAI.framework/JoyGemAI b/document/JoyGemAI.framework/JoyGemAI
new file mode 100755
index 0000000..b8dcb56
Binary files /dev/null and b/document/JoyGemAI.framework/JoyGemAI differ
diff --git a/document/JoyGemAI.framework/Modules/JoyGemAI.swiftmodule/Project/arm64-apple-ios.swiftsourceinfo b/document/JoyGemAI.framework/Modules/JoyGemAI.swiftmodule/Project/arm64-apple-ios.swiftsourceinfo
new file mode 100644
index 0000000..8ef7c46
Binary files /dev/null and b/document/JoyGemAI.framework/Modules/JoyGemAI.swiftmodule/Project/arm64-apple-ios.swiftsourceinfo differ
diff --git a/document/JoyGemAI.framework/Modules/JoyGemAI.swiftmodule/arm64-apple-ios.abi.json b/document/JoyGemAI.framework/Modules/JoyGemAI.swiftmodule/arm64-apple-ios.abi.json
new file mode 100644
index 0000000..993acce
--- /dev/null
+++ b/document/JoyGemAI.framework/Modules/JoyGemAI.swiftmodule/arm64-apple-ios.abi.json
@@ -0,0 +1,21 @@
+{
+ "ABIRoot": {
+ "kind": "Root",
+ "name": "JoyGemAI",
+ "printedName": "JoyGemAI",
+ "children": [
+ {
+ "kind": "Import",
+ "name": "Foundation",
+ "printedName": "Foundation",
+ "declKind": "Import",
+ "moduleName": "JoyGemAI",
+ "declAttributes": [
+ "RawDocComment"
+ ]
+ }
+ ],
+ "json_format_version": 8
+ },
+ "ConstValues": []
+}
\ No newline at end of file
diff --git a/document/JoyGemAI.framework/Modules/JoyGemAI.swiftmodule/arm64-apple-ios.private.swiftinterface b/document/JoyGemAI.framework/Modules/JoyGemAI.swiftmodule/arm64-apple-ios.private.swiftinterface
new file mode 100644
index 0000000..428908e
--- /dev/null
+++ b/document/JoyGemAI.framework/Modules/JoyGemAI.swiftmodule/arm64-apple-ios.private.swiftinterface
@@ -0,0 +1,10 @@
+// swift-interface-format-version: 1.0
+// swift-compiler-version: Apple Swift version 6.0.3 effective-5.10 (swiftlang-6.0.3.1.10 clang-1600.0.30.1)
+// swift-module-flags: -target arm64-apple-ios13.0 -enable-objc-interop -enable-library-evolution -swift-version 5 -enforce-exclusivity=checked -O -enable-bare-slash-regex -module-name JoyGemAI
+// swift-module-flags-ignorable: -no-verify-emitted-module-interface
+import Foundation
+@_exported import JoyGemAI
+import Swift
+import _Concurrency
+import _StringProcessing
+import _SwiftConcurrencyShims
diff --git a/document/JoyGemAI.framework/Modules/JoyGemAI.swiftmodule/arm64-apple-ios.swiftdoc b/document/JoyGemAI.framework/Modules/JoyGemAI.swiftmodule/arm64-apple-ios.swiftdoc
new file mode 100644
index 0000000..8d660ce
Binary files /dev/null and b/document/JoyGemAI.framework/Modules/JoyGemAI.swiftmodule/arm64-apple-ios.swiftdoc differ
diff --git a/document/JoyGemAI.framework/Modules/JoyGemAI.swiftmodule/arm64-apple-ios.swiftinterface b/document/JoyGemAI.framework/Modules/JoyGemAI.swiftmodule/arm64-apple-ios.swiftinterface
new file mode 100644
index 0000000..428908e
--- /dev/null
+++ b/document/JoyGemAI.framework/Modules/JoyGemAI.swiftmodule/arm64-apple-ios.swiftinterface
@@ -0,0 +1,10 @@
+// swift-interface-format-version: 1.0
+// swift-compiler-version: Apple Swift version 6.0.3 effective-5.10 (swiftlang-6.0.3.1.10 clang-1600.0.30.1)
+// swift-module-flags: -target arm64-apple-ios13.0 -enable-objc-interop -enable-library-evolution -swift-version 5 -enforce-exclusivity=checked -O -enable-bare-slash-regex -module-name JoyGemAI
+// swift-module-flags-ignorable: -no-verify-emitted-module-interface
+import Foundation
+@_exported import JoyGemAI
+import Swift
+import _Concurrency
+import _StringProcessing
+import _SwiftConcurrencyShims
diff --git a/document/JoyGemAI.framework/Modules/JoyGemAI.swiftmodule/arm64-apple-ios.swiftmodule b/document/JoyGemAI.framework/Modules/JoyGemAI.swiftmodule/arm64-apple-ios.swiftmodule
new file mode 100644
index 0000000..1001f97
Binary files /dev/null and b/document/JoyGemAI.framework/Modules/JoyGemAI.swiftmodule/arm64-apple-ios.swiftmodule differ
diff --git a/document/JoyGemAI.framework/Modules/module.modulemap b/document/JoyGemAI.framework/Modules/module.modulemap
new file mode 100644
index 0000000..f9d9ea3
--- /dev/null
+++ b/document/JoyGemAI.framework/Modules/module.modulemap
@@ -0,0 +1,11 @@
+framework module JoyGemAI {
+ umbrella header "JoyGemAI.h"
+ export *
+
+ module * { export * }
+}
+
+module JoyGemAI.Swift {
+ header "JoyGemAI-Swift.h"
+ requires objc
+}
diff --git a/document/JoyGemAI.framework/PrivacyInfo.xcprivacy b/document/JoyGemAI.framework/PrivacyInfo.xcprivacy
new file mode 100644
index 0000000..c8b6829
--- /dev/null
+++ b/document/JoyGemAI.framework/PrivacyInfo.xcprivacy
@@ -0,0 +1,27 @@
+
+
+
+
+ NSPrivacyTracking
+
+ NSPrivacyCollectedDataTypes
+
+
+ NSPrivacyCollectedDataType
+ NSPrivacyCollectedDataTypeAudioData
+ NSPrivacyCollectedDataTypeLinked
+
+ NSPrivacyCollectedDataTypeTracking
+
+ NSPrivacyCollectedDataTypePurposes
+
+ NSPrivacyCollectedDataTypePurposeAppFunctionality
+
+
+
+ NSPrivacyTrackingDomains
+
+ NSPrivacyAccessedAPITypes
+
+
+
diff --git a/document/JoyGemAI.framework/_CodeSignature/CodeResources b/document/JoyGemAI.framework/_CodeSignature/CodeResources
new file mode 100644
index 0000000..39407de
--- /dev/null
+++ b/document/JoyGemAI.framework/_CodeSignature/CodeResources
@@ -0,0 +1,333 @@
+
+
+
+
+ files
+
+ Headers/JoyGemAI-Swift.h
+
+ okSjIYqQdjYFuhBqjGvwfYh8+aU=
+
+ Headers/JoyGemAI.h
+
+ 7HO7XUA3NdXWlvtUWyiYdTaaZ4M=
+
+ Headers/JoyGemAIManager.h
+
+ D/pnfOpF7qKhUfhoTsKEfdEQQRQ=
+
+ Headers/JoyGemCallManager.h
+
+ j3rnAsYkKzhbISebVqN00PCSeTk=
+
+ Headers/JoyGemChatManager.h
+
+ RmM4HQA4Ay7VLvTFWPw7s69sqBk=
+
+ Headers/JoyGemDeviceManager.h
+
+ GnuSbYAD+3F7R21VuV35n97Bubk=
+
+ Headers/JoyGemEnum.h
+
+ M1/juV+sL7ggbp4Y9srW0rq/Dqo=
+
+ Headers/JoyGemModel.h
+
+ WP0CE48Wvoq3FJX4ldz90bcNpTw=
+
+ Headers/JoyGemParam.h
+
+ fq/eezzfuJFDMFtH+PXLOMYQQCs=
+
+ Headers/JoyGemRecordManager.h
+
+ GzBtgXRPoBuyG0YwvFmoGA8Yg20=
+
+ Headers/JoyGemSIDeviceManager.h
+
+ aH1rBy/dU7IVJkpw/BVW3BvfNtk=
+
+ Headers/JoyGemSIManager.h
+
+ 363bn6W4/w8F3xEYQrU0LEVD/XM=
+
+ Headers/JoyGemSubtitleManager.h
+
+ fDUdqGo5wSc78huSI4OUK8Qr8AU=
+
+ Info.plist
+
+ yyyfSn0pDOYFx2gtlmBDVpKhVxw=
+
+ Modules/JoyGemAI.swiftmodule/Project/arm64-apple-ios.swiftsourceinfo
+
+ CPeqh4HaaR/F9LP2LFiPwE3Qxzo=
+
+ Modules/JoyGemAI.swiftmodule/arm64-apple-ios.abi.json
+
+ iVs2bUNJJDbD/ENi/Q0lo4aP3uk=
+
+ Modules/JoyGemAI.swiftmodule/arm64-apple-ios.private.swiftinterface
+
+ sOTjmG3OZu9FvWVYyTuqSix+tzU=
+
+ Modules/JoyGemAI.swiftmodule/arm64-apple-ios.swiftdoc
+
+ s/YEyU+lH4pYoG62jihLM2SJPTU=
+
+ Modules/JoyGemAI.swiftmodule/arm64-apple-ios.swiftinterface
+
+ sOTjmG3OZu9FvWVYyTuqSix+tzU=
+
+ Modules/JoyGemAI.swiftmodule/arm64-apple-ios.swiftmodule
+
+ OKLv2mrRkW9EiT9AdyIjFh6WmI8=
+
+ Modules/module.modulemap
+
+ qguEoXSNM0mFX+7WmMXUO3TTSLk=
+
+ PrivacyInfo.xcprivacy
+
+ SRctDO3cqibONLEG7CPcNZVBnXw=
+
+
+ files2
+
+ Headers/JoyGemAI-Swift.h
+
+ hash2
+
+ Jktn0pvS86rbDKXpgT8xSUtpGRzWvf2yzqxwqMqFKS4=
+
+
+ Headers/JoyGemAI.h
+
+ hash2
+
+ AWVDZqJirRMWfVQc7FdxP1cjTTx2LWTSTwHDN0/ySRA=
+
+
+ Headers/JoyGemAIManager.h
+
+ hash2
+
+ hAXAZoFB6Ja0kc5Gm3Bo952k9fZUiSUPYM2f9gyTkQw=
+
+
+ Headers/JoyGemCallManager.h
+
+ hash2
+
+ eKpRq8GaSD9YaI7Tfafc4BVLc/Vz2rS7cEcx8W6S+EI=
+
+
+ Headers/JoyGemChatManager.h
+
+ hash2
+
+ TrJNORF2yq5ZRf++PfcoxEwE0ic9W2VxQ+Nz7M7WKPM=
+
+
+ Headers/JoyGemDeviceManager.h
+
+ hash2
+
+ b8SW0vyfvdZ5JjAexckdczSXWjl11+WIJDM6wuHhBEo=
+
+
+ Headers/JoyGemEnum.h
+
+ hash2
+
+ 6xL0kb6k/tdSxOKLIazlAA2o8gm1ZE3njRHg40EOYMw=
+
+
+ Headers/JoyGemModel.h
+
+ hash2
+
+ 0kLzuK/HuYBvk9JPhWYbR2z7t1XSX83X5Am9ZD+vLXw=
+
+
+ Headers/JoyGemParam.h
+
+ hash2
+
+ QKmLGG6IwVxT2QonEGJzea6rMbUX0PBNGoWpzqSNRbY=
+
+
+ Headers/JoyGemRecordManager.h
+
+ hash2
+
+ ep9EdHop9Qn0M9nCT7YwmHXxJh/XXCjBqtYjErKFd+8=
+
+
+ Headers/JoyGemSIDeviceManager.h
+
+ hash2
+
+ x40L/ElpDJCMjpEBZZancy57toshn0DM6MOhkwnIMYQ=
+
+
+ Headers/JoyGemSIManager.h
+
+ hash2
+
+ NTKnVzoipmhtgLLzocc8J5kT4Q2qmUmVhZ3MgZUrbkA=
+
+
+ Headers/JoyGemSubtitleManager.h
+
+ hash2
+
+ jGDopDnKVm0z/p6dEPEs54wWT6iwbetpqbTXTk8zoAQ=
+
+
+ Modules/JoyGemAI.swiftmodule/Project/arm64-apple-ios.swiftsourceinfo
+
+ hash2
+
+ dSyxVyC1vMbliDqKuW0d31f2wCYxeWsx2/NHJQYPrRc=
+
+
+ Modules/JoyGemAI.swiftmodule/arm64-apple-ios.abi.json
+
+ hash2
+
+ li11LC5FIVL81dorkSyLKnyNa2JtjEuBDo/IzoAeVCU=
+
+
+ Modules/JoyGemAI.swiftmodule/arm64-apple-ios.private.swiftinterface
+
+ hash2
+
+ Xu9oOK+bUwZsz7YKaBS7sdDWZvQJwX6GCeM7UKDOIew=
+
+
+ Modules/JoyGemAI.swiftmodule/arm64-apple-ios.swiftdoc
+
+ hash2
+
+ 4ZSTOVNx5VInV3CLCGXGsOKMICdleteG1O8aHABZCzw=
+
+
+ Modules/JoyGemAI.swiftmodule/arm64-apple-ios.swiftinterface
+
+ hash2
+
+ Xu9oOK+bUwZsz7YKaBS7sdDWZvQJwX6GCeM7UKDOIew=
+
+
+ Modules/JoyGemAI.swiftmodule/arm64-apple-ios.swiftmodule
+
+ hash2
+
+ nRKcutC82zySWegf6JkCelatcDI5wxHUuHo6O2D+Osc=
+
+
+ Modules/module.modulemap
+
+ hash2
+
+ EYrXhwPscfz6NC5xiiSHpFYdSR7Z5+JCyV2sAnxwmPc=
+
+
+ PrivacyInfo.xcprivacy
+
+ hash2
+
+ cuaVRkQIQRl8fLAPRH2XlUdsPxO0W90uL0WcSHvmSnY=
+
+
+
+ rules
+
+ ^.*
+
+ ^.*\.lproj/
+
+ optional
+
+ weight
+ 1000
+
+ ^.*\.lproj/locversion.plist$
+
+ omit
+
+ weight
+ 1100
+
+ ^Base\.lproj/
+
+ weight
+ 1010
+
+ ^version.plist$
+
+
+ rules2
+
+ .*\.dSYM($|/)
+
+ weight
+ 11
+
+ ^(.*/)?\.DS_Store$
+
+ omit
+
+ weight
+ 2000
+
+ ^.*
+
+ ^.*\.lproj/
+
+ optional
+
+ weight
+ 1000
+
+ ^.*\.lproj/locversion.plist$
+
+ omit
+
+ weight
+ 1100
+
+ ^Base\.lproj/
+
+ weight
+ 1010
+
+ ^Info\.plist$
+
+ omit
+
+ weight
+ 20
+
+ ^PkgInfo$
+
+ omit
+
+ weight
+ 20
+
+ ^embedded\.provisionprofile$
+
+ weight
+ 20
+
+ ^version\.plist$
+
+ weight
+ 20
+
+
+
+