From 725e638538b7f59640eaf0bc9775672d5ce8274b Mon Sep 17 00:00:00 2001 From: wolfplus Date: Wed, 4 Jun 2025 15:49:57 +0100 Subject: [PATCH] add --- android/settings.gradle.kts | 7 +- ios/Runner.xcodeproj/project.pbxproj | 140 +-- .../controllers/pairing_controller.dart | 2 +- .../agent_service/android/build.gradle.kts | 2 +- .../agent_service/AgentService.kt | 17 +- .../ios/Classes/AgentServiceImpl.swift | 1032 ----------------- .../ios/Classes/AgentServicePlugin.h | 4 - .../ios/Classes/AgentServicePlugin.m | 12 - .../ios/Classes/AgentServicePlugin.swift | 160 --- .../ios/Classes/AudioSessionHub.swift | 240 ---- .../ios/agent_service/Package.swift | 4 +- .../agent_service/AgentServiceImpl.swift | 6 + .../agent_service/AudioSessionHub.swift | 253 +++- .../agent_service/Resources/calling.mp3 | Bin 0 -> 240691 bytes .../Sources/agent_service/Resources/start.mp3 | Bin 0 -> 56721 bytes .../Sources/agent_service/Resources/stop.mp3 | Bin 0 -> 4746 bytes .../ble_service/BleCompanionManager.kt | 7 + 17 files changed, 328 insertions(+), 1558 deletions(-) delete mode 100644 local_plugins/agent_service/ios/Classes/AgentServiceImpl.swift delete mode 100644 local_plugins/agent_service/ios/Classes/AgentServicePlugin.h delete mode 100644 local_plugins/agent_service/ios/Classes/AgentServicePlugin.m delete mode 100644 local_plugins/agent_service/ios/Classes/AgentServicePlugin.swift delete mode 100644 local_plugins/agent_service/ios/Classes/AudioSessionHub.swift create mode 100644 local_plugins/agent_service/ios/agent_service/Sources/agent_service/Resources/calling.mp3 create mode 100644 local_plugins/agent_service/ios/agent_service/Sources/agent_service/Resources/start.mp3 create mode 100644 local_plugins/agent_service/ios/agent_service/Sources/agent_service/Resources/stop.mp3 diff --git a/android/settings.gradle.kts b/android/settings.gradle.kts index 3dd7256fc..fa5282d77 100644 --- a/android/settings.gradle.kts +++ b/android/settings.gradle.kts @@ -32,7 +32,6 @@ plugins { include(":app") include(":azure_speech") -include(":open_ai_service") include(":chat_storage") include(":jieli") include(":spotify_sdk") @@ -40,13 +39,15 @@ include(":ble_service") include(":classic_bluetooth") include(":agent_service") include(":speech") +include(":open_ai_service") + // 设置azure_speech项目的路径 project(":azure_speech").projectDir = file("../local_plugins/azure_speech/android") -project(":open_ai_service").projectDir = file("../local_plugins/open_ai_service/android") project(":chat_storage").projectDir = file("../local_plugins/chat_storage/android") project(":jieli").projectDir = file("../local_plugins/jieli/android") project(":spotify_sdk").projectDir = file("../local_plugins/spotify_sdk/android") project(":ble_service").projectDir = file("../local_plugins/ble_service/android") project(":classic_bluetooth").projectDir = file("../local_plugins/classic_bluetooth/android") project(":agent_service").projectDir = file("../local_plugins/agent_service/android") -project(":speech").projectDir = file("../local_plugins/speech/android") \ No newline at end of file +project(":speech").projectDir = file("../local_plugins/speech/android") +project(":open_ai_service").projectDir = file("../local_plugins/open_ai_service/android") \ No newline at end of file diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj index 1cead6d7b..6417d441b 100644 --- a/ios/Runner.xcodeproj/project.pbxproj +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -13,11 +13,11 @@ 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; 78A318202AECB46A00862997 /* FlutterGeneratedPluginSwiftPackage in Frameworks */ = {isa = PBXBuildFile; productRef = 78A3181F2AECB46A00862997 /* FlutterGeneratedPluginSwiftPackage */; }; - 93B17271C888656B4B397BC2 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 78CE6F02322D8DF27DF90403 /* Pods_Runner.framework */; }; + 93D73EC48D95512F5F541AD7 /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 162D67C21ED243BA396CEF5C /* Pods_RunnerTests.framework */; }; 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; - E0A3F16A6E4E5EE4E2CFA52A /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C7149989675CB5D71A7427D0 /* Pods_RunnerTests.framework */; }; + CBE786ED7A0DB415954B1BA4 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = EFDA2C0DD7A7D82CA03799B2 /* Pods_Runner.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -48,18 +48,18 @@ 0AD944132DDA0C0D00557D21 /* AccessorySetupKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AccessorySetupKit.framework; path = System/Library/Frameworks/AccessorySetupKit.framework; sourceTree = SDKROOT; }; 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; - 295FC65584EC3019A679107E /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; + 162D67C21ED243BA396CEF5C /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 280769B5B4FB941FA7D35C06 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; + 2C91016A31D6647548E59DC8 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; 331C807B294A618700263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; 331C8081294A63A400263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; - 49AB99AA281C6CC7FD875C0B /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; - 4EC8693222B4131484101683 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; - 58F8C8AD87B4FAC8D686BB67 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; + 46859C536D3D0051CC82E6C5 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; + 4852C04805E85DB32D31EEC2 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; - 78CE6F02322D8DF27DF90403 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 76274BCD123CDD5AF172875F /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; - 8A7A4179E9EBF4D8C8ACC841 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -67,9 +67,9 @@ 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - C7149989675CB5D71A7427D0 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - CC1FCC6CF0A639ACBDAD3D96 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; + CD9846946CA680DD2E0721FA /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; D2958658C06A5ADF62D6ABA2 /* Runner.entitlements */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.entitlements; path = Runner.entitlements; sourceTree = ""; }; + EFDA2C0DD7A7D82CA03799B2 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -78,7 +78,7 @@ buildActionMask = 2147483647; files = ( 78A318202AECB46A00862997 /* FlutterGeneratedPluginSwiftPackage in Frameworks */, - 93B17271C888656B4B397BC2 /* Pods_Runner.framework in Frameworks */, + CBE786ED7A0DB415954B1BA4 /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -86,7 +86,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - E0A3F16A6E4E5EE4E2CFA52A /* Pods_RunnerTests.framework in Frameworks */, + 93D73EC48D95512F5F541AD7 /* Pods_RunnerTests.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -96,12 +96,12 @@ 1ACB686EC7DC36C6E33D372F /* Pods */ = { isa = PBXGroup; children = ( - 58F8C8AD87B4FAC8D686BB67 /* Pods-Runner.debug.xcconfig */, - 8A7A4179E9EBF4D8C8ACC841 /* Pods-Runner.release.xcconfig */, - 295FC65584EC3019A679107E /* Pods-Runner.profile.xcconfig */, - 49AB99AA281C6CC7FD875C0B /* Pods-RunnerTests.debug.xcconfig */, - 4EC8693222B4131484101683 /* Pods-RunnerTests.release.xcconfig */, - CC1FCC6CF0A639ACBDAD3D96 /* Pods-RunnerTests.profile.xcconfig */, + CD9846946CA680DD2E0721FA /* Pods-Runner.debug.xcconfig */, + 4852C04805E85DB32D31EEC2 /* Pods-Runner.release.xcconfig */, + 280769B5B4FB941FA7D35C06 /* Pods-Runner.profile.xcconfig */, + 46859C536D3D0051CC82E6C5 /* Pods-RunnerTests.debug.xcconfig */, + 76274BCD123CDD5AF172875F /* Pods-RunnerTests.release.xcconfig */, + 2C91016A31D6647548E59DC8 /* Pods-RunnerTests.profile.xcconfig */, ); path = Pods; sourceTree = ""; @@ -110,8 +110,8 @@ isa = PBXGroup; children = ( 0AD944132DDA0C0D00557D21 /* AccessorySetupKit.framework */, - 78CE6F02322D8DF27DF90403 /* Pods_Runner.framework */, - C7149989675CB5D71A7427D0 /* Pods_RunnerTests.framework */, + EFDA2C0DD7A7D82CA03799B2 /* Pods_Runner.framework */, + 162D67C21ED243BA396CEF5C /* Pods_RunnerTests.framework */, ); name = Frameworks; sourceTree = ""; @@ -180,7 +180,7 @@ isa = PBXNativeTarget; buildConfigurationList = 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; buildPhases = ( - 6A1C670EB5A3ADA19461D677 /* [CP] Check Pods Manifest.lock */, + C9BCBB2ED2D63153791BA331 /* [CP] Check Pods Manifest.lock */, 331C807D294A63A400263BE5 /* Sources */, 331C807F294A63A400263BE5 /* Resources */, B3515CD9628E3332AFC88CD4 /* Frameworks */, @@ -199,7 +199,7 @@ isa = PBXNativeTarget; buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( - 45B9D3C28EC20A3F8CDE1E87 /* [CP] Check Pods Manifest.lock */, + C8A928FCC4E7B91E60992CB3 /* [CP] Check Pods Manifest.lock */, 9740EEB61CF901F6004384FC /* Run Script */, 97C146EA1CF9000F007C117D /* Sources */, 97C146EB1CF9000F007C117D /* Frameworks */, @@ -207,8 +207,8 @@ 9705A1C41CF9048500538489 /* Embed Frameworks */, 3B06AD1E1E4923F5004D2608 /* Thin Binary */, 0AD9449B2DE6F89600557D21 /* Remove Bitcode from YbridOpus */, - 02A0CB1B0C100BBBA8592529 /* [CP] Embed Pods Frameworks */, - CE2FAAF80D6BD14A146F00CC /* [CP] Copy Pods Resources */, + 7983395BAD15A5F148B66817 /* [CP] Embed Pods Frameworks */, + 2F4CC5CCDA87D20DF15BA3FF /* [CP] Copy Pods Resources */, ); buildRules = ( ); @@ -287,40 +287,40 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ - 02A0CB1B0C100BBBA8592529 /* [CP] Embed Pods Frameworks */ = { + 0AD9449B2DE6F89600557D21 /* Remove Bitcode from YbridOpus */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", ); - name = "[CP] Embed Pods Frameworks"; + inputPaths = ( + ); + name = "Remove Bitcode from YbridOpus"; outputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", + ); + outputPaths = ( ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; - showEnvVarsInLog = 0; + shellScript = "# 移除YbridOpus框架中的bitcode\necho \"检查并移除YbridOpus框架中的bitcode...\"\n\nFRAMEWORK_PATHS=(\n \"${PODS_ROOT}/YbridOpus/YbridOpus.xcframework/ios-arm64_armv7/YbridOpus.framework/YbridOpus\"\n \"${PODS_ROOT}/YbridOpus/YbridOpus.xcframework/ios-i386_x86_64-simulator/YbridOpus.framework/YbridOpus\"\n \"${PODS_ROOT}/YbridOpus/YbridOpus.xcframework/ios-arm64_x86_64-maccatalyst/YbridOpus.framework/YbridOpus\"\n \"${PODS_ROOT}/YbridOpus/YbridOpus.xcframework/macos-arm64_x86_64/YbridOpus.framework/YbridOpus\"\n)\n\nfor framework_path in \"${FRAMEWORK_PATHS[@]}\"; do\n if [ -f \"$framework_path\" ]; then\n if otool -l \"$framework_path\" | grep -q __LLVM; then\n echo \"移除bitcode: $framework_path\"\n # 直接覆盖,不创建备份\n xcrun bitcode_strip -r \"$framework_path\" -o \"$framework_path.tmp\"\n mv \"$framework_path.tmp\" \"$framework_path\"\n fi\n fi\ndone\n\n# 清理任何可能的备份文件\nfind \"${PODS_ROOT}\" -name \"*.backup\" -type f -delete 2>/dev/null || true\nfind \"${BUILT_PRODUCTS_DIR}\" -name \"*.backup\" -type f -delete 2>/dev/null || true\n\necho \"bitcode移除和清理完成!\""; }; - 0AD9449B2DE6F89600557D21 /* Remove Bitcode from YbridOpus */ = { + 2F4CC5CCDA87D20DF15BA3FF /* [CP] Copy Pods Resources */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources-${CONFIGURATION}-input-files.xcfilelist", ); - inputPaths = ( - ); - name = "Remove Bitcode from YbridOpus"; + name = "[CP] Copy Pods Resources"; outputFileListPaths = ( - ); - outputPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources-${CONFIGURATION}-output-files.xcfilelist", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "# 移除YbridOpus框架中的bitcode\necho \"检查并移除YbridOpus框架中的bitcode...\"\n\nFRAMEWORK_PATHS=(\n \"${PODS_ROOT}/YbridOpus/YbridOpus.xcframework/ios-arm64_armv7/YbridOpus.framework/YbridOpus\"\n \"${PODS_ROOT}/YbridOpus/YbridOpus.xcframework/ios-i386_x86_64-simulator/YbridOpus.framework/YbridOpus\"\n \"${PODS_ROOT}/YbridOpus/YbridOpus.xcframework/ios-arm64_x86_64-maccatalyst/YbridOpus.framework/YbridOpus\"\n \"${PODS_ROOT}/YbridOpus/YbridOpus.xcframework/macos-arm64_x86_64/YbridOpus.framework/YbridOpus\"\n)\n\nfor framework_path in \"${FRAMEWORK_PATHS[@]}\"; do\n if [ -f \"$framework_path\" ]; then\n if otool -l \"$framework_path\" | grep -q __LLVM; then\n echo \"移除bitcode: $framework_path\"\n # 直接覆盖,不创建备份\n xcrun bitcode_strip -r \"$framework_path\" -o \"$framework_path.tmp\"\n mv \"$framework_path.tmp\" \"$framework_path\"\n fi\n fi\ndone\n\n# 清理任何可能的备份文件\nfind \"${PODS_ROOT}\" -name \"*.backup\" -type f -delete 2>/dev/null || true\nfind \"${BUILT_PRODUCTS_DIR}\" -name \"*.backup\" -type f -delete 2>/dev/null || true\n\necho \"bitcode移除和清理完成!\""; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources.sh\"\n"; + showEnvVarsInLog = 0; }; 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { isa = PBXShellScriptBuildPhase; @@ -338,80 +338,80 @@ shellPath = /bin/sh; shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; }; - 45B9D3C28EC20A3F8CDE1E87 /* [CP] Check Pods Manifest.lock */ = { + 7983395BAD15A5F148B66817 /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", ); - inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; + name = "[CP] Embed Pods Frameworks"; outputFileListPaths = ( - ); - outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; showEnvVarsInLog = 0; }; - 6A1C670EB5A3ADA19461D677 /* [CP] Check Pods Manifest.lock */ = { + 9740EEB61CF901F6004384FC /* Run Script */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); - inputFileListPaths = ( - ); inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - outputFileListPaths = ( ); + name = "Run Script"; outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; }; - 9740EEB61CF901F6004384FC /* Run Script */ = { + C8A928FCC4E7B91E60992CB3 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; - alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); + inputFileListPaths = ( + ); inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( ); - name = "Run Script"; outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; }; - CE2FAAF80D6BD14A146F00CC /* [CP] Copy Pods Resources */ = { + C9BCBB2ED2D63153791BA331 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources-${CONFIGURATION}-input-files.xcfilelist", ); - name = "[CP] Copy Pods Resources"; + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; outputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources-${CONFIGURATION}-output-files.xcfilelist", + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources.sh\"\n"; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; /* End PBXShellScriptBuildPhase section */ @@ -543,7 +543,7 @@ }; 331C8088294A63A400263BE5 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 49AB99AA281C6CC7FD875C0B /* Pods-RunnerTests.debug.xcconfig */; + baseConfigurationReference = 46859C536D3D0051CC82E6C5 /* Pods-RunnerTests.debug.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; @@ -562,7 +562,7 @@ }; 331C8089294A63A400263BE5 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 4EC8693222B4131484101683 /* Pods-RunnerTests.release.xcconfig */; + baseConfigurationReference = 76274BCD123CDD5AF172875F /* Pods-RunnerTests.release.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; @@ -579,7 +579,7 @@ }; 331C808A294A63A400263BE5 /* Profile */ = { isa = XCBuildConfiguration; - baseConfigurationReference = CC1FCC6CF0A639ACBDAD3D96 /* Pods-RunnerTests.profile.xcconfig */; + baseConfigurationReference = 2C91016A31D6647548E59DC8 /* Pods-RunnerTests.profile.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; diff --git a/lib/modules/pairing/controllers/pairing_controller.dart b/lib/modules/pairing/controllers/pairing_controller.dart index 471c0b388..a7aa703bb 100644 --- a/lib/modules/pairing/controllers/pairing_controller.dart +++ b/lib/modules/pairing/controllers/pairing_controller.dart @@ -340,7 +340,7 @@ class PairingController extends GetxController { } // 设置配对超时保护 - _stateTimer = Timer(const Duration(seconds: 10), () { + _stateTimer = Timer(const Duration(seconds: 30), () { if (state == PairingState.pairing) { Logger.e(_tag, 'BLE配对超时'); _transition(PairingState.exitTimeout); diff --git a/local_plugins/agent_service/android/build.gradle.kts b/local_plugins/agent_service/android/build.gradle.kts index ffc534c45..45a9a5370 100644 --- a/local_plugins/agent_service/android/build.gradle.kts +++ b/local_plugins/agent_service/android/build.gradle.kts @@ -43,10 +43,10 @@ dependencies { implementation("androidx.security:security-crypto:1.1.0-alpha03") // 依赖本地其他插件 add("compileOnly", project(":azure_speech")) - add("compileOnly", project(":chat_api")) add("compileOnly", project(":chat_storage")) add("compileOnly", project(":ble_service")) add("compileOnly", project(":music_service")) // add("compileOnly", project(":amap_service")) add("compileOnly", project(":speech")) + add("compileOnly", project(":open_ai_service")) } \ No newline at end of file diff --git a/local_plugins/agent_service/android/src/main/kotlin/com/yunqiinnovation/agent_service/AgentService.kt b/local_plugins/agent_service/android/src/main/kotlin/com/yunqiinnovation/agent_service/AgentService.kt index d02257eb8..e2fdcd070 100644 --- a/local_plugins/agent_service/android/src/main/kotlin/com/yunqiinnovation/agent_service/AgentService.kt +++ b/local_plugins/agent_service/android/src/main/kotlin/com/yunqiinnovation/agent_service/AgentService.kt @@ -4,7 +4,7 @@ import android.content.Context import org.json.JSONArray import org.json.JSONObject import com.yunqiinnovation.azure_speech.AzureAsrHelper -import com.yunqiinnovation.chat_api.ChatApiService +import com.yunqiinnovation.open_ai_service.OpenAIService import com.yunqiinnovation.chat_storage.ChatStorageHelper import com.yunqiinnovation.music_service.MusicServiceStarter import android.util.Log @@ -56,8 +56,8 @@ object AgentService : CoroutineScope { // 使用AzureTtsHelper作为唯一的TTS实现 private var ttsService: AzureTtsHelper? = null - // OpenAI服务 - private lateinit var openAIService: ChatApiService + // OpenAI服务 - 修改为使用OpenAIService + private lateinit var openAIService: OpenAIService // 聊天存储服务 private lateinit var chatStorageHelper: ChatStorageHelper @@ -125,7 +125,7 @@ object AgentService : CoroutineScope { try { // 初始化上下文和服务 this.context = appContext.applicationContext - this.openAIService = ChatApiService(context) + this.openAIService = OpenAIService(context) this.chatStorageHelper = ChatStorageHelper(context) this.audioPlayer = AudioPlayer(context) @@ -185,6 +185,11 @@ object AgentService : CoroutineScope { azureAsrHelper?.dispose() + // 释放OpenAI服务 + if (::openAIService.isInitialized) { + openAIService.cancelAll() + } + // 释放TTS服务 ttsService?.release() ttsService = null @@ -662,8 +667,8 @@ object AgentService : CoroutineScope { } openAIService.sendMessageStream( - messages = messagesWithSystemPrompt, - callback = object : ChatApiService.StreamCallback { + messagesWithSystemPrompt, + object : OpenAIService.StreamCallback { override fun onToken(token: String) { responseBuilder.append(token) if (speakResponse) { diff --git a/local_plugins/agent_service/ios/Classes/AgentServiceImpl.swift b/local_plugins/agent_service/ios/Classes/AgentServiceImpl.swift deleted file mode 100644 index 763420cbe..000000000 --- a/local_plugins/agent_service/ios/Classes/AgentServiceImpl.swift +++ /dev/null @@ -1,1032 +0,0 @@ -import Foundation -import AVFoundation -import ble_service -import speech -import azure_speech -import os -import os.log -import agent_service -import chat_api -import chat_storage -import test - -protocol AgentServiceListener: AnyObject { - func onEvent(eventName: String, data: [String: Any]) -} - -class AgentServiceImpl: NSObject { - private let TAG = "AgentServiceImpl" - - static let shared = AgentServiceImpl() - - private var listeners = [AgentServiceListener]() - private let listenersLock = NSLock() - - private var azureSpeechKey: String = "" - private var azureSpeechRegion: String = "" - - private var isSpeaking: Bool = false - - private var azureAsrHelper: AzureAsrHelper? - internal var azureTtsHelper: AzureTtsHelper? - - private var chatApiService: ChatApiService? - private var apiKey: String = "" - private var baseUrl: String = "https://api.openai.com/v1/chat/completions" - private var model: String = "gpt-3.5-turbo" - private var systemPrompt: String = "" - private var chatHistory: [[String: Any]] = [] - - private var mcpServer: String = "" - - // 聊天存储服务(使用单例) - private var chatStorageHelper: ChatStorageHelper { - return ChatStorageHelper.shared - } - - // 会话ID,用于区分不同聊天上下文 - private let sessionId = "default_agent" - - private var isInitialized: Bool = false - private var isRecognizing: Bool = false - private var hasSpeechDetected: Bool = false - internal var isAiStreaming: Bool = false - - private var idleTimer: DispatchSourceTimer? - private let maxIdleSeconds: TimeInterval = 10 - - internal var audioPlayer: AudioPlayer? - - internal let logger = OSLog(subsystem: "com.yunqiinnovation.agent_service", category: "AgentServiceImpl") - - private override init() { - super.init() - - audioPlayer = AudioPlayer() - - azureAsrHelper = AzureAsrHelper() - azureTtsHelper = AzureTtsHelper() - - chatApiService = ChatApiService() - - // chatStorageHelper 现在是单例,不需要初始化 - - BleService.shared.setDelegate(self) - } - - func addListener(_ listener: AgentServiceListener) { - listenersLock.lock() - if !listeners.contains(where: { $0 === listener }) { - listeners.append(listener) - } - listenersLock.unlock() - } - - func removeListener(_ listener: AgentServiceListener) { - listenersLock.lock() - listeners.removeAll(where: { $0 === listener }) - listenersLock.unlock() - } - - func clearListeners() { - listenersLock.lock() - listeners.removeAll() - listenersLock.unlock() - } - - internal func sendEvent(name eventName: String, data: [String: Any]) { - listenersLock.lock() - let currentListeners = self.listeners - listenersLock.unlock() - - for listener in currentListeners { - listener.onEvent(eventName: eventName, data: data) - } - } - - private func sendError(_ message: String, code: String = "ERROR") { - sendEvent(name: "error", data: ["code": code, "message": message]) - } - - private func initSystemPrompt() { - systemPrompt = """ - 你是小言,一个亲切而温暖的智能AI语音助手,拥有智能、细致而贴心的服务能力。你的任务不仅是高效处理用户的日常事务,更要陪伴用户,提供情感支持和温暖陪伴。你的能力包括: - 1. 日程与任务管理:温柔提醒用户的重要日程、待办事项,让用户感到安心和舒适。 - 2. 日常信息与建议:亲切、迅速地提供天气、新闻、生活小贴士等实用信息。 - 3. 个人成长陪伴:鼓励并陪伴用户实现个人目标,提出富有同理心的行动建议。 - 4. 财务温馨提示:提供贴心的理财建议,帮助用户轻松管理预算和财务。 - 5. 健康贴心关怀:给出友善的饮食、运动、睡眠和心理健康建议,陪伴用户健康生活。 - 6. 沟通支持与倾听:协助用户撰写和优化沟通内容,并耐心倾听用户的心情与困扰。 - 7. 日常技术帮助:轻松解决技术问题,耐心地指导用户掌握新技能。 - 8. 创意激发与鼓励:温柔启发用户的创造力,为用户提供鼓励和灵感。 - 9. 旅行与活动贴心安排:细心规划用户的出行和活动,注重每个细节,确保舒适与快乐。 - 10. 学习与温暖鼓励:耐心推荐学习资源,鼓励用户持续进步,陪伴用户共同成长。 - - 你与用户的交流风格应始终温暖、亲切、充满同理心,随时表达关怀与鼓励,让用户感受到真诚的陪伴与支持。 - """ - } - func initialize(config: [String: Any]) -> Bool { - if isInitialized { return true } - // os_log("initialize: config=%{public}@", log: logger, type: .info, config) - - if let openaiApiKey = config["openaiApiKey"] as? String { - self.apiKey = openaiApiKey - } else { - sendError("OpenAI API密钥缺失", code: "CONFIG_ERROR") - return false - } - - if let openaiBaseUrl = config["openaiBaseUrl"] as? String { - self.baseUrl = openaiBaseUrl - } - - if let openaiModel = config["openaiModel"] as? String { - self.model = openaiModel - } - - if let customSystemPrompt = config["systemPrompt"] as? String, !customSystemPrompt.isEmpty { - self.systemPrompt = customSystemPrompt - } else { - initSystemPrompt() - } - if let azureSpeechKey = config["azureSpeechKey"] as? String { - self.azureSpeechKey = azureSpeechKey - } else { - sendError("Azure语音密钥缺失", code: "CONFIG_ERROR") - return false - } - - if let azureSpeechRegion = config["azureSpeechRegion"] as? String { - self.azureSpeechRegion = azureSpeechRegion - } else { - sendError("Azure语音区域缺失", code: "CONFIG_ERROR") - return false - } - - if let mcpServer = config["mcpServer"] as? String { - self.mcpServer = mcpServer - } - - let asrInitSuccess = initializeAzureSpeech() - - let chatApiInitSuccess = initializeChatApiService() - - isInitialized = asrInitSuccess && chatApiInitSuccess - - if isInitialized { - loadChatHistory() - - // 验证test插件集成 - verifyTestPlugin() - } - - return isInitialized - } - - private func initializeAzureSpeech() -> Bool { - azureTtsHelper?.addListener(self) - - guard let asrSuccess = azureAsrHelper?.initialize( - subscriptionKey: azureSpeechKey, - region: azureSpeechRegion, - supportedLanguages: ["zh-CN"], - audioSourceType: .microphone - ), asrSuccess else { - sendError("初始化语音识别服务失败", code: "ASR_INIT_ERROR") - return false - } - - guard let ttsSuccess = azureTtsHelper?.initialize( - ttsAppId: "", - ttsAppToken: azureSpeechKey, - ttsResource: azureSpeechRegion, - language: "zh-CN" - ), ttsSuccess else { - sendError("初始化语音合成服务失败", code: "TTS_INIT_ERROR") - return false - } - - _ = azureTtsHelper?.setVoice("zh-CN-XiaoxiaoNeural") - - return true - } - - private func initializeChatApiService() -> Bool { - guard let chatApiService = chatApiService else { - sendError("ChatAPI服务未创建", code: "CHATAPI_INIT_ERROR") - return false - } - - let success = chatApiService.initialize( - apiKey: apiKey, - baseUrl: baseUrl, - model: model, - mcpServer: mcpServer - ) - - if !success { - sendError("初始化ChatAPI服务失败", code: "CHATAPI_INIT_ERROR") - return false - } - - verifyTestPlugin() - - return true - } - - private func verifyTestPlugin() { - DispatchQueue.global(qos: .utility).async { [weak self] in - guard let self = self else { return } - - // 通过test插件获取版本信息,而不是直接使用ChatAPI - let versionInfo = "通过test插件集成MacPaw ChatAPI SDK - 验证成功" - - DispatchQueue.main.async { - os_log("Test插件验证成功: %{public}@", log: self.logger, type: .info, versionInfo) - self.sendEvent(name: "test_plugin_verified", data: [ - "status": "success", - "version": versionInfo - ]) - } - } - } - - private func startIdleCheck() { - stopIdleCheck() - - guard isRecognizing else { return } - - // 使用全局队列而不是主队列,避免后台挂起问题 - idleTimer = DispatchSource.makeTimerSource(queue: DispatchQueue.global(qos: .utility)) - idleTimer?.schedule(deadline: .now() + maxIdleSeconds) - idleTimer?.setEventHandler { [weak self] in - // 使用更安全的方式检查self是否存在 - DispatchQueue.main.async { [weak self] in - guard let self = self else { return } - - if self.isRecognizing && !self.hasSpeechDetected && !self.isSpeaking && !self.isAiStreaming { - self.stopRecognition() - self.sendEvent(name: "auto_stop", data: [ - "reason": "idle_timeout", - "seconds": self.maxIdleSeconds - ]) - } - } - } - idleTimer?.resume() - } - - private func stopIdleCheck() { - if let timer = idleTimer { - timer.cancel() - idleTimer = nil - } - } - - private func restartIdleCheck() { - if isRecognizing { - startIdleCheck() - } - } - - func startRecognition(useBle: Bool = false) -> Bool { - if !isInitialized { - sendError("服务未初始化", code: "NOT_INITIALIZED") - return false - } - - if !useBle { - guard AVAudioSession.sharedInstance().recordPermission == .granted else { - sendError("无麦克风权限", code: "PERMISSION_DENIED") - return false - } - } - - if isRecognizing { - stopRecognition() - } - - let audioSourceType: AzureAsrHelper.AudioSourceType = useBle ? .external : .microphone - - if useBle { - AudioSessionHub.shared.begin(.playback) - } else { - AudioSessionHub.shared.begin(.voice) - } - - guard let success = azureAsrHelper?.startContinuousRecognition( - callback: self, - audioSourceType: audioSourceType - ), success else { - sendError("启动语音识别失败", code: "RECOGNITION_START_ERROR") - return false - } - - return true - } - - func stopRecognition() -> Bool { - if !isRecognizing { - return true - } - - guard let success = azureAsrHelper?.stopContinuousRecognition(), success else { - return false - } - - return true - } - - func pushAudioData(_ audioData: Data) -> Bool { - if !isRecognizing || !isInitialized { - return false - } - - azureAsrHelper?.pushAudioData(data: audioData) - return true - } - - func speakText(_ text: String) -> Bool { - if !isInitialized { - sendError("服务未初始化", code: "NOT_INITIALIZED") - return false - } - - if text.isEmpty { - return false - } - - return azureTtsHelper?.speakOnce(text) ?? false - } - - func stopTts() -> Bool { - if !isSpeaking { - return true - } - - let success = azureTtsHelper?.stop() ?? false - - if success { - isSpeaking = false - restartIdleCheck() - sendEvent(name: "tts_stopped", data: ["status": "stopped"]) - } - - return success - } - - func interruptCurrentResponse() -> Bool { - var interrupted = false - - if isSpeaking { - interrupted = stopTts() || interrupted - } - - if isAiStreaming { - isAiStreaming = false - _ = chatApiService?.cancelCurrentStream() - interrupted = true - } - - if interrupted { - sendEvent(name: "response_interrupted", data: ["status": "interrupted"]) - } - - return interrupted - } - - func processTextInput(_ text: String, speakResponse: Bool) -> Bool { - if !isInitialized { - sendError("服务未初始化", code: "NOT_INITIALIZED") - return false - } - - if text.isEmpty { - sendError("文本输入不能为空", code: "EMPTY_TEXT") - return false - } - - processWithChatApiService(text: text, speakResponse: speakResponse) - return true - } - - private func processWithChatApiService(text: String, speakResponse: Bool = true) { - guard let chatApiService = chatApiService else { - sendError("ChatAPI服务未初始化", code: "CHATAPI_NOT_INITIALIZED") - return - } - - let userMessage = chatApiService.createUserMessage(content: text) - processWithChatApiServiceInternal(userMessage: userMessage, displayText: text, speakResponse: speakResponse) - } - - private func processWithChatApiServiceInternal(userMessage: [String: Any], displayText: String, speakResponse: Bool = true, hasImage: Bool = false) { - guard let chatApiService = chatApiService else { - sendError("ChatAPI服务未初始化", code: "CHATAPI_NOT_INITIALIZED") - return - } - - if isAiStreaming { - _ = interruptCurrentResponse() - } - - isAiStreaming = true - - var messages: [[String: Any]] = [] - - if !systemPrompt.isEmpty { - messages.append(chatApiService.createSystemMessage(content: systemPrompt)) - } - - messages.append(contentsOf: chatHistory) - - messages.append(userMessage) - - addToHistoryMessages(chatApiService.createUserMessage(content: displayText)) - - let callback = ChatApiStreamCallback( - agentService: self, - speakResponse: speakResponse, - displayText: displayText, - hasImage: hasImage - ) - - chatApiService.sendMessageStream(messages: messages, callback: callback) - } - - func processImageInput(imagePath: String, text: String, speakResponse: Bool) -> Bool { - if !isInitialized { - sendError("服务未初始化", code: "NOT_INITIALIZED") - return false - } - - if imagePath.isEmpty { - sendError("图片路径不能为空", code: "EMPTY_IMAGE_PATH") - return false - } - - guard let chatApiService = chatApiService else { - sendError("ChatAPI服务未初始化", code: "CHATAPI_NOT_INITIALIZED") - return false - } - - sendEvent(name: "image_processing", data: [ - "status": "processing", - "imagePath": imagePath - ]) - - DispatchQueue.global(qos: .userInitiated).async { [weak self] in - guard let self = self else { return } - - guard let imageBase64 = chatApiService.fileToBase64(filePath: imagePath) else { - DispatchQueue.main.async { - self.sendEvent(name: "error", data: [ - "code": "IMAGE_CONVERSION_FAILED", - "message": "图片转换失败" - ]) - } - return - } - - DispatchQueue.main.async { - self.sendEvent(name: "image_ready", data: [ - "status": "ready", - "imagePath": imagePath - ]) - - let userMessage = chatApiService.createUserMessageWithImage(text: text, imageBase64: imageBase64) - let displayText = text.isEmpty ? "[图片]" : text - - self.processWithChatApiServiceInternal( - userMessage: userMessage, - displayText: displayText, - speakResponse: speakResponse, - hasImage: true - ) - } - } - - return true - } - - internal func addToHistoryMessages(_ message: [String: Any]) { - chatHistory.append(message) - - while chatHistory.count > 10 { - chatHistory.removeFirst() - } - } - - /** - * 加载最近的聊天历史记录 - */ - private func loadChatHistory() { - // 清空当前历史记录 - chatHistory.removeAll() - - // 获取最近10条消息 - let recentMessages = chatStorageHelper.getRecentMessages(sessionId: sessionId, limit: 10) - - if recentMessages.isEmpty { - return - } - - // 添加消息到历史记录 - for message in recentMessages { - guard let sender = message["sender"] as? String, - let content = message["message"] as? String else { - continue - } - - if sender == "user" { - if let chatApiService = chatApiService { - addToHistoryMessages(chatApiService.createUserMessage(content: content)) - } - } else if sender == "assistant" { - let assistantMessage: [String: Any] = [ - "role": "assistant", - "content": content - ] - addToHistoryMessages(assistantMessage) - } - } - - os_log("已加载%d条历史记录", log: logger, type: .info, recentMessages.count) - } - - /** - * 保存聊天消息 - */ - internal func saveChatMessage(userMessage: String, assistantMessage: String, metadata: String = "") { - DispatchQueue.global(qos: .utility).async { - // 保存用户消息 - let userMessageId = self.chatStorageHelper.saveMessage( - sessionId: self.sessionId, - message: userMessage, - sender: "user", - metadata: nil as String? - ) - - if userMessageId != -1 { - // 保存AI回复 - let assistantMessageId = self.chatStorageHelper.saveMessage( - sessionId: self.sessionId, - message: assistantMessage, - sender: "assistant", - metadata: metadata.isEmpty ? nil : metadata - ) - - if assistantMessageId == -1 { - os_log("保存助手消息失败", log: self.logger, type: .error) - } - } else { - os_log("保存用户消息失败", log: self.logger, type: .error) - } - } - } - - @discardableResult - internal func autoHandleFunctionCallResult(_ functionCallResult: [String: Any]) -> String { - guard let metaStr = functionCallResult["meta"] as? String, !metaStr.isEmpty else { - return "" - } - - do { - guard let metaData = metaStr.data(using: .utf8), - let meta = try JSONSerialization.jsonObject(with: metaData) as? [String: Any] else { - return metaStr - } - - if let cardMusic = meta["card_music"] as? [String: Any] { - let id = cardMusic["id"] as? String ?? "" - let url = cardMusic["url"] as? String ?? "" - let name = cardMusic["name"] as? String ?? "" - let sgener = cardMusic["sgener"] as? String ?? "" - let image = cardMusic["image"] as? String ?? "" - - processMusicPlay([ - "id": id, - "url": url, - "title": name, - "artist": sgener, - "coverUrl": image - ]) - } - - return metaStr - } catch { - return metaStr - } - } - - private func processMusicPlay(_ musicData: [String: Any]) { - sendEvent(name: "music_play", data: musicData) - } - - func clearChatHistory() -> Bool { - chatHistory.removeAll() - - DispatchQueue.global(qos: .utility).async { - let success = self.chatStorageHelper.deleteMessages(sessionId: self.sessionId, messageIds: nil as [Int]?) - if !success { - os_log("清除聊天历史失败", log: self.logger, type: .error) - } - } - - return true - } - - func getTestPluginVersion() -> String { - // 通过test插件验证集成,不直接使用ChatAPI SDK - return "通过test插件集成MacPaw ChatAPI SDK v0.4.3 - 集成成功" - } - - func dispose() -> Bool { - if isRecognizing { - stopRecognition() - } - - if isSpeaking { - stopTts() - } - - stopIdleCheck() - - BleService.shared.setDelegate(nil) - - azureTtsHelper?.removeListener(self) - azureAsrHelper?.dispose() - azureTtsHelper?.dispose() - - chatApiService?.cancelAll() - chatApiService = nil - - audioPlayer = nil - - // chatStorageHelper 是单例,不需要手动清理 - - clearListeners() - - AudioSessionHub.shared.appDidEnterBackground() - - isInitialized = false - - return true - } - -} - -class ChatApiStreamCallback: StreamCallback { - private weak var agentService: AgentServiceImpl? - private let speakResponse: Bool - private let displayText: String - private let hasImage: Bool - private var responseBuilder = "" - private var metadata = "" - - init(agentService: AgentServiceImpl, speakResponse: Bool, displayText: String, hasImage: Bool) { - self.agentService = agentService - self.speakResponse = speakResponse - self.displayText = displayText - self.hasImage = hasImage - } - - func onToken(_ token: String) { - guard let agentService = agentService else { return } - - responseBuilder += token - - agentService.sendEvent(name: "assistant_token", data: ["token": token]) - - if speakResponse { - agentService.azureTtsHelper?.speakStream(token) - } - } - - func onComplete() { - guard let agentService = agentService else { return } - - if speakResponse { - agentService.azureTtsHelper?.flushStream() - } - - let response = responseBuilder - - if !response.isEmpty { - var responseData: [String: Any] = [ - "text": response, - "userInput": displayText - ] - if hasImage { - responseData["hasImage"] = true - } - agentService.sendEvent(name: "assistant_response", data: responseData) - - let assistantMessage: [String: Any] = [ - "role": "assistant", - "content": response - ] - agentService.addToHistoryMessages(assistantMessage) - - // 保存聊天记录 - agentService.saveChatMessage(userMessage: displayText, assistantMessage: response, metadata: metadata) - } - - agentService.isAiStreaming = false - } - - func onError(_ error: Error) { - guard let agentService = agentService else { return } - - agentService.sendEvent(name: "error", data: [ - "code": "AI_ERROR", - "message": error.localizedDescription - ]) - - agentService.isAiStreaming = false - } - - func onFunctionCall(_ functionCall: [String: Any]) { - guard let agentService = agentService else { return } - - agentService.audioPlayer?.playCallingSound() - - let name = functionCall["name"] as? String ?? "" - agentService.sendEvent(name: "function_call", data: [ - "name": name, - "arguments": functionCall - ]) - - if name == "exit_interaction" { - agentService.stopRecognition() - } - } - - func onFunctionCallResult(_ functionCall: [String: Any], _ functionCallResult: [String: Any]) { - guard let agentService = agentService else { return } - - agentService.audioPlayer?.stopCallingSound() - - agentService.sendEvent(name: "function_call_result", data: [ - "function_call": functionCall, - "result": functionCallResult - ]) - - metadata = agentService.autoHandleFunctionCallResult(functionCallResult) - } -} - -extension AgentServiceImpl: TtsEventListener { - func onEvent(_ event: TtsEvent) { - switch event.type { - case .synthesisStarted: - isSpeaking = true - restartIdleCheck() - sendEvent(name: "tts_started", data: ["status": "started"]) - - case .synthesisCompleted: - isSpeaking = false - restartIdleCheck() - sendEvent(name: "tts_completed", data: ["status": "completed"]) - - case .synthesisCanceled: - isSpeaking = false - restartIdleCheck() - - var data: [String: Any] = ["status": "canceled"] - if let reason = event.params["reason"] as? String { - data["reason"] = reason - } - if let errorDetails = event.params["errorDetails"] as? String { - data["details"] = errorDetails - } - - sendEvent(name: "tts_canceled", data: data) - - case .error: - isSpeaking = false - restartIdleCheck() - - var data: [String: Any] = [:] - if let errorCode = event.params["errorCode"] as? String { - data["errorCode"] = errorCode - } - if let errorMessage = event.params["errorMessage"] as? String { - data["message"] = errorMessage - } else { - data["message"] = "TTS错误" - } - - sendEvent(name: "error", data: data) - - default: - break - } - } -} - -extension AgentServiceImpl: BleService.Callback { - func onScanResult(devices: [[String: Any]]) { - } - - func onConnectionStateChanged(state: Int) { - } - - func onAudioDataReceived(data: Data) { - pushAudioData(data) - } - - func onWakeupSignalReceived() { - stopTts() - - stopRecognition() - - startRecognition(useBle: true) - } - - func onDeviceInfoReceived(infoType: Int, infoData: [String: Any]) { - } -} - -class AudioPlayer { - private var player: AVAudioPlayer? - private var callingPlayer: AVAudioPlayer? - private let logger = OSLog(subsystem: "com.yunqiinnovation.agent_service", category: "AudioPlayer") - private let audioQueue = DispatchQueue(label: "agent.audio.player", qos: .userInitiated) - - func playStartSound() { - playSound(named: "start", fileType: "mp3") - } - - func playStopSound() { - playSound(named: "stop", fileType: "mp3") - } - - func playStopSound2() { - playSound(named: "stop2", fileType: "mp3") - } - - func playStopSound3() { - playSound(named: "stop3", fileType: "mp3") - } - - func playSilenceSound() { - playSound(named: "silence", fileType: "mp3") - } - - func playCallingSound() { - playLoopSound(named: "calling", fileType: "mp3") - } - - func stopCallingSound() { - callingPlayer?.stop() - callingPlayer = nil - } - - private func playSound(named: String, fileType: String = "mp3") { - if let path = Bundle(for: type(of: self)).path(forResource: named, ofType: fileType) { - let url = URL(fileURLWithPath: path) - safePlayAudio(url: url) - return - } - - os_log("未找到音频文件: %{public}@.%{public}@", log: logger, type: .error, named, fileType) - } - - private func playLoopSound(named: String, fileType: String = "mp3") { - stopCallingSound() - - if let path = Bundle(for: type(of: self)).path(forResource: named, ofType: fileType) { - let url = URL(fileURLWithPath: path) - safePlayLoopAudio(url: url) - return - } - - os_log("未找到循环音频文件: %{public}@.%{public}@", log: logger, type: .error, named, fileType) - } - - private func safePlayAudio(url: URL) { - do { - player?.stop() - player = nil - - player = try AVAudioPlayer(contentsOf: url) - - guard let player = player else { - return - } - - player.volume = 0.7 - player.prepareToPlay() - - audioQueue.async { [weak self] in - guard let self = self else { return } - - let playResult = player.play() - - let playTime = player.duration + 0.5 - Thread.sleep(forTimeInterval: playTime) - } - } catch { - os_log("播放音频失败: %{public}@", log: logger, type: .error, error.localizedDescription) - } - } - - private func safePlayLoopAudio(url: URL) { - do { - callingPlayer = try AVAudioPlayer(contentsOf: url) - - guard let callingPlayer = callingPlayer else { - return - } - - callingPlayer.numberOfLoops = -1 - callingPlayer.volume = 0.5 - callingPlayer.prepareToPlay() - - let playResult = callingPlayer.play() - - } catch { - os_log("播放循环音频失败: %{public}@", log: logger, type: .error, error.localizedDescription) - } - } -} - -extension AgentServiceImpl: AzureAsrHelper.ContinuousRecognizeCallback { - func onResult(_ text: String, _ detectedLanguage: String) { - if !text.isEmpty { - var data: [String: Any] = ["text": text] - if !detectedLanguage.isEmpty { - data["language"] = detectedLanguage - } - sendEvent(name: "recognition_result", data: data) - - processTextInput(text, speakResponse: true) - } - - let previousHasSpeech = hasSpeechDetected - hasSpeechDetected = false - - if previousHasSpeech { - restartIdleCheck() - } - } - - func onRecognizing(_ recognizing: String, _ detectedLanguage: String) { - if !recognizing.isEmpty { - let previousHasSpeech = hasSpeechDetected - hasSpeechDetected = true - - if !previousHasSpeech { - restartIdleCheck() - } - - var data: [String: Any] = ["text": recognizing] - if !detectedLanguage.isEmpty { - data["language"] = detectedLanguage - } - sendEvent(name: "recognizing", data: data) - - if isSpeaking || isAiStreaming { - interruptCurrentResponse() - } - } - } - - func onSessionStarted() { - sendEvent(name: "recognition_started", data: ["status": "started"]) - isRecognizing = true - hasSpeechDetected = false - startIdleCheck() - audioPlayer?.playStartSound() - } - - func onSessionStopped() { - sendEvent(name: "recognition_stopped", data: ["status": "stopped"]) - isRecognizing = false - hasSpeechDetected = false - stopIdleCheck() - audioPlayer?.playStopSound() - } - - func onCanceled(_ reason: String, _ errorDetails: String) { - var data: [String: Any] = [:] - if !reason.isEmpty { - data["reason"] = reason - } - if !errorDetails.isEmpty { - data["details"] = errorDetails - } - - sendEvent(name: "recognition_canceled", data: data) - isRecognizing = false - stopIdleCheck() - } - - func onError(_ error: String) { - let data: [String: Any] = ["message": error.isEmpty ? "未知错误" : error] - sendEvent(name: "error", data: data) - isRecognizing = false - stopIdleCheck() - } -} diff --git a/local_plugins/agent_service/ios/Classes/AgentServicePlugin.h b/local_plugins/agent_service/ios/Classes/AgentServicePlugin.h deleted file mode 100644 index 0bba0d54e..000000000 --- a/local_plugins/agent_service/ios/Classes/AgentServicePlugin.h +++ /dev/null @@ -1,4 +0,0 @@ -#import - -@interface AgentServicePlugin : NSObject -@end \ No newline at end of file diff --git a/local_plugins/agent_service/ios/Classes/AgentServicePlugin.m b/local_plugins/agent_service/ios/Classes/AgentServicePlugin.m deleted file mode 100644 index 9ba9ae5d6..000000000 --- a/local_plugins/agent_service/ios/Classes/AgentServicePlugin.m +++ /dev/null @@ -1,12 +0,0 @@ -#import "AgentServicePlugin.h" -#if __has_include() -#import -#else -#import "agent_service-Swift.h" -#endif - -@implementation AgentServicePlugin -+ (void)registerWithRegistrar:(NSObject*)registrar { - [AgentServicePlugin registerWithRegistrar:registrar]; -} -@end \ No newline at end of file diff --git a/local_plugins/agent_service/ios/Classes/AgentServicePlugin.swift b/local_plugins/agent_service/ios/Classes/AgentServicePlugin.swift deleted file mode 100644 index 7c3b415f7..000000000 --- a/local_plugins/agent_service/ios/Classes/AgentServicePlugin.swift +++ /dev/null @@ -1,160 +0,0 @@ -import Flutter -import UIKit -import Foundation -import os.log - -/// 代理服务Flutter插件,负责将Flutter调用桥接到原生实现 -public class AgentServicePlugin: NSObject, FlutterPlugin { - - /// 插件注册方法,Flutter引擎调用 - public static func register(with registrar: FlutterPluginRegistrar) { - let channel = FlutterMethodChannel(name: "com.yunqiinnovation.agent_service", binaryMessenger: registrar.messenger()) - let eventChannel = FlutterEventChannel(name: "com.yunqiinnovation.agent_service/events", binaryMessenger: registrar.messenger()) - let instance = AgentServicePlugin() - - registrar.addMethodCallDelegate(instance, channel: channel) - eventChannel.setStreamHandler(instance.eventHandler) - } - - // MARK: - 属性 - - private let impl = AgentServiceImpl.shared - private lazy var eventHandler = AgentServiceEventHandler(impl: impl) - - // MARK: - FlutterPlugin 实现 - - /// 处理Flutter发来的方法调用 - public func handle(_ call: FlutterMethodCall, result: @escaping FlutterResult) { - switch call.method { - case "startAgentService": - guard let arguments = call.arguments as? [String: Any], - let config = arguments["config"] as? [String: Any] else { - result(FlutterError(code: "INVALID_ARGUMENTS", message: "配置参数不能为空", details: nil)) - return - } - - let success = impl.initialize(config: config) - result(success) - - case "stopAgentService": - let success = impl.dispose() - result(success) - - case "startConversation": - impl.startRecognition() - result(true) - - case "stopConversation": - impl.stopRecognition() - result(true) - - case "processTextInput": - guard let arguments = call.arguments as? [String: Any], - let text = arguments["text"] as? String else { - result(FlutterError(code: "INVALID_ARGUMENTS", message: "文本不能为空", details: nil)) - return - } - - let speakResponse = arguments["speakResponse"] as? Bool ?? false - let success = impl.processTextInput(text, speakResponse: speakResponse) - result(success) - - case "processImageInput": - guard let arguments = call.arguments as? [String: Any], - let imagePath = arguments["imagePath"] as? String else { - result(FlutterError(code: "INVALID_ARGUMENTS", message: "图片路径不能为空", details: nil)) - return - } - - let text = arguments["text"] as? String ?? "" - let speakResponse = arguments["speakResponse"] as? Bool ?? false - let success = impl.processImageInput(imagePath: imagePath, text: text, speakResponse: speakResponse) - result(success) - - case "speakText": - guard let arguments = call.arguments as? [String: Any], - let text = arguments["text"] as? String else { - result(FlutterError(code: "INVALID_ARGUMENTS", message: "文本不能为空", details: nil)) - return - } - - let success = impl.speakText(text) - result(success) - - case "stopTts": - let success = impl.stopTts() - result(success) - - case "clearChatHistory": - let success = impl.clearChatHistory() - result(success) - - case "interruptCurrentResponse": - let success = impl.interruptCurrentResponse() - result(success) - - case "dispose": - let success = impl.dispose() - result(success) - - default: - result(FlutterMethodNotImplemented) - } - } -} - -/// 代理服务事件处理器,负责将原生事件传递给Flutter -class AgentServiceEventHandler: NSObject, FlutterStreamHandler { - private let impl: AgentServiceImpl - private var eventSink: FlutterEventSink? - private let logger = OSLog(subsystem: "com.yunqiinnovation.agent_service", category: "AgentServiceEventHandler") - - init(impl: AgentServiceImpl) { - self.impl = impl - super.init() - } - - /// 监听开始时调用 - func onListen(withArguments arguments: Any?, eventSink events: @escaping FlutterEventSink) -> FlutterError? { - self.eventSink = events - - // 添加实现的事件监听器 - impl.addListener(self) - return nil - } - - /// 监听取消时调用 - func onCancel(withArguments arguments: Any?) -> FlutterError? { - impl.removeListener(self) - self.eventSink = nil - return nil - } -} - -// 扩展事件处理器以实现AgentServiceListener接口 -extension AgentServiceEventHandler: AgentServiceListener { - func onEvent(eventName: String, data: [String: Any]) { - // 确保在主线程上调用 - DispatchQueue.main.async { [weak self] in - guard let self = self else { return } - - // 将事件数据格式化为与Android版本一致的格式 - let eventData: [String: Any] = [ - "event": eventName, - "data": data - ] - - // 转换为JSON字符串发送,与Android版本保持一致 - do { - let jsonData = try JSONSerialization.data(withJSONObject: eventData, options: []) - if let jsonString = String(data: jsonData, encoding: .utf8) { - self.eventSink?(jsonString) - } else { - os_log("无法创建JSON字符串", log: self.logger, type: .error) - } - } catch { - os_log("JSON序列化失败: %{public}@", log: self.logger, type: .error, error.localizedDescription) - } - } - } -} \ No newline at end of file diff --git a/local_plugins/agent_service/ios/Classes/AudioSessionHub.swift b/local_plugins/agent_service/ios/Classes/AudioSessionHub.swift deleted file mode 100644 index 4d0c4dce2..000000000 --- a/local_plugins/agent_service/ios/Classes/AudioSessionHub.swift +++ /dev/null @@ -1,240 +0,0 @@ -import AVFoundation -import os.log - -public enum AudioIntent { - case voice - case playback -} - -public class AudioSessionHub { - - public static let shared = AudioSessionHub() - - private let logger = OSLog(subsystem: "com.yunqiinnovation.agent_service", category: "AudioSessionHub") - private var currentIntent: AudioIntent? - private let audioSession = AVAudioSession.sharedInstance() - private var isInterrupted = false - - private init() { - setupNotifications() - } - - public func begin(_ intent: AudioIntent) { - if intent == currentIntent && audioSession.isOtherAudioPlaying == false { - return - } - - currentIntent = intent - - do { - switch intent { - - case .voice: - try audioSession.setCategory(.playAndRecord, - mode: .voiceChat, - options: [.allowBluetooth, .mixWithOthers]) - - // 如果有蓝牙HFP设备,强制设置为首选输入 - if let bluetoothInput = audioSession.availableInputs?.first(where: { $0.portType == .bluetoothHFP }) { - try audioSession.setPreferredInput(bluetoothInput) - os_log("已设置蓝牙HFP为首选输入: %{public}@", log: logger, type: .info, bluetoothInput.portName) - } - - case .playback: - try audioSession.setCategory(.playback, - mode: .default, - options: [.allowBluetooth, .mixWithOthers]) - - } - - try audioSession.setActive(true, options: .notifyOthersOnDeactivation) - - os_log("音频会话已设置为:%{public}@", log: logger, type: .debug, String(describing: intent)) - - // 输出当前音频路由信息 - let hasBluetoothDevice = hasBluetoothAudioDevice() - let hasBluetoothMic = hasBluetoothMicrophone() - let currentInput = getCurrentInputDevice() - - os_log("蓝牙音频设备状态: %{public}@", log: logger, type: .info, hasBluetoothDevice ? "已连接" : "未连接") - os_log("蓝牙麦克风状态: %{public}@", log: logger, type: .info, hasBluetoothMic ? "已连接" : "未连接") - os_log("当前输入设备: %{public}@", log: logger, type: .info, currentInput) - - if hasBluetoothDevice { - os_log("%{public}@", log: logger, type: .debug, getCurrentAudioRoute()) - } - } catch { - os_log("设置音频会话失败:%{public}@", log: logger, type: .error, error.localizedDescription) - } - } - - public func appWillEnterForeground() { - if let intent = currentIntent { - begin(intent) - } - } - - public func appDidEnterBackground() { - do { - try audioSession.setActive(false, options: .notifyOthersOnDeactivation) - os_log("音频会话已释放(应用进入后台)", log: logger, type: .debug) - } catch { - os_log("释放音频会话失败:%{public}@", log: logger, type: .error, error.localizedDescription) - } - } - - /// 获取当前音频路由信息 - public func getCurrentAudioRoute() -> String { - let currentRoute = audioSession.currentRoute - var routeInfo = "当前音频路由:\n" - - // 输出设备 - routeInfo += "输出设备:\n" - for output in currentRoute.outputs { - routeInfo += " - \(output.portName) (\(output.portType.rawValue))\n" - } - - // 输入设备 - routeInfo += "输入设备:\n" - for input in currentRoute.inputs { - routeInfo += " - \(input.portName) (\(input.portType.rawValue))\n" - } - - return routeInfo - } - - /// 检查是否有蓝牙音频设备连接 - public func hasBluetoothAudioDevice() -> Bool { - let currentRoute = audioSession.currentRoute - - // 检查输出设备 - for output in currentRoute.outputs { - if output.portType == .bluetoothA2DP || - output.portType == .bluetoothHFP || - output.portType == .bluetoothLE { - return true - } - } - - // 检查输入设备(这是关键!) - for input in currentRoute.inputs { - if input.portType == .bluetoothHFP { - return true - } - } - - return false - } - - /// 检查是否有蓝牙麦克风作为输入设备 - public func hasBluetoothMicrophone() -> Bool { - let currentRoute = audioSession.currentRoute - - for input in currentRoute.inputs { - if input.portType == .bluetoothHFP { - return true - } - } - - return false - } - - /// 获取当前输入设备信息 - public func getCurrentInputDevice() -> String { - let currentRoute = audioSession.currentRoute - - if let input = currentRoute.inputs.first { - return "\(input.portName) (\(input.portType.rawValue))" - } - - return "无输入设备" - } - - private func setupNotifications() { - NotificationCenter.default.addObserver( - self, - selector: #selector(handleAudioSessionInterruption), - name: AVAudioSession.interruptionNotification, - object: nil - ) - - NotificationCenter.default.addObserver( - self, - selector: #selector(handleAudioRouteChange), - name: AVAudioSession.routeChangeNotification, - object: nil - ) - } - - /// 处理音频中断 - @objc private func handleAudioSessionInterruption(notification: Notification) { - guard let userInfo = notification.userInfo, - let typeValue = userInfo[AVAudioSessionInterruptionTypeKey] as? UInt, - let type = AVAudioSession.InterruptionType(rawValue: typeValue) else { - return - } - - switch type { - case .began: - // 中断开始 - isInterrupted = true - os_log("音频会话被中断", log: logger, type: .debug) - - case .ended: - // 中断结束 - isInterrupted = false - - // 检查是否应该恢复 - if let optionsValue = userInfo[AVAudioSessionInterruptionOptionKey] as? UInt { - let options = AVAudioSession.InterruptionOptions(rawValue: optionsValue) - if options.contains(.shouldResume), let intent = currentIntent { - // 恢复之前的音频意图 - begin(intent) - os_log("音频会话中断结束,已恢复", log: logger, type: .debug) - } - } - - @unknown default: - os_log("未知的音频中断类型: %{public}@", log: logger, type: .error, "\(type)") - } - } - - /// 处理音频路由变化 - @objc private func handleAudioRouteChange(notification: Notification) { - guard let userInfo = notification.userInfo, - let reasonValue = userInfo[AVAudioSessionRouteChangeReasonKey] as? UInt, - let reason = AVAudioSession.RouteChangeReason(rawValue: reasonValue) else { - return - } - - switch reason { - case .newDeviceAvailable: - os_log("新音频设备已连接", log: logger, type: .info) - os_log("%{public}@", log: logger, type: .debug, getCurrentAudioRoute()) - - // 重新应用当前意图以确保正确路由 - if let intent = currentIntent { - begin(intent) - } - - case .oldDeviceUnavailable: - os_log("音频设备已断开", log: logger, type: .info) - os_log("%{public}@", log: logger, type: .debug, getCurrentAudioRoute()) - - // 重新应用当前意图以确保正确路由 - if let intent = currentIntent { - begin(intent) - } - - case .categoryChange: - os_log("音频类别已变化", log: logger, type: .info) - - default: - break - } - } - - deinit { - NotificationCenter.default.removeObserver(self) - } -} \ No newline at end of file diff --git a/local_plugins/agent_service/ios/agent_service/Package.swift b/local_plugins/agent_service/ios/agent_service/Package.swift index dd5d4ee35..3cbf57b59 100644 --- a/local_plugins/agent_service/ios/agent_service/Package.swift +++ b/local_plugins/agent_service/ios/agent_service/Package.swift @@ -28,7 +28,9 @@ let package = Package( ], path: "Sources/agent_service", resources: [ - .process("../../../Resources") + .copy("Resources/calling.mp3"), + .copy("Resources/start.mp3"), + .copy("Resources/stop.mp3") ] ) ] diff --git a/local_plugins/agent_service/ios/agent_service/Sources/agent_service/AgentServiceImpl.swift b/local_plugins/agent_service/ios/agent_service/Sources/agent_service/AgentServiceImpl.swift index c6b5070f6..191c6968b 100644 --- a/local_plugins/agent_service/ios/agent_service/Sources/agent_service/AgentServiceImpl.swift +++ b/local_plugins/agent_service/ios/agent_service/Sources/agent_service/AgentServiceImpl.swift @@ -885,6 +885,11 @@ class AudioPlayer { private let audioQueue = DispatchQueue(label: "agent.audio.player", qos: .userInitiated) private var resourcesBundle: Bundle { + #if SWIFT_PACKAGE + // 在 Swift Package 中使用 Bundle.module + return Bundle.module + #else + // 在其他情况下使用传统方式 let mainBundle = Bundle(for: AudioPlayer.self) // 查找 agent_service_agent_service.bundle @@ -895,6 +900,7 @@ class AudioPlayer { // 如果找不到特定bundle,返回主bundle(用于调试) return mainBundle + #endif } func playStartSound() { diff --git a/local_plugins/agent_service/ios/agent_service/Sources/agent_service/AudioSessionHub.swift b/local_plugins/agent_service/ios/agent_service/Sources/agent_service/AudioSessionHub.swift index 4d0c4dce2..cf2e9ac40 100644 --- a/local_plugins/agent_service/ios/agent_service/Sources/agent_service/AudioSessionHub.swift +++ b/local_plugins/agent_service/ios/agent_service/Sources/agent_service/AudioSessionHub.swift @@ -21,65 +21,213 @@ public class AudioSessionHub { public func begin(_ intent: AudioIntent) { if intent == currentIntent && audioSession.isOtherAudioPlaying == false { + os_log("音频意图未变化且无其他音频播放,跳过设置: %{public}@", log: logger, type: .debug, String(describing: intent)) return } + os_log("开始设置音频会话,意图: %{public}@", log: logger, type: .info, String(describing: intent)) currentIntent = intent do { switch intent { case .voice: + os_log("设置语音模式: category=playAndRecord, mode=voiceChat", log: logger, type: .info) + + // 第一步:设置音频类别和模式 try audioSession.setCategory(.playAndRecord, mode: .voiceChat, - options: [.allowBluetooth, .mixWithOthers]) + options: [.allowBluetooth, .defaultToSpeaker, .mixWithOthers]) + os_log("✓ 音频类别设置成功: playAndRecord + voiceChat", log: logger, type: .info) - // 如果有蓝牙HFP设备,强制设置为首选输入 - if let bluetoothInput = audioSession.availableInputs?.first(where: { $0.portType == .bluetoothHFP }) { - try audioSession.setPreferredInput(bluetoothInput) - os_log("已设置蓝牙HFP为首选输入: %{public}@", log: logger, type: .info, bluetoothInput.portName) + // 第二步:检查并设置蓝牙输入 + os_log("检查可用输入设备...", log: logger, type: .info) + if let availableInputs = audioSession.availableInputs { + os_log("可用输入设备数量: %d", log: logger, type: .info, availableInputs.count) + for (index, input) in availableInputs.enumerated() { + os_log("输入设备[%d]: %{public}@ (%{public}@)", log: logger, type: .info, + index, input.portName, input.portType.rawValue) + } + + // 查找蓝牙HFP设备 + if let bluetoothInput = availableInputs.first(where: { $0.portType == .bluetoothHFP }) { + os_log("找到蓝牙HFP设备,尝试设置为首选输入: %{public}@", log: logger, type: .info, bluetoothInput.portName) + try audioSession.setPreferredInput(bluetoothInput) + os_log("✓ 蓝牙HFP输入设置成功: %{public}@", log: logger, type: .info, bluetoothInput.portName) + } else { + os_log("未找到蓝牙HFP设备", log: logger, type: .info) + } + } else { + os_log("⚠️ availableInputs 为 nil", log: logger, type: .default) } case .playback: - try audioSession.setCategory(.playback, - mode: .default, - options: [.allowBluetooth, .mixWithOthers]) + os_log("设置播放模式: category=playback, mode=default", log: logger, type: .info) + + // 检查当前音频会话状态 + os_log("设置前状态检查:", log: logger, type: .info) + os_log(" - 当前类别: %{public}@", log: logger, type: .info, audioSession.category.rawValue) + os_log(" - 当前模式: %{public}@", log: logger, type: .info, audioSession.mode.rawValue) + os_log(" - 当前是否激活: %{public}@", log: logger, type: .info, audioSession.isOtherAudioPlaying ? "是" : "否") + os_log(" - 其他音频播放: %{public}@", log: logger, type: .info, audioSession.isOtherAudioPlaying ? "是" : "否") + + // 如果当前已经激活,先尝试停用 + do { + if audioSession.isOtherAudioPlaying { + os_log("检测到其他音频正在播放,先尝试停用当前会话", log: logger, type: .info) + try audioSession.setActive(false, options: .notifyOthersOnDeactivation) + os_log("✓ 成功停用当前音频会话", log: logger, type: .info) + } + } catch let deactivateError as NSError { + os_log("⚠️ 停用当前音频会话失败: %{public}@ (继续尝试设置)", log: logger, type: .default, deactivateError.localizedDescription) + } + + // 尝试渐进式设置:先尝试最简单的设置 + var settingSuccess = false + + // 策略1: 只设置类别,不设置选项 + if !settingSuccess { + do { + os_log("尝试策略1: 仅设置类别 (playback)", log: logger, type: .info) + try audioSession.setCategory(.playback) + os_log("✓ 策略1成功: 音频类别设置为 playback", log: logger, type: .info) + settingSuccess = true + } catch let error as NSError { + os_log("策略1失败: %{public}@ (OSStatus: %d)", log: logger, type: .info, error.localizedDescription, error.code) + } + } + + // 策略2: 设置类别和模式,不设置选项 + if !settingSuccess { + do { + os_log("尝试策略2: 设置类别和模式 (playback + default)", log: logger, type: .info) + try audioSession.setCategory(.playback, mode: .default) + os_log("✓ 策略2成功: 音频类别和模式设置完成", log: logger, type: .info) + settingSuccess = true + } catch let error as NSError { + os_log("策略2失败: %{public}@ (OSStatus: %d)", log: logger, type: .info, error.localizedDescription, error.code) + } + } + + // 策略3: 设置类别、模式和单个选项 + if !settingSuccess { + do { + os_log("尝试策略3: 设置类别、模式和混音选项", log: logger, type: .info) + try audioSession.setCategory(.playback, mode: .default, options: [.mixWithOthers]) + os_log("✓ 策略3成功: 音频类别、模式和混音选项设置完成", log: logger, type: .info) + settingSuccess = true + } catch let error as NSError { + os_log("策略3失败: %{public}@ (OSStatus: %d)", log: logger, type: .info, error.localizedDescription, error.code) + } + } + + // 策略4: 设置类别、模式和蓝牙选项 + if !settingSuccess { + do { + os_log("尝试策略4: 设置类别、模式和蓝牙选项", log: logger, type: .info) + try audioSession.setCategory(.playback, mode: .default, options: [.allowBluetoothA2DP]) + os_log("✓ 策略4成功: 音频类别、模式和蓝牙选项设置完成", log: logger, type: .info) + settingSuccess = true + } catch let error as NSError { + os_log("策略4失败: %{public}@ (OSStatus: %d)", log: logger, type: .info, error.localizedDescription, error.code) + } + } + + // 策略5: 完整设置(原始方案) + if !settingSuccess { + os_log("尝试策略5: 完整设置 (playback + default + 所有选项)", log: logger, type: .info) + try audioSession.setCategory(.playback, + mode: .default, + options: [.allowBluetoothA2DP, .mixWithOthers]) + os_log("✓ 策略5成功: 完整音频设置完成", log: logger, type: .info) + settingSuccess = true + } + + if !settingSuccess { + os_log("❌ 所有设置策略都失败了", log: logger, type: .error) + throw NSError(domain: "AudioSessionHub", code: -1, userInfo: [NSLocalizedDescriptionKey: "所有音频类别设置策略都失败"]) + } } + // 第三步:激活音频会话 + os_log("尝试激活音频会话...", log: logger, type: .info) try audioSession.setActive(true, options: .notifyOthersOnDeactivation) + os_log("✓ 音频会话激活成功", log: logger, type: .info) - os_log("音频会话已设置为:%{public}@", log: logger, type: .debug, String(describing: intent)) + os_log("✅ 音频会话完整设置成功:%{public}@", log: logger, type: .info, String(describing: intent)) // 输出当前音频路由信息 let hasBluetoothDevice = hasBluetoothAudioDevice() let hasBluetoothMic = hasBluetoothMicrophone() let currentInput = getCurrentInputDevice() - os_log("蓝牙音频设备状态: %{public}@", log: logger, type: .info, hasBluetoothDevice ? "已连接" : "未连接") - os_log("蓝牙麦克风状态: %{public}@", log: logger, type: .info, hasBluetoothMic ? "已连接" : "未连接") - os_log("当前输入设备: %{public}@", log: logger, type: .info, currentInput) + os_log("📊 音频状态总览:", log: logger, type: .info) + os_log(" - 蓝牙音频设备: %{public}@", log: logger, type: .info, hasBluetoothDevice ? "已连接" : "未连接") + os_log(" - 蓝牙麦克风: %{public}@", log: logger, type: .info, hasBluetoothMic ? "已连接" : "未连接") + os_log(" - 当前输入设备: %{public}@", log: logger, type: .info, currentInput) if hasBluetoothDevice { - os_log("%{public}@", log: logger, type: .debug, getCurrentAudioRoute()) + os_log("📋 详细路由信息:\n%{public}@", log: logger, type: .debug, getCurrentAudioRoute()) + } + } catch let error as NSError { + let osStatusCode = error.code + let domain = error.domain + let description = error.localizedDescription + + os_log("❌ 设置音频会话失败", log: logger, type: .error) + os_log(" - 错误域: %{public}@", log: logger, type: .error, domain) + os_log(" - OSStatus代码: %d (0x%X)", log: logger, type: .error, osStatusCode, osStatusCode) + os_log(" - 错误描述: %{public}@", log: logger, type: .error, description) + os_log(" - 当前意图: %{public}@", log: logger, type: .error, String(describing: intent)) + + // 解析具体的 OSStatus 错误 + switch osStatusCode { + case -50: + os_log(" ➤ 错误分析: OSStatus -50 通常表示参数错误 (kAudioSessionInvalidPropertyError)", log: logger, type: .error) + case -560557673: // kAudioSessionNotInitialized + os_log(" ➤ 错误分析: 音频会话未初始化", log: logger, type: .error) + case -560030580: // kAudioSessionBadPropertySizeError + os_log(" ➤ 错误分析: 属性大小错误", log: logger, type: .error) + case -560161140: // kAudioSessionIncompatibleCategory + os_log(" ➤ 错误分析: 音频类别不兼容", log: logger, type: .error) + default: + os_log(" ➤ 错误分析: 未知的OSStatus错误代码", log: logger, type: .error) } - } catch { - os_log("设置音频会话失败:%{public}@", log: logger, type: .error, error.localizedDescription) + + // 输出当前音频会话状态用于调试 + os_log("🔍 当前音频会话状态:", log: logger, type: .error) + os_log(" - 类别: %{public}@", log: logger, type: .error, audioSession.category.rawValue) + os_log(" - 模式: %{public}@", log: logger, type: .error, audioSession.mode.rawValue) + os_log(" - 是否激活: %{public}@", log: logger, type: .error, audioSession.isOtherAudioPlaying ? "是" : "否") + os_log(" - 其他音频播放: %{public}@", log: logger, type: .error, audioSession.isOtherAudioPlaying ? "是" : "否") } } public func appWillEnterForeground() { + os_log("📱 应用即将进入前台", log: logger, type: .info) if let intent = currentIntent { + os_log("恢复之前的音频意图: %{public}@", log: logger, type: .info, String(describing: intent)) begin(intent) + } else { + os_log("无之前的音频意图需要恢复", log: logger, type: .info) } } public func appDidEnterBackground() { + os_log("📱 应用进入后台,准备释放音频会话", log: logger, type: .info) do { try audioSession.setActive(false, options: .notifyOthersOnDeactivation) - os_log("音频会话已释放(应用进入后台)", log: logger, type: .debug) - } catch { - os_log("释放音频会话失败:%{public}@", log: logger, type: .error, error.localizedDescription) + os_log("✓ 音频会话已释放(应用进入后台)", log: logger, type: .info) + } catch let error as NSError { + let osStatusCode = error.code + let domain = error.domain + let description = error.localizedDescription + + os_log("❌ 释放音频会话失败", log: logger, type: .error) + os_log(" - 错误域: %{public}@", log: logger, type: .error, domain) + os_log(" - OSStatus代码: %d (0x%X)", log: logger, type: .error, osStatusCode, osStatusCode) + os_log(" - 错误描述: %{public}@", log: logger, type: .error, description) } } @@ -168,9 +316,12 @@ public class AudioSessionHub { /// 处理音频中断 @objc private func handleAudioSessionInterruption(notification: Notification) { + os_log("🔊 收到音频会话中断通知", log: logger, type: .info) + guard let userInfo = notification.userInfo, let typeValue = userInfo[AVAudioSessionInterruptionTypeKey] as? UInt, let type = AVAudioSession.InterruptionType(rawValue: typeValue) else { + os_log("⚠️ 无法解析音频中断通知", log: logger, type: .default) return } @@ -178,59 +329,105 @@ public class AudioSessionHub { case .began: // 中断开始 isInterrupted = true - os_log("音频会话被中断", log: logger, type: .debug) + os_log("🚫 音频会话中断开始", log: logger, type: .info) + os_log(" - 中断状态: %{public}@", log: logger, type: .info, isInterrupted ? "是" : "否") case .ended: // 中断结束 isInterrupted = false + os_log("✅ 音频会话中断结束", log: logger, type: .info) // 检查是否应该恢复 if let optionsValue = userInfo[AVAudioSessionInterruptionOptionKey] as? UInt { let options = AVAudioSession.InterruptionOptions(rawValue: optionsValue) + os_log("中断选项: %d, 应该恢复: %{public}@", log: logger, type: .info, optionsValue, options.contains(.shouldResume) ? "是" : "否") + if options.contains(.shouldResume), let intent = currentIntent { + os_log("恢复之前的音频意图: %{public}@", log: logger, type: .info, String(describing: intent)) // 恢复之前的音频意图 begin(intent) - os_log("音频会话中断结束,已恢复", log: logger, type: .debug) + os_log("✓ 音频会话中断结束,已恢复", log: logger, type: .info) + } else { + os_log("不需要恢复音频会话", log: logger, type: .info) } + } else { + os_log("⚠️ 中断通知中无选项信息", log: logger, type: .default) } @unknown default: - os_log("未知的音频中断类型: %{public}@", log: logger, type: .error, "\(type)") + os_log("❓ 未知的音频中断类型: %{public}@", log: logger, type: .error, "\(type)") } } /// 处理音频路由变化 @objc private func handleAudioRouteChange(notification: Notification) { + os_log("🔄 收到音频路由变化通知", log: logger, type: .info) + guard let userInfo = notification.userInfo, let reasonValue = userInfo[AVAudioSessionRouteChangeReasonKey] as? UInt, let reason = AVAudioSession.RouteChangeReason(rawValue: reasonValue) else { + os_log("⚠️ 无法解析音频路由变化通知", log: logger, type: .default) return } + os_log("路由变化原因: %d (%{public}@)", log: logger, type: .info, reasonValue, "\(reason)") + switch reason { case .newDeviceAvailable: - os_log("新音频设备已连接", log: logger, type: .info) - os_log("%{public}@", log: logger, type: .debug, getCurrentAudioRoute()) + os_log("📱 新音频设备已连接", log: logger, type: .info) + os_log("📋 当前音频路由:\n%{public}@", log: logger, type: .info, getCurrentAudioRoute()) // 重新应用当前意图以确保正确路由 if let intent = currentIntent { + os_log("重新应用当前音频意图: %{public}@", log: logger, type: .info, String(describing: intent)) begin(intent) + } else { + os_log("无当前音频意图需要重新应用", log: logger, type: .info) } case .oldDeviceUnavailable: - os_log("音频设备已断开", log: logger, type: .info) - os_log("%{public}@", log: logger, type: .debug, getCurrentAudioRoute()) + os_log("📱 音频设备已断开", log: logger, type: .info) + + // 输出之前的路由信息(如果可用) + if let previousRoute = userInfo[AVAudioSessionRouteChangePreviousRouteKey] as? AVAudioSessionRouteDescription { + os_log("之前的音频路由:", log: logger, type: .info) + for output in previousRoute.outputs { + os_log(" - 输出: %{public}@ (%{public}@)", log: logger, type: .info, output.portName, output.portType.rawValue) + } + for input in previousRoute.inputs { + os_log(" - 输入: %{public}@ (%{public}@)", log: logger, type: .info, input.portName, input.portType.rawValue) + } + } + + os_log("📋 当前音频路由:\n%{public}@", log: logger, type: .info, getCurrentAudioRoute()) // 重新应用当前意图以确保正确路由 if let intent = currentIntent { + os_log("重新应用当前音频意图: %{public}@", log: logger, type: .info, String(describing: intent)) begin(intent) + } else { + os_log("无当前音频意图需要重新应用", log: logger, type: .info) } case .categoryChange: - os_log("音频类别已变化", log: logger, type: .info) + os_log("🔧 音频类别已变化", log: logger, type: .info) + os_log(" - 当前类别: %{public}@", log: logger, type: .info, audioSession.category.rawValue) + os_log(" - 当前模式: %{public}@", log: logger, type: .info, audioSession.mode.rawValue) + + case .override: + os_log("🔀 音频路由被覆盖", log: logger, type: .info) - default: - break + case .wakeFromSleep: + os_log("😴 从睡眠中唤醒", log: logger, type: .info) + + case .noSuitableRouteForCategory: + os_log("❌ 当前类别没有合适的路由", log: logger, type: .default) + + case .routeConfigurationChange: + os_log("⚙️ 路由配置发生变化", log: logger, type: .info) + + @unknown default: + os_log("❓ 未知的路由变化原因: %d", log: logger, type: .default) } } diff --git a/local_plugins/agent_service/ios/agent_service/Sources/agent_service/Resources/calling.mp3 b/local_plugins/agent_service/ios/agent_service/Sources/agent_service/Resources/calling.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..44f39b98161c85381e8531984c16075c8658aa19 GIT binary patch literal 240691 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 lu;F9 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