kuavo-humanoid-sdk 1.2.1b3284__tar.gz → 1.3.1b98__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (206) hide show
  1. {kuavo_humanoid_sdk-1.2.1b3284 → kuavo_humanoid_sdk-1.3.1b98}/PKG-INFO +1 -1
  2. kuavo_humanoid_sdk-1.3.1b98/kuavo_humanoid_sdk/kuavo/core/llm_doubao_lib/audio_manager.py +255 -0
  3. kuavo_humanoid_sdk-1.3.1b98/kuavo_humanoid_sdk/kuavo/core/llm_doubao_lib/config.py +48 -0
  4. kuavo_humanoid_sdk-1.3.1b98/kuavo_humanoid_sdk/kuavo/core/llm_doubao_lib/protocol.py +135 -0
  5. kuavo_humanoid_sdk-1.3.1b98/kuavo_humanoid_sdk/kuavo/core/llm_doubao_lib/realtime_dialog_client.py +164 -0
  6. kuavo_humanoid_sdk-1.3.1b98/kuavo_humanoid_sdk/kuavo/core/model_utils/model_utils.py +109 -0
  7. kuavo_humanoid_sdk-1.3.1b98/kuavo_humanoid_sdk/kuavo/core/ros/camera.py +105 -0
  8. {kuavo_humanoid_sdk-1.2.1b3284 → kuavo_humanoid_sdk-1.3.1b98}/kuavo_humanoid_sdk/kuavo/robot.py +156 -71
  9. {kuavo_humanoid_sdk-1.2.1b3284 → kuavo_humanoid_sdk-1.3.1b98}/kuavo_humanoid_sdk/kuavo/robot_blockly.py +39 -47
  10. kuavo_humanoid_sdk-1.3.1b98/kuavo_humanoid_sdk/kuavo_strategy/grasp_box/test/test_grasp_box_strategy.py +552 -0
  11. kuavo_humanoid_sdk-1.3.1b98/kuavo_humanoid_sdk/kuavo_strategy_v2/common/events/mobile_manipulate/__init__.py +3 -0
  12. kuavo_humanoid_sdk-1.3.1b98/kuavo_humanoid_sdk/kuavo_strategy_v2/common/events/mobile_manipulate/arm_events.py +672 -0
  13. kuavo_humanoid_sdk-1.3.1b98/kuavo_humanoid_sdk/kuavo_strategy_v2/common/events/mobile_manipulate/head_events.py +341 -0
  14. kuavo_humanoid_sdk-1.3.1b98/kuavo_humanoid_sdk/kuavo_strategy_v2/common/events/mobile_manipulate/walk_events.py +419 -0
  15. kuavo_humanoid_sdk-1.3.1b98/kuavo_humanoid_sdk/kuavo_strategy_v2/pick_box_hil/strategy.py +65 -0
  16. kuavo_humanoid_sdk-1.3.1b98/kuavo_humanoid_sdk/kuavo_strategy_v2/pick_place_box/configs/config_real.py +62 -0
  17. kuavo_humanoid_sdk-1.3.1b98/kuavo_humanoid_sdk/kuavo_strategy_v2/pick_place_box/configs/config_sim.py +62 -0
  18. kuavo_humanoid_sdk-1.3.1b98/kuavo_humanoid_sdk/kuavo_strategy_v2/pick_place_box/examples/arm_example.py +59 -0
  19. kuavo_humanoid_sdk-1.3.1b98/kuavo_humanoid_sdk/kuavo_strategy_v2/pick_place_box/examples/walk_example.py +55 -0
  20. {kuavo_humanoid_sdk-1.2.1b3284 → kuavo_humanoid_sdk-1.3.1b98}/kuavo_humanoid_sdk.egg-info/PKG-INFO +1 -1
  21. {kuavo_humanoid_sdk-1.2.1b3284 → kuavo_humanoid_sdk-1.3.1b98}/kuavo_humanoid_sdk.egg-info/SOURCES.txt +16 -0
  22. {kuavo_humanoid_sdk-1.2.1b3284 → kuavo_humanoid_sdk-1.3.1b98}/kuavo_humanoid_sdk.egg-info/requires.txt +1 -0
  23. {kuavo_humanoid_sdk-1.2.1b3284 → kuavo_humanoid_sdk-1.3.1b98}/setup.py +30 -11
  24. {kuavo_humanoid_sdk-1.2.1b3284 → kuavo_humanoid_sdk-1.3.1b98}/README.md +0 -0
  25. {kuavo_humanoid_sdk-1.2.1b3284 → kuavo_humanoid_sdk-1.3.1b98}/kuavo_humanoid_sdk/__init__.py +0 -0
  26. {kuavo_humanoid_sdk-1.2.1b3284 → kuavo_humanoid_sdk-1.3.1b98}/kuavo_humanoid_sdk/common/logger.py +0 -0
  27. {kuavo_humanoid_sdk-1.2.1b3284 → kuavo_humanoid_sdk-1.3.1b98}/kuavo_humanoid_sdk/interfaces/__init__.py +0 -0
  28. {kuavo_humanoid_sdk-1.2.1b3284 → kuavo_humanoid_sdk-1.3.1b98}/kuavo_humanoid_sdk/interfaces/data_types.py +0 -0
  29. {kuavo_humanoid_sdk-1.2.1b3284 → kuavo_humanoid_sdk-1.3.1b98}/kuavo_humanoid_sdk/interfaces/end_effector.py +0 -0
  30. {kuavo_humanoid_sdk-1.2.1b3284 → kuavo_humanoid_sdk-1.3.1b98}/kuavo_humanoid_sdk/interfaces/robot.py +0 -0
  31. {kuavo_humanoid_sdk-1.2.1b3284 → kuavo_humanoid_sdk-1.3.1b98}/kuavo_humanoid_sdk/interfaces/robot_info.py +0 -0
  32. {kuavo_humanoid_sdk-1.2.1b3284 → kuavo_humanoid_sdk-1.3.1b98}/kuavo_humanoid_sdk/kuavo/__init__.py +0 -0
  33. {kuavo_humanoid_sdk-1.2.1b3284 → kuavo_humanoid_sdk-1.3.1b98}/kuavo_humanoid_sdk/kuavo/core/audio.py +0 -0
  34. {kuavo_humanoid_sdk-1.2.1b3284 → kuavo_humanoid_sdk-1.3.1b98}/kuavo_humanoid_sdk/kuavo/core/core.py +0 -0
  35. {kuavo_humanoid_sdk-1.2.1b3284 → kuavo_humanoid_sdk-1.3.1b98}/kuavo_humanoid_sdk/kuavo/core/dex_hand_control.py +0 -0
  36. {kuavo_humanoid_sdk-1.2.1b3284 → kuavo_humanoid_sdk-1.3.1b98}/kuavo_humanoid_sdk/kuavo/core/leju_claw_control.py +0 -0
  37. {kuavo_humanoid_sdk-1.2.1b3284 → kuavo_humanoid_sdk-1.3.1b98}/kuavo_humanoid_sdk/kuavo/core/llm_doubao.py +0 -0
  38. {kuavo_humanoid_sdk-1.2.1b3284 → kuavo_humanoid_sdk-1.3.1b98}/kuavo_humanoid_sdk/kuavo/core/microphone.py +0 -0
  39. {kuavo_humanoid_sdk-1.2.1b3284 → kuavo_humanoid_sdk-1.3.1b98}/kuavo_humanoid_sdk/kuavo/core/navigation.py +0 -0
  40. {kuavo_humanoid_sdk-1.2.1b3284 → kuavo_humanoid_sdk-1.3.1b98}/kuavo_humanoid_sdk/kuavo/core/ros/audio.py +0 -0
  41. {kuavo_humanoid_sdk-1.2.1b3284 → kuavo_humanoid_sdk-1.3.1b98}/kuavo_humanoid_sdk/kuavo/core/ros/control.py +0 -0
  42. {kuavo_humanoid_sdk-1.2.1b3284 → kuavo_humanoid_sdk-1.3.1b98}/kuavo_humanoid_sdk/kuavo/core/ros/microphone.py +0 -0
  43. {kuavo_humanoid_sdk-1.2.1b3284 → kuavo_humanoid_sdk-1.3.1b98}/kuavo_humanoid_sdk/kuavo/core/ros/navigation.py +0 -0
  44. {kuavo_humanoid_sdk-1.2.1b3284 → kuavo_humanoid_sdk-1.3.1b98}/kuavo_humanoid_sdk/kuavo/core/ros/observation.py +0 -0
  45. {kuavo_humanoid_sdk-1.2.1b3284 → kuavo_humanoid_sdk-1.3.1b98}/kuavo_humanoid_sdk/kuavo/core/ros/param.py +0 -0
  46. {kuavo_humanoid_sdk-1.2.1b3284 → kuavo_humanoid_sdk-1.3.1b98}/kuavo_humanoid_sdk/kuavo/core/ros/sat_utils.py +0 -0
  47. {kuavo_humanoid_sdk-1.2.1b3284 → kuavo_humanoid_sdk-1.3.1b98}/kuavo_humanoid_sdk/kuavo/core/ros/state.py +0 -0
  48. {kuavo_humanoid_sdk-1.2.1b3284 → kuavo_humanoid_sdk-1.3.1b98}/kuavo_humanoid_sdk/kuavo/core/ros/tools.py +0 -0
  49. {kuavo_humanoid_sdk-1.2.1b3284 → kuavo_humanoid_sdk-1.3.1b98}/kuavo_humanoid_sdk/kuavo/core/ros/vision.py +0 -0
  50. {kuavo_humanoid_sdk-1.2.1b3284 → kuavo_humanoid_sdk-1.3.1b98}/kuavo_humanoid_sdk/kuavo/core/ros_env.py +0 -0
  51. {kuavo_humanoid_sdk-1.2.1b3284 → kuavo_humanoid_sdk-1.3.1b98}/kuavo_humanoid_sdk/kuavo/core/sdk_deprecated.py +0 -0
  52. {kuavo_humanoid_sdk-1.2.1b3284 → kuavo_humanoid_sdk-1.3.1b98}/kuavo_humanoid_sdk/kuavo/demo_climbstair.py +0 -0
  53. {kuavo_humanoid_sdk-1.2.1b3284 → kuavo_humanoid_sdk-1.3.1b98}/kuavo_humanoid_sdk/kuavo/dexterous_hand.py +0 -0
  54. {kuavo_humanoid_sdk-1.2.1b3284 → kuavo_humanoid_sdk-1.3.1b98}/kuavo_humanoid_sdk/kuavo/leju_claw.py +0 -0
  55. {kuavo_humanoid_sdk-1.2.1b3284 → kuavo_humanoid_sdk-1.3.1b98}/kuavo_humanoid_sdk/kuavo/logger_client.py +0 -0
  56. {kuavo_humanoid_sdk-1.2.1b3284 → kuavo_humanoid_sdk-1.3.1b98}/kuavo_humanoid_sdk/kuavo/robot_arm.py +0 -0
  57. {kuavo_humanoid_sdk-1.2.1b3284 → kuavo_humanoid_sdk-1.3.1b98}/kuavo_humanoid_sdk/kuavo/robot_audio.py +0 -0
  58. {kuavo_humanoid_sdk-1.2.1b3284 → kuavo_humanoid_sdk-1.3.1b98}/kuavo_humanoid_sdk/kuavo/robot_climbstair.py +0 -0
  59. {kuavo_humanoid_sdk-1.2.1b3284 → kuavo_humanoid_sdk-1.3.1b98}/kuavo_humanoid_sdk/kuavo/robot_head.py +0 -0
  60. {kuavo_humanoid_sdk-1.2.1b3284 → kuavo_humanoid_sdk-1.3.1b98}/kuavo_humanoid_sdk/kuavo/robot_info.py +0 -0
  61. {kuavo_humanoid_sdk-1.2.1b3284 → kuavo_humanoid_sdk-1.3.1b98}/kuavo_humanoid_sdk/kuavo/robot_microphone.py +0 -0
  62. {kuavo_humanoid_sdk-1.2.1b3284 → kuavo_humanoid_sdk-1.3.1b98}/kuavo_humanoid_sdk/kuavo/robot_navigation.py +0 -0
  63. {kuavo_humanoid_sdk-1.2.1b3284 → kuavo_humanoid_sdk-1.3.1b98}/kuavo_humanoid_sdk/kuavo/robot_observation.py +0 -0
  64. {kuavo_humanoid_sdk-1.2.1b3284 → kuavo_humanoid_sdk-1.3.1b98}/kuavo_humanoid_sdk/kuavo/robot_speech.py +0 -0
  65. {kuavo_humanoid_sdk-1.2.1b3284 → kuavo_humanoid_sdk-1.3.1b98}/kuavo_humanoid_sdk/kuavo/robot_state.py +0 -0
  66. {kuavo_humanoid_sdk-1.2.1b3284 → kuavo_humanoid_sdk-1.3.1b98}/kuavo_humanoid_sdk/kuavo/robot_tool.py +0 -0
  67. {kuavo_humanoid_sdk-1.2.1b3284 → kuavo_humanoid_sdk-1.3.1b98}/kuavo_humanoid_sdk/kuavo/robot_vision.py +0 -0
  68. {kuavo_humanoid_sdk-1.2.1b3284 → kuavo_humanoid_sdk-1.3.1b98}/kuavo_humanoid_sdk/kuavo_strategy/__init__.py +0 -0
  69. {kuavo_humanoid_sdk-1.2.1b3284 → kuavo_humanoid_sdk-1.3.1b98}/kuavo_humanoid_sdk/kuavo_strategy/grasp_box/grasp_box_strategy.py +0 -0
  70. {kuavo_humanoid_sdk-1.2.1b3284 → kuavo_humanoid_sdk-1.3.1b98}/kuavo_humanoid_sdk/kuavo_strategy/kuavo_strategy.py +0 -0
  71. {kuavo_humanoid_sdk-1.2.1b3284 → kuavo_humanoid_sdk-1.3.1b98}/kuavo_humanoid_sdk/kuavo_strategy_v2/common/data_type.py +0 -0
  72. {kuavo_humanoid_sdk-1.2.1b3284 → kuavo_humanoid_sdk-1.3.1b98}/kuavo_humanoid_sdk/kuavo_strategy_v2/common/events/base_event.py +0 -0
  73. {kuavo_humanoid_sdk-1.2.1b3284 → kuavo_humanoid_sdk-1.3.1b98}/kuavo_humanoid_sdk/kuavo_strategy_v2/common/robot_sdk.py +0 -0
  74. {kuavo_humanoid_sdk-1.2.1b3284 → kuavo_humanoid_sdk-1.3.1b98}/kuavo_humanoid_sdk/kuavo_strategy_v2/pick_place_box/case.py +0 -0
  75. {kuavo_humanoid_sdk-1.2.1b3284 → kuavo_humanoid_sdk-1.3.1b98}/kuavo_humanoid_sdk/kuavo_strategy_v2/pick_place_box/strategy.py +0 -0
  76. {kuavo_humanoid_sdk-1.2.1b3284 → kuavo_humanoid_sdk-1.3.1b98}/kuavo_humanoid_sdk/kuavo_strategy_v2/utils/logger_setup.py +0 -0
  77. {kuavo_humanoid_sdk-1.2.1b3284 → kuavo_humanoid_sdk-1.3.1b98}/kuavo_humanoid_sdk/kuavo_strategy_v2/utils/utils.py +0 -0
  78. {kuavo_humanoid_sdk-1.2.1b3284 → kuavo_humanoid_sdk-1.3.1b98}/kuavo_humanoid_sdk/msg/__init__.py +0 -0
  79. {kuavo_humanoid_sdk-1.2.1b3284 → kuavo_humanoid_sdk-1.3.1b98}/kuavo_humanoid_sdk/msg/kuavo_msgs/__init__.py +0 -0
  80. {kuavo_humanoid_sdk-1.2.1b3284 → kuavo_humanoid_sdk-1.3.1b98}/kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_AprilTagDetection.py +0 -0
  81. {kuavo_humanoid_sdk-1.2.1b3284 → kuavo_humanoid_sdk-1.3.1b98}/kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_AprilTagDetectionArray.py +0 -0
  82. {kuavo_humanoid_sdk-1.2.1b3284 → kuavo_humanoid_sdk-1.3.1b98}/kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_AudioReceiverData.py +0 -0
  83. {kuavo_humanoid_sdk-1.2.1b3284 → kuavo_humanoid_sdk-1.3.1b98}/kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_FTsensorData.py +0 -0
  84. {kuavo_humanoid_sdk-1.2.1b3284 → kuavo_humanoid_sdk-1.3.1b98}/kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_JoySticks.py +0 -0
  85. {kuavo_humanoid_sdk-1.2.1b3284 → kuavo_humanoid_sdk-1.3.1b98}/kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_Metadata.py +0 -0
  86. {kuavo_humanoid_sdk-1.2.1b3284 → kuavo_humanoid_sdk-1.3.1b98}/kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_MmDetectionMsg.py +0 -0
  87. {kuavo_humanoid_sdk-1.2.1b3284 → kuavo_humanoid_sdk-1.3.1b98}/kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_RobotActionState.py +0 -0
  88. {kuavo_humanoid_sdk-1.2.1b3284 → kuavo_humanoid_sdk-1.3.1b98}/kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_TFArray.py +0 -0
  89. {kuavo_humanoid_sdk-1.2.1b3284 → kuavo_humanoid_sdk-1.3.1b98}/kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_TaskPoint.py +0 -0
  90. {kuavo_humanoid_sdk-1.2.1b3284 → kuavo_humanoid_sdk-1.3.1b98}/kuavo_humanoid_sdk/msg/kuavo_msgs/msg/__init__.py +0 -0
  91. {kuavo_humanoid_sdk-1.2.1b3284 → kuavo_humanoid_sdk-1.3.1b98}/kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_armCollisionCheckInfo.py +0 -0
  92. {kuavo_humanoid_sdk-1.2.1b3284 → kuavo_humanoid_sdk-1.3.1b98}/kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_armHandPose.py +0 -0
  93. {kuavo_humanoid_sdk-1.2.1b3284 → kuavo_humanoid_sdk-1.3.1b98}/kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_armHandPoseFree.py +0 -0
  94. {kuavo_humanoid_sdk-1.2.1b3284 → kuavo_humanoid_sdk-1.3.1b98}/kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_armPoseWithTimeStamp.py +0 -0
  95. {kuavo_humanoid_sdk-1.2.1b3284 → kuavo_humanoid_sdk-1.3.1b98}/kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_armTargetPoses.py +0 -0
  96. {kuavo_humanoid_sdk-1.2.1b3284 → kuavo_humanoid_sdk-1.3.1b98}/kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_bezierCurveCubicPoint.py +0 -0
  97. {kuavo_humanoid_sdk-1.2.1b3284 → kuavo_humanoid_sdk-1.3.1b98}/kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_dexhandCommand.py +0 -0
  98. {kuavo_humanoid_sdk-1.2.1b3284 → kuavo_humanoid_sdk-1.3.1b98}/kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_dexhandTouchState.py +0 -0
  99. {kuavo_humanoid_sdk-1.2.1b3284 → kuavo_humanoid_sdk-1.3.1b98}/kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_endEffectorData.py +0 -0
  100. {kuavo_humanoid_sdk-1.2.1b3284 → kuavo_humanoid_sdk-1.3.1b98}/kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_footPose.py +0 -0
  101. {kuavo_humanoid_sdk-1.2.1b3284 → kuavo_humanoid_sdk-1.3.1b98}/kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_footPose6D.py +0 -0
  102. {kuavo_humanoid_sdk-1.2.1b3284 → kuavo_humanoid_sdk-1.3.1b98}/kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_footPose6DTargetTrajectories.py +0 -0
  103. {kuavo_humanoid_sdk-1.2.1b3284 → kuavo_humanoid_sdk-1.3.1b98}/kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_footPoseTargetTrajectories.py +0 -0
  104. {kuavo_humanoid_sdk-1.2.1b3284 → kuavo_humanoid_sdk-1.3.1b98}/kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_footPoseWithVision.py +0 -0
  105. {kuavo_humanoid_sdk-1.2.1b3284 → kuavo_humanoid_sdk-1.3.1b98}/kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_footPoseWithVisionArray.py +0 -0
  106. {kuavo_humanoid_sdk-1.2.1b3284 → kuavo_humanoid_sdk-1.3.1b98}/kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_footPoses.py +0 -0
  107. {kuavo_humanoid_sdk-1.2.1b3284 → kuavo_humanoid_sdk-1.3.1b98}/kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_footPoses6D.py +0 -0
  108. {kuavo_humanoid_sdk-1.2.1b3284 → kuavo_humanoid_sdk-1.3.1b98}/kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_fullBodyTargetTrajectories.py +0 -0
  109. {kuavo_humanoid_sdk-1.2.1b3284 → kuavo_humanoid_sdk-1.3.1b98}/kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_gaitTimeName.py +0 -0
  110. {kuavo_humanoid_sdk-1.2.1b3284 → kuavo_humanoid_sdk-1.3.1b98}/kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_gestureInfo.py +0 -0
  111. {kuavo_humanoid_sdk-1.2.1b3284 → kuavo_humanoid_sdk-1.3.1b98}/kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_gestureTask.py +0 -0
  112. {kuavo_humanoid_sdk-1.2.1b3284 → kuavo_humanoid_sdk-1.3.1b98}/kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_handPose.py +0 -0
  113. {kuavo_humanoid_sdk-1.2.1b3284 → kuavo_humanoid_sdk-1.3.1b98}/kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_headBodyPose.py +0 -0
  114. {kuavo_humanoid_sdk-1.2.1b3284 → kuavo_humanoid_sdk-1.3.1b98}/kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_ikSolveError.py +0 -0
  115. {kuavo_humanoid_sdk-1.2.1b3284 → kuavo_humanoid_sdk-1.3.1b98}/kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_ikSolveParam.py +0 -0
  116. {kuavo_humanoid_sdk-1.2.1b3284 → kuavo_humanoid_sdk-1.3.1b98}/kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_imuData.py +0 -0
  117. {kuavo_humanoid_sdk-1.2.1b3284 → kuavo_humanoid_sdk-1.3.1b98}/kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_jointBezierTrajectory.py +0 -0
  118. {kuavo_humanoid_sdk-1.2.1b3284 → kuavo_humanoid_sdk-1.3.1b98}/kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_jointCmd.py +0 -0
  119. {kuavo_humanoid_sdk-1.2.1b3284 → kuavo_humanoid_sdk-1.3.1b98}/kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_jointData.py +0 -0
  120. {kuavo_humanoid_sdk-1.2.1b3284 → kuavo_humanoid_sdk-1.3.1b98}/kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_kuavoModeSchedule.py +0 -0
  121. {kuavo_humanoid_sdk-1.2.1b3284 → kuavo_humanoid_sdk-1.3.1b98}/kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_lejuClawCommand.py +0 -0
  122. {kuavo_humanoid_sdk-1.2.1b3284 → kuavo_humanoid_sdk-1.3.1b98}/kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_lejuClawState.py +0 -0
  123. {kuavo_humanoid_sdk-1.2.1b3284 → kuavo_humanoid_sdk-1.3.1b98}/kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_motorParam.py +0 -0
  124. {kuavo_humanoid_sdk-1.2.1b3284 → kuavo_humanoid_sdk-1.3.1b98}/kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_picoPoseInfo.py +0 -0
  125. {kuavo_humanoid_sdk-1.2.1b3284 → kuavo_humanoid_sdk-1.3.1b98}/kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_picoPoseInfoList.py +0 -0
  126. {kuavo_humanoid_sdk-1.2.1b3284 → kuavo_humanoid_sdk-1.3.1b98}/kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_planArmState.py +0 -0
  127. {kuavo_humanoid_sdk-1.2.1b3284 → kuavo_humanoid_sdk-1.3.1b98}/kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_qv.py +0 -0
  128. {kuavo_humanoid_sdk-1.2.1b3284 → kuavo_humanoid_sdk-1.3.1b98}/kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_robotArmQVVD.py +0 -0
  129. {kuavo_humanoid_sdk-1.2.1b3284 → kuavo_humanoid_sdk-1.3.1b98}/kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_robotBodyMatrices.py +0 -0
  130. {kuavo_humanoid_sdk-1.2.1b3284 → kuavo_humanoid_sdk-1.3.1b98}/kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_robotHandPosition.py +0 -0
  131. {kuavo_humanoid_sdk-1.2.1b3284 → kuavo_humanoid_sdk-1.3.1b98}/kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_robotHeadMotionData.py +0 -0
  132. {kuavo_humanoid_sdk-1.2.1b3284 → kuavo_humanoid_sdk-1.3.1b98}/kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_robotState.py +0 -0
  133. {kuavo_humanoid_sdk-1.2.1b3284 → kuavo_humanoid_sdk-1.3.1b98}/kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_sensorsData.py +0 -0
  134. {kuavo_humanoid_sdk-1.2.1b3284 → kuavo_humanoid_sdk-1.3.1b98}/kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_switchGaitByName.py +0 -0
  135. {kuavo_humanoid_sdk-1.2.1b3284 → kuavo_humanoid_sdk-1.3.1b98}/kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_tagDataArray.py +0 -0
  136. {kuavo_humanoid_sdk-1.2.1b3284 → kuavo_humanoid_sdk-1.3.1b98}/kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_touchSensorStatus.py +0 -0
  137. {kuavo_humanoid_sdk-1.2.1b3284 → kuavo_humanoid_sdk-1.3.1b98}/kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_twoArmHandPose.py +0 -0
  138. {kuavo_humanoid_sdk-1.2.1b3284 → kuavo_humanoid_sdk-1.3.1b98}/kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_twoArmHandPoseCmd.py +0 -0
  139. {kuavo_humanoid_sdk-1.2.1b3284 → kuavo_humanoid_sdk-1.3.1b98}/kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_twoArmHandPoseCmdFree.py +0 -0
  140. {kuavo_humanoid_sdk-1.2.1b3284 → kuavo_humanoid_sdk-1.3.1b98}/kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_twoArmHandPoseFree.py +0 -0
  141. {kuavo_humanoid_sdk-1.2.1b3284 → kuavo_humanoid_sdk-1.3.1b98}/kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_yoloDetection.py +0 -0
  142. {kuavo_humanoid_sdk-1.2.1b3284 → kuavo_humanoid_sdk-1.3.1b98}/kuavo_humanoid_sdk/msg/kuavo_msgs/msg/_yoloOutputData.py +0 -0
  143. {kuavo_humanoid_sdk-1.2.1b3284 → kuavo_humanoid_sdk-1.3.1b98}/kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_CreatePath.py +0 -0
  144. {kuavo_humanoid_sdk-1.2.1b3284 → kuavo_humanoid_sdk-1.3.1b98}/kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_ExecuteArmAction.py +0 -0
  145. {kuavo_humanoid_sdk-1.2.1b3284 → kuavo_humanoid_sdk-1.3.1b98}/kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_GetAllMaps.py +0 -0
  146. {kuavo_humanoid_sdk-1.2.1b3284 → kuavo_humanoid_sdk-1.3.1b98}/kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_GetCurrentMap.py +0 -0
  147. {kuavo_humanoid_sdk-1.2.1b3284 → kuavo_humanoid_sdk-1.3.1b98}/kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_GetTargetPartPoseInCamera.py +0 -0
  148. {kuavo_humanoid_sdk-1.2.1b3284 → kuavo_humanoid_sdk-1.3.1b98}/kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_InitialPoseWithTaskPoint.py +0 -0
  149. {kuavo_humanoid_sdk-1.2.1b3284 → kuavo_humanoid_sdk-1.3.1b98}/kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_LoadMap.py +0 -0
  150. {kuavo_humanoid_sdk-1.2.1b3284 → kuavo_humanoid_sdk-1.3.1b98}/kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_NavigateToTaskPoint.py +0 -0
  151. {kuavo_humanoid_sdk-1.2.1b3284 → kuavo_humanoid_sdk-1.3.1b98}/kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_RepublishTFs.py +0 -0
  152. {kuavo_humanoid_sdk-1.2.1b3284 → kuavo_humanoid_sdk-1.3.1b98}/kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_SetInitialPose.py +0 -0
  153. {kuavo_humanoid_sdk-1.2.1b3284 → kuavo_humanoid_sdk-1.3.1b98}/kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_SetJoyTopic.py +0 -0
  154. {kuavo_humanoid_sdk-1.2.1b3284 → kuavo_humanoid_sdk-1.3.1b98}/kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_SetLEDMode.py +0 -0
  155. {kuavo_humanoid_sdk-1.2.1b3284 → kuavo_humanoid_sdk-1.3.1b98}/kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_SetLEDMode_free.py +0 -0
  156. {kuavo_humanoid_sdk-1.2.1b3284 → kuavo_humanoid_sdk-1.3.1b98}/kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_SpeechSynthesis.py +0 -0
  157. {kuavo_humanoid_sdk-1.2.1b3284 → kuavo_humanoid_sdk-1.3.1b98}/kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_TaskPointOperation.py +0 -0
  158. {kuavo_humanoid_sdk-1.2.1b3284 → kuavo_humanoid_sdk-1.3.1b98}/kuavo_humanoid_sdk/msg/kuavo_msgs/srv/__init__.py +0 -0
  159. {kuavo_humanoid_sdk-1.2.1b3284 → kuavo_humanoid_sdk-1.3.1b98}/kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_adjustZeroPoint.py +0 -0
  160. {kuavo_humanoid_sdk-1.2.1b3284 → kuavo_humanoid_sdk-1.3.1b98}/kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_changeArmCtrlMode.py +0 -0
  161. {kuavo_humanoid_sdk-1.2.1b3284 → kuavo_humanoid_sdk-1.3.1b98}/kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_changeArmCtrlModeKuavo.py +0 -0
  162. {kuavo_humanoid_sdk-1.2.1b3284 → kuavo_humanoid_sdk-1.3.1b98}/kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_changeMotorParam.py +0 -0
  163. {kuavo_humanoid_sdk-1.2.1b3284 → kuavo_humanoid_sdk-1.3.1b98}/kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_changeTorsoCtrlMode.py +0 -0
  164. {kuavo_humanoid_sdk-1.2.1b3284 → kuavo_humanoid_sdk-1.3.1b98}/kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_controlLejuClaw.py +0 -0
  165. {kuavo_humanoid_sdk-1.2.1b3284 → kuavo_humanoid_sdk-1.3.1b98}/kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_enableHandTouchSensor.py +0 -0
  166. {kuavo_humanoid_sdk-1.2.1b3284 → kuavo_humanoid_sdk-1.3.1b98}/kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_fkSrv.py +0 -0
  167. {kuavo_humanoid_sdk-1.2.1b3284 → kuavo_humanoid_sdk-1.3.1b98}/kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_footPose6DTargetTrajectoriesSrv.py +0 -0
  168. {kuavo_humanoid_sdk-1.2.1b3284 → kuavo_humanoid_sdk-1.3.1b98}/kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_footPoseTargetTrajectoriesSrv.py +0 -0
  169. {kuavo_humanoid_sdk-1.2.1b3284 → kuavo_humanoid_sdk-1.3.1b98}/kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_gestureExecute.py +0 -0
  170. {kuavo_humanoid_sdk-1.2.1b3284 → kuavo_humanoid_sdk-1.3.1b98}/kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_gestureExecuteState.py +0 -0
  171. {kuavo_humanoid_sdk-1.2.1b3284 → kuavo_humanoid_sdk-1.3.1b98}/kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_gestureList.py +0 -0
  172. {kuavo_humanoid_sdk-1.2.1b3284 → kuavo_humanoid_sdk-1.3.1b98}/kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_getCurrentGaitName.py +0 -0
  173. {kuavo_humanoid_sdk-1.2.1b3284 → kuavo_humanoid_sdk-1.3.1b98}/kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_getMotorParam.py +0 -0
  174. {kuavo_humanoid_sdk-1.2.1b3284 → kuavo_humanoid_sdk-1.3.1b98}/kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_getMotorZeroPoints.py +0 -0
  175. {kuavo_humanoid_sdk-1.2.1b3284 → kuavo_humanoid_sdk-1.3.1b98}/kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_handForceLevel.py +0 -0
  176. {kuavo_humanoid_sdk-1.2.1b3284 → kuavo_humanoid_sdk-1.3.1b98}/kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_jointMoveTo.py +0 -0
  177. {kuavo_humanoid_sdk-1.2.1b3284 → kuavo_humanoid_sdk-1.3.1b98}/kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_planArmTrajectoryBezierCurve.py +0 -0
  178. {kuavo_humanoid_sdk-1.2.1b3284 → kuavo_humanoid_sdk-1.3.1b98}/kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_planArmTrajectoryCubicSpline.py +0 -0
  179. {kuavo_humanoid_sdk-1.2.1b3284 → kuavo_humanoid_sdk-1.3.1b98}/kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_playmusic.py +0 -0
  180. {kuavo_humanoid_sdk-1.2.1b3284 → kuavo_humanoid_sdk-1.3.1b98}/kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_setHwIntialState.py +0 -0
  181. {kuavo_humanoid_sdk-1.2.1b3284 → kuavo_humanoid_sdk-1.3.1b98}/kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_setMmCtrlFrame.py +0 -0
  182. {kuavo_humanoid_sdk-1.2.1b3284 → kuavo_humanoid_sdk-1.3.1b98}/kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_setMotorEncoderRoundService.py +0 -0
  183. {kuavo_humanoid_sdk-1.2.1b3284 → kuavo_humanoid_sdk-1.3.1b98}/kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_setTagId.py +0 -0
  184. {kuavo_humanoid_sdk-1.2.1b3284 → kuavo_humanoid_sdk-1.3.1b98}/kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_singleStepControl.py +0 -0
  185. {kuavo_humanoid_sdk-1.2.1b3284 → kuavo_humanoid_sdk-1.3.1b98}/kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_twoArmHandPoseCmdFreeSrv.py +0 -0
  186. {kuavo_humanoid_sdk-1.2.1b3284 → kuavo_humanoid_sdk-1.3.1b98}/kuavo_humanoid_sdk/msg/kuavo_msgs/srv/_twoArmHandPoseCmdSrv.py +0 -0
  187. {kuavo_humanoid_sdk-1.2.1b3284 → kuavo_humanoid_sdk-1.3.1b98}/kuavo_humanoid_sdk/msg/motion_capture_ik/__init__.py +0 -0
  188. {kuavo_humanoid_sdk-1.2.1b3284 → kuavo_humanoid_sdk-1.3.1b98}/kuavo_humanoid_sdk/msg/ocs2_msgs/__init__.py +0 -0
  189. {kuavo_humanoid_sdk-1.2.1b3284 → kuavo_humanoid_sdk-1.3.1b98}/kuavo_humanoid_sdk/msg/ocs2_msgs/msg/__init__.py +0 -0
  190. {kuavo_humanoid_sdk-1.2.1b3284 → kuavo_humanoid_sdk-1.3.1b98}/kuavo_humanoid_sdk/msg/ocs2_msgs/msg/_constraint.py +0 -0
  191. {kuavo_humanoid_sdk-1.2.1b3284 → kuavo_humanoid_sdk-1.3.1b98}/kuavo_humanoid_sdk/msg/ocs2_msgs/msg/_controller_data.py +0 -0
  192. {kuavo_humanoid_sdk-1.2.1b3284 → kuavo_humanoid_sdk-1.3.1b98}/kuavo_humanoid_sdk/msg/ocs2_msgs/msg/_lagrangian_metrics.py +0 -0
  193. {kuavo_humanoid_sdk-1.2.1b3284 → kuavo_humanoid_sdk-1.3.1b98}/kuavo_humanoid_sdk/msg/ocs2_msgs/msg/_mode_schedule.py +0 -0
  194. {kuavo_humanoid_sdk-1.2.1b3284 → kuavo_humanoid_sdk-1.3.1b98}/kuavo_humanoid_sdk/msg/ocs2_msgs/msg/_mpc_flattened_controller.py +0 -0
  195. {kuavo_humanoid_sdk-1.2.1b3284 → kuavo_humanoid_sdk-1.3.1b98}/kuavo_humanoid_sdk/msg/ocs2_msgs/msg/_mpc_input.py +0 -0
  196. {kuavo_humanoid_sdk-1.2.1b3284 → kuavo_humanoid_sdk-1.3.1b98}/kuavo_humanoid_sdk/msg/ocs2_msgs/msg/_mpc_observation.py +0 -0
  197. {kuavo_humanoid_sdk-1.2.1b3284 → kuavo_humanoid_sdk-1.3.1b98}/kuavo_humanoid_sdk/msg/ocs2_msgs/msg/_mpc_performance_indices.py +0 -0
  198. {kuavo_humanoid_sdk-1.2.1b3284 → kuavo_humanoid_sdk-1.3.1b98}/kuavo_humanoid_sdk/msg/ocs2_msgs/msg/_mpc_solver_data.py +0 -0
  199. {kuavo_humanoid_sdk-1.2.1b3284 → kuavo_humanoid_sdk-1.3.1b98}/kuavo_humanoid_sdk/msg/ocs2_msgs/msg/_mpc_state.py +0 -0
  200. {kuavo_humanoid_sdk-1.2.1b3284 → kuavo_humanoid_sdk-1.3.1b98}/kuavo_humanoid_sdk/msg/ocs2_msgs/msg/_mpc_target_trajectories.py +0 -0
  201. {kuavo_humanoid_sdk-1.2.1b3284 → kuavo_humanoid_sdk-1.3.1b98}/kuavo_humanoid_sdk/msg/ocs2_msgs/msg/_multiplier.py +0 -0
  202. {kuavo_humanoid_sdk-1.2.1b3284 → kuavo_humanoid_sdk-1.3.1b98}/kuavo_humanoid_sdk/msg/ocs2_msgs/srv/__init__.py +0 -0
  203. {kuavo_humanoid_sdk-1.2.1b3284 → kuavo_humanoid_sdk-1.3.1b98}/kuavo_humanoid_sdk/msg/ocs2_msgs/srv/_reset.py +0 -0
  204. {kuavo_humanoid_sdk-1.2.1b3284 → kuavo_humanoid_sdk-1.3.1b98}/kuavo_humanoid_sdk.egg-info/dependency_links.txt +0 -0
  205. {kuavo_humanoid_sdk-1.2.1b3284 → kuavo_humanoid_sdk-1.3.1b98}/kuavo_humanoid_sdk.egg-info/top_level.txt +0 -0
  206. {kuavo_humanoid_sdk-1.2.1b3284 → kuavo_humanoid_sdk-1.3.1b98}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: kuavo_humanoid_sdk
3
- Version: 1.2.1b3284
3
+ Version: 1.3.1b98
4
4
  Summary: A Python SDK for kuavo humanoid robot.
5
5
  Home-page: https://gitee.com/leju-robot/kuavo-ros-opensource/
6
6
  Author: ['lejurobot']
@@ -0,0 +1,255 @@
1
+ import asyncio
2
+ import uuid
3
+ import queue
4
+ import threading
5
+ import time
6
+ import random
7
+ from typing import Optional, Dict, Any
8
+ import wave
9
+ import pyaudio
10
+ import signal
11
+ from dataclasses import dataclass
12
+
13
+ from kuavo_humanoid_sdk.common.logger import SDKLogger
14
+ from kuavo_humanoid_sdk.kuavo.core.llm_doubao_lib import config
15
+ from kuavo_humanoid_sdk.kuavo.core.llm_doubao_lib.realtime_dialog_client import RealtimeDialogClient
16
+
17
+
18
+ @dataclass
19
+ class AudioConfig:
20
+ """音频配置数据类"""
21
+ format: str
22
+ bit_size: int
23
+ channels: int
24
+ sample_rate: int
25
+ chunk: int
26
+
27
+
28
+ class AudioDeviceManager:
29
+ """音频设备管理类,处理音频输入输出"""
30
+
31
+ def __init__(self, input_config: AudioConfig, output_config: AudioConfig):
32
+ self.input_config = input_config
33
+ self.output_config = output_config
34
+ self.pyaudio = pyaudio.PyAudio()
35
+ self.input_stream: Optional[pyaudio.Stream] = None
36
+ self.output_stream: Optional[pyaudio.Stream] = None
37
+
38
+ def open_input_stream(self) -> pyaudio.Stream:
39
+ """打开音频输入流"""
40
+ # p = pyaudio.PyAudio()
41
+ self.input_stream = self.pyaudio.open(
42
+ format=self.input_config.bit_size,
43
+ channels=self.input_config.channels,
44
+ rate=self.input_config.sample_rate,
45
+ input=True,
46
+ frames_per_buffer=self.input_config.chunk
47
+ )
48
+ return self.input_stream
49
+
50
+ def open_output_stream(self) -> pyaudio.Stream:
51
+ """打开音频输出流"""
52
+ self.output_stream = self.pyaudio.open(
53
+ format=self.output_config.bit_size,
54
+ channels=self.output_config.channels,
55
+ rate=self.output_config.sample_rate,
56
+ output=True,
57
+ frames_per_buffer=self.output_config.chunk
58
+ )
59
+ return self.output_stream
60
+
61
+ def cleanup(self) -> None:
62
+ """清理音频设备资源"""
63
+ for stream in [self.input_stream, self.output_stream]:
64
+ if stream:
65
+ stream.stop_stream()
66
+ stream.close()
67
+ self.pyaudio.terminate()
68
+
69
+
70
+ class DialogSession:
71
+ """对话会话管理类"""
72
+
73
+ def __init__(self, ws_config: Dict[str, Any], enable_signal_handler: bool = True):
74
+ self.session_id = str(uuid.uuid4())
75
+ self.client = RealtimeDialogClient(config=ws_config, session_id=self.session_id)
76
+ self.audio_device = AudioDeviceManager(
77
+ AudioConfig(**config.input_audio_config),
78
+ AudioConfig(**config.output_audio_config)
79
+ )
80
+
81
+ self.is_running = True
82
+ self.is_session_finished = False
83
+ self.is_user_querying = False
84
+ self.is_sending_chat_tts_text = False
85
+ self.audio_buffer = b''
86
+
87
+ # 只在主线程中设置信号处理器
88
+ if enable_signal_handler:
89
+ try:
90
+ signal.signal(signal.SIGINT, self._keyboard_signal)
91
+ except ValueError as e:
92
+ # 如果不在主线程中,忽略这个错误
93
+ SDKLogger.warning(f"Warning: Cannot set signal handler (not in main thread): {e}")
94
+
95
+ # 初始化音频队列和输出流
96
+ self.audio_queue = queue.Queue()
97
+ self.output_stream = self.audio_device.open_output_stream()
98
+ # 启动播放线程
99
+ self.is_recording = True
100
+ self.is_playing = True
101
+ self.player_thread = threading.Thread(target=self._audio_player_thread)
102
+ self.player_thread.daemon = True
103
+ self.player_thread.start()
104
+
105
+ def _audio_player_thread(self):
106
+ """音频播放线程"""
107
+ while self.is_playing:
108
+ try:
109
+ # 从队列获取音频数据
110
+ audio_data = self.audio_queue.get(timeout=1.0)
111
+ if audio_data is not None:
112
+ self.output_stream.write(audio_data)
113
+ except queue.Empty:
114
+ # 队列为空时等待一小段时间
115
+ time.sleep(0.1)
116
+ except Exception as e:
117
+ SDKLogger.error(f"音频播放错误: {e}")
118
+ time.sleep(0.1)
119
+
120
+ def handle_server_response(self, response: Dict[str, Any]) -> None:
121
+ if response == {}:
122
+ return
123
+ """处理服务器响应"""
124
+ if response['message_type'] == 'SERVER_ACK' and isinstance(response.get('payload_msg'), bytes):
125
+ # SDKLogger.info(f"\n接收到音频数据: {len(response['payload_msg'])} 字节")
126
+ if self.is_sending_chat_tts_text:
127
+ return
128
+ audio_data = response['payload_msg']
129
+ self.audio_queue.put(audio_data)
130
+ self.audio_buffer += audio_data
131
+ elif response['message_type'] == 'SERVER_FULL_RESPONSE':
132
+ SDKLogger.info(f"服务器响应: {response}")
133
+ event = response.get('event')
134
+ payload_msg = response.get('payload_msg', {})
135
+
136
+ if event == 450:
137
+ SDKLogger.info(f"清空缓存音频: {response['session_id']}")
138
+ while not self.audio_queue.empty():
139
+ try:
140
+ self.audio_queue.get_nowait()
141
+ except queue.Empty:
142
+ continue
143
+ self.is_user_querying = True
144
+
145
+ if event == 350 and self.is_sending_chat_tts_text and payload_msg.get("tts_type") == "chat_tts_text":
146
+ while not self.audio_queue.empty():
147
+ try:
148
+ self.audio_queue.get_nowait()
149
+ except queue.Empty:
150
+ continue
151
+ self.is_sending_chat_tts_text = False
152
+
153
+ if event == 459:
154
+ self.is_user_querying = False
155
+ elif response['message_type'] == 'SERVER_ERROR':
156
+ SDKLogger.error(f"服务器错误: {response['payload_msg']}")
157
+ raise Exception("服务器错误")
158
+
159
+ def _keyboard_signal(self, sig, frame):
160
+ SDKLogger.info(f"receive keyboard Ctrl+C")
161
+ self.is_recording = False
162
+ self.is_playing = False
163
+ self.is_running = False
164
+
165
+ async def receive_loop(self):
166
+ try:
167
+ while True:
168
+ response = await self.client.receive_server_response()
169
+ self.handle_server_response(response)
170
+ if 'event' in response and (response['event'] == 152 or response['event'] == 153):
171
+ SDKLogger.info(f"receive session finished event: {response['event']}")
172
+ self.is_session_finished = True
173
+ break
174
+ except asyncio.CancelledError:
175
+ SDKLogger.info("接收任务已取消")
176
+ except Exception as e:
177
+ SDKLogger.error(f"接收消息错误: {e}")
178
+
179
+ async def process_microphone_input(self) -> None:
180
+ await self.client.say_hello()
181
+ """处理麦克风输入"""
182
+ stream = self.audio_device.open_input_stream()
183
+ SDKLogger.info("已打开麦克风,请讲话...")
184
+
185
+ while self.is_recording:
186
+ try:
187
+ # 添加exception_on_overflow=False参数来忽略溢出错误
188
+ audio_data = stream.read(config.input_audio_config["chunk"], exception_on_overflow=False)
189
+ save_pcm_to_wav(audio_data, "input.pcm")
190
+ await self.client.task_request(audio_data)
191
+ await asyncio.sleep(0.01) # 避免CPU过度使用
192
+ except Exception as e:
193
+ SDKLogger.error(f"读取麦克风数据出错: {e}")
194
+ await asyncio.sleep(0.1) # 给系统一些恢复时间
195
+
196
+ async def start(self) -> None:
197
+ """启动对话会话"""
198
+ try:
199
+ await self.client.connect()
200
+ asyncio.create_task(self.process_microphone_input())
201
+ asyncio.create_task(self.receive_loop())
202
+
203
+ while self.is_running:
204
+ await asyncio.sleep(0.1)
205
+
206
+ await self.client.finish_session()
207
+ while not self.is_session_finished:
208
+ await asyncio.sleep(0.1)
209
+ await self.client.finish_connection()
210
+ await asyncio.sleep(0.1)
211
+ await self.client.close()
212
+ SDKLogger.info(f"dialog request logid: {self.client.logid}")
213
+ # 将下发的 PCM 数据按输出音频配置保存为 WAV 文件
214
+ save_audio_to_wav_file(self.audio_buffer, "output.wav")
215
+ except Exception as e:
216
+ SDKLogger.error(f"会话错误: {e}")
217
+ finally:
218
+ self.audio_device.cleanup()
219
+
220
+
221
+ def save_pcm_to_wav(pcm_data: bytes, filename: str) -> None:
222
+ """保存PCM数据为WAV文件"""
223
+ with wave.open(filename, 'wb') as wf:
224
+ wf.setnchannels(config.input_audio_config["channels"])
225
+ wf.setsampwidth(2) # paInt16 = 2 bytes
226
+ wf.setframerate(config.input_audio_config["sample_rate"])
227
+ wf.writeframes(pcm_data)
228
+
229
+
230
+ def save_audio_to_pcm_file(audio_data: bytes, filename: str) -> None:
231
+ """保存原始PCM音频数据到文件"""
232
+ if not audio_data:
233
+ SDKLogger.info("No audio data to save.")
234
+ return
235
+ try:
236
+ with open(filename, 'wb') as f:
237
+ f.write(audio_data)
238
+ except IOError as e:
239
+ SDKLogger.error(f"Failed to save pcm file: {e}")
240
+
241
+
242
+ def save_audio_to_wav_file(audio_data: bytes, filename: str) -> None:
243
+ """保存PCM格式音频数据为WAV文件(使用输出音频配置)"""
244
+ if not audio_data:
245
+ SDKLogger.info("No audio data to save.")
246
+ return
247
+ try:
248
+ with wave.open(filename, 'wb') as wf:
249
+ wf.setnchannels(config.output_audio_config["channels"])
250
+ # paFloat32 = 4 bytes per sample
251
+ wf.setsampwidth(4)
252
+ wf.setframerate(config.output_audio_config["sample_rate"])
253
+ wf.writeframes(audio_data)
254
+ except IOError as e:
255
+ SDKLogger.error(f"Failed to save wav file: {e}")
@@ -0,0 +1,48 @@
1
+ import uuid
2
+ import pyaudio
3
+
4
+ # 配置信息
5
+ ws_connect_config = {
6
+ "base_url": "wss://openspeech.bytedance.com/api/v3/realtime/dialogue",
7
+ "headers": {
8
+ "X-Api-App-ID": "",
9
+ "X-Api-Access-Key": "",
10
+ "X-Api-Resource-Id": "volc.speech.dialog", # 固定值
11
+ "X-Api-App-Key": "PlgvMymc7f3tQnJ6", # 固定值
12
+ "X-Api-Connect-Id": str(uuid.uuid4()),
13
+ }
14
+ }
15
+
16
+ start_session_req = {
17
+ "tts": {
18
+ "audio_config": {
19
+ "channel": 1,
20
+ "format": "pcm",
21
+ "sample_rate": 24000
22
+ },
23
+ },
24
+ "dialog": {
25
+ "bot_name": "鲁班",
26
+ "system_role": "你是一个充满活力的男生,性格开朗,热爱生活。",
27
+ "speaking_style": "你的说话风格简洁明了,语速适中,语调自然。",
28
+ "extra": {
29
+ "strict_audit": False
30
+ }
31
+ }
32
+ }
33
+
34
+ input_audio_config = {
35
+ "chunk": 3200,
36
+ "format": "pcm",
37
+ "channels": 1,
38
+ "sample_rate": 16000,
39
+ "bit_size": pyaudio.paInt16
40
+ }
41
+
42
+ output_audio_config = {
43
+ "chunk": 3200,
44
+ "format": "pcm",
45
+ "channels": 1,
46
+ "sample_rate": 24000,
47
+ "bit_size": pyaudio.paFloat32
48
+ }
@@ -0,0 +1,135 @@
1
+ import gzip
2
+ import json
3
+
4
+ PROTOCOL_VERSION = 0b0001
5
+ DEFAULT_HEADER_SIZE = 0b0001
6
+
7
+ PROTOCOL_VERSION_BITS = 4
8
+ HEADER_BITS = 4
9
+ MESSAGE_TYPE_BITS = 4
10
+ MESSAGE_TYPE_SPECIFIC_FLAGS_BITS = 4
11
+ MESSAGE_SERIALIZATION_BITS = 4
12
+ MESSAGE_COMPRESSION_BITS = 4
13
+ RESERVED_BITS = 8
14
+
15
+ # Message Type:
16
+ CLIENT_FULL_REQUEST = 0b0001
17
+ CLIENT_AUDIO_ONLY_REQUEST = 0b0010
18
+
19
+ SERVER_FULL_RESPONSE = 0b1001
20
+ SERVER_ACK = 0b1011
21
+ SERVER_ERROR_RESPONSE = 0b1111
22
+
23
+ # Message Type Specific Flags
24
+ NO_SEQUENCE = 0b0000 # no check sequence
25
+ POS_SEQUENCE = 0b0001
26
+ NEG_SEQUENCE = 0b0010
27
+ NEG_SEQUENCE_1 = 0b0011
28
+
29
+ MSG_WITH_EVENT = 0b0100
30
+
31
+ # Message Serialization
32
+ NO_SERIALIZATION = 0b0000
33
+ JSON = 0b0001
34
+ THRIFT = 0b0011
35
+ CUSTOM_TYPE = 0b1111
36
+
37
+ # Message Compression
38
+ NO_COMPRESSION = 0b0000
39
+ GZIP = 0b0001
40
+ CUSTOM_COMPRESSION = 0b1111
41
+
42
+
43
+ def generate_header(
44
+ version=PROTOCOL_VERSION,
45
+ message_type=CLIENT_FULL_REQUEST,
46
+ message_type_specific_flags=MSG_WITH_EVENT,
47
+ serial_method=JSON,
48
+ compression_type=GZIP,
49
+ reserved_data=0x00,
50
+ extension_header=bytes()
51
+ ):
52
+ """
53
+ protocol_version(4 bits), header_size(4 bits),
54
+ message_type(4 bits), message_type_specific_flags(4 bits)
55
+ serialization_method(4 bits) message_compression(4 bits)
56
+ reserved(8bits) 保留字段
57
+ header_extensions 扩展头(大小等于 8 * 4 * (header_size - 1) )
58
+ """
59
+ header = bytearray()
60
+ header_size = int(len(extension_header) / 4) + 1
61
+ header.append((version << 4) | header_size)
62
+ header.append((message_type << 4) | message_type_specific_flags)
63
+ header.append((serial_method << 4) | compression_type)
64
+ header.append(reserved_data)
65
+ header.extend(extension_header)
66
+ return header
67
+
68
+
69
+ def parse_response(res):
70
+ """
71
+ - header
72
+ - (4bytes)header
73
+ - (4bits)version(v1) + (4bits)header_size
74
+ - (4bits)messageType + (4bits)messageTypeFlags
75
+ -- 0001 CompleteClient | -- 0001 hasSequence
76
+ -- 0010 audioonly | -- 0010 isTailPacket
77
+ | -- 0100 hasEvent
78
+ - (4bits)payloadFormat + (4bits)compression
79
+ - (8bits) reserve
80
+ - payload
81
+ - [optional 4 bytes] event
82
+ - [optional] session ID
83
+ -- (4 bytes)session ID len
84
+ -- session ID data
85
+ - (4 bytes)data len
86
+ - data
87
+ """
88
+ if isinstance(res, str):
89
+ return {}
90
+ protocol_version = res[0] >> 4
91
+ header_size = res[0] & 0x0f
92
+ message_type = res[1] >> 4
93
+ message_type_specific_flags = res[1] & 0x0f
94
+ serialization_method = res[2] >> 4
95
+ message_compression = res[2] & 0x0f
96
+ reserved = res[3]
97
+ header_extensions = res[4:header_size * 4]
98
+ payload = res[header_size * 4:]
99
+ result = {}
100
+ payload_msg = None
101
+ payload_size = 0
102
+ start = 0
103
+ if message_type == SERVER_FULL_RESPONSE or message_type == SERVER_ACK:
104
+ result['message_type'] = 'SERVER_FULL_RESPONSE'
105
+ if message_type == SERVER_ACK:
106
+ result['message_type'] = 'SERVER_ACK'
107
+ if message_type_specific_flags & NEG_SEQUENCE > 0:
108
+ result['seq'] = int.from_bytes(payload[:4], "big", signed=False)
109
+ start += 4
110
+ if message_type_specific_flags & MSG_WITH_EVENT > 0:
111
+ result['event'] = int.from_bytes(payload[:4], "big", signed=False)
112
+ start += 4
113
+ payload = payload[start:]
114
+ session_id_size = int.from_bytes(payload[:4], "big", signed=True)
115
+ session_id = payload[4:session_id_size+4]
116
+ result['session_id'] = str(session_id)
117
+ payload = payload[4 + session_id_size:]
118
+ payload_size = int.from_bytes(payload[:4], "big", signed=False)
119
+ payload_msg = payload[4:]
120
+ elif message_type == SERVER_ERROR_RESPONSE:
121
+ code = int.from_bytes(payload[:4], "big", signed=False)
122
+ result['code'] = code
123
+ payload_size = int.from_bytes(payload[4:8], "big", signed=False)
124
+ payload_msg = payload[8:]
125
+ if payload_msg is None:
126
+ return result
127
+ if message_compression == GZIP:
128
+ payload_msg = gzip.decompress(payload_msg)
129
+ if serialization_method == JSON:
130
+ payload_msg = json.loads(str(payload_msg, "utf-8"))
131
+ elif serialization_method != NO_SERIALIZATION:
132
+ payload_msg = str(payload_msg, "utf-8")
133
+ result['payload_msg'] = payload_msg
134
+ result['payload_size'] = payload_size
135
+ return result
@@ -0,0 +1,164 @@
1
+ import websockets
2
+ import gzip
3
+ import json
4
+
5
+ from typing import Dict, Any
6
+
7
+ from kuavo_humanoid_sdk.common.logger import SDKLogger
8
+ from kuavo_humanoid_sdk.kuavo.core.llm_doubao_lib import protocol, config
9
+
10
+
11
+ class RealtimeDialogClient:
12
+ def __init__(self, config: Dict[str, Any], session_id: str):
13
+ self.config = config
14
+ self.logid = ""
15
+ self.session_id = session_id
16
+ self.ws = None
17
+
18
+ async def start_connection(self) -> bool:
19
+ """建立WebSocket连接"""
20
+ try:
21
+ self.ws = await websockets.connect(
22
+ self.config['base_url'],
23
+ extra_headers=self.config['headers'],
24
+ ping_interval=None
25
+ )
26
+ self.logid = self.ws.response_headers.get("X-Tt-Logid")
27
+ SDKLogger.info(f"dialog server response logid: {self.logid}")
28
+
29
+ # StartConnection request
30
+ start_connection_request = bytearray(protocol.generate_header())
31
+ start_connection_request.extend(int(1).to_bytes(4, 'big'))
32
+ payload_bytes = str.encode("{}")
33
+ payload_bytes = gzip.compress(payload_bytes)
34
+ start_connection_request.extend((len(payload_bytes)).to_bytes(4, 'big'))
35
+ start_connection_request.extend(payload_bytes)
36
+ await self.ws.send(start_connection_request)
37
+ response = await self.ws.recv()
38
+ parsed_response = protocol.parse_response(response)
39
+ SDKLogger.info(f"StartConnection response: {parsed_response}")
40
+
41
+ if parsed_response.get('event') == 50:
42
+ return True
43
+ else:
44
+ return False
45
+
46
+ except websockets.exceptions.InvalidStatusCode as e:
47
+ if e.status_code == 401:
48
+ SDKLogger.error(f"WebSocket authentication failed: HTTP {e.status_code} - App ID or Access Key error")
49
+ else:
50
+ SDKLogger.error(f"WebSocket connection failed: HTTP {e.status_code} - {e}")
51
+ return False
52
+
53
+ except websockets.exceptions.ConnectionClosedError as e:
54
+ SDKLogger.error(f"WebSocket connection closed: {e}")
55
+ return False
56
+
57
+ except websockets.exceptions.WebSocketException as e:
58
+ SDKLogger.error(f"WebSocket connection error: {e}")
59
+ return False
60
+
61
+ except Exception as e:
62
+ SDKLogger.error(f"Failed to establish WebSocket connection: {e}")
63
+ return False
64
+
65
+ async def start_session(self) -> None:
66
+ """开启对话任务"""
67
+ # StartSession request
68
+ request_params = config.start_session_req
69
+ payload_bytes = str.encode(json.dumps(request_params))
70
+ payload_bytes = gzip.compress(payload_bytes)
71
+ start_session_request = bytearray(protocol.generate_header())
72
+ start_session_request.extend(int(100).to_bytes(4, 'big'))
73
+ start_session_request.extend((len(self.session_id)).to_bytes(4, 'big'))
74
+ start_session_request.extend(str.encode(self.session_id))
75
+ start_session_request.extend((len(payload_bytes)).to_bytes(4, 'big'))
76
+ start_session_request.extend(payload_bytes)
77
+ await self.ws.send(start_session_request)
78
+ response = await self.ws.recv()
79
+ SDKLogger.info(f"StartSession response: {protocol.parse_response(response)}")
80
+
81
+ async def say_hello(self) -> None:
82
+ """发送Hello消息"""
83
+ payload = {
84
+ "content": "你好,我是鲁班,有什么可以帮助你的?",
85
+ }
86
+ hello_request = bytearray(protocol.generate_header())
87
+ hello_request.extend(int(300).to_bytes(4, 'big'))
88
+ payload_bytes = str.encode(json.dumps(payload))
89
+ payload_bytes = gzip.compress(payload_bytes)
90
+ hello_request.extend((len(self.session_id)).to_bytes(4, 'big'))
91
+ hello_request.extend(str.encode(self.session_id))
92
+ hello_request.extend((len(payload_bytes)).to_bytes(4, 'big'))
93
+ hello_request.extend(payload_bytes)
94
+ await self.ws.send(hello_request)
95
+
96
+ async def chat_tts_text(self, is_user_querying: bool, start: bool, end: bool, content: str) -> None:
97
+ if is_user_querying:
98
+ return
99
+ """发送Chat TTS Text消息"""
100
+ payload = {
101
+ "start": start,
102
+ "end": end,
103
+ "content": content,
104
+ }
105
+ SDKLogger.info(f"ChatTTSTextRequest payload: {payload}")
106
+ payload_bytes = str.encode(json.dumps(payload))
107
+ payload_bytes = gzip.compress(payload_bytes)
108
+
109
+ chat_tts_text_request = bytearray(protocol.generate_header())
110
+ chat_tts_text_request.extend(int(500).to_bytes(4, 'big'))
111
+ chat_tts_text_request.extend((len(self.session_id)).to_bytes(4, 'big'))
112
+ chat_tts_text_request.extend(str.encode(self.session_id))
113
+ chat_tts_text_request.extend((len(payload_bytes)).to_bytes(4, 'big'))
114
+ chat_tts_text_request.extend(payload_bytes)
115
+ await self.ws.send(chat_tts_text_request)
116
+
117
+ async def task_request(self, audio: bytes) -> None:
118
+ task_request = bytearray(
119
+ protocol.generate_header(message_type=protocol.CLIENT_AUDIO_ONLY_REQUEST,
120
+ serial_method=protocol.NO_SERIALIZATION))
121
+ task_request.extend(int(200).to_bytes(4, 'big'))
122
+ task_request.extend((len(self.session_id)).to_bytes(4, 'big'))
123
+ task_request.extend(str.encode(self.session_id))
124
+ payload_bytes = gzip.compress(audio)
125
+ task_request.extend((len(payload_bytes)).to_bytes(4, 'big')) # payload size(4 bytes)
126
+ task_request.extend(payload_bytes)
127
+ await self.ws.send(task_request)
128
+
129
+ async def receive_server_response(self) -> Dict[str, Any]:
130
+ try:
131
+ response = await self.ws.recv()
132
+ data = protocol.parse_response(response)
133
+ return data
134
+ except Exception as e:
135
+ SDKLogger.error(f"Failed to receive message: {e}")
136
+ return None
137
+
138
+ async def finish_session(self):
139
+ finish_session_request = bytearray(protocol.generate_header())
140
+ finish_session_request.extend(int(102).to_bytes(4, 'big'))
141
+ payload_bytes = str.encode("{}")
142
+ payload_bytes = gzip.compress(payload_bytes)
143
+ finish_session_request.extend((len(self.session_id)).to_bytes(4, 'big'))
144
+ finish_session_request.extend(str.encode(self.session_id))
145
+ finish_session_request.extend((len(payload_bytes)).to_bytes(4, 'big'))
146
+ finish_session_request.extend(payload_bytes)
147
+ await self.ws.send(finish_session_request)
148
+
149
+ async def finish_connection(self):
150
+ finish_connection_request = bytearray(protocol.generate_header())
151
+ finish_connection_request.extend(int(2).to_bytes(4, 'big'))
152
+ payload_bytes = str.encode("{}")
153
+ payload_bytes = gzip.compress(payload_bytes)
154
+ finish_connection_request.extend((len(payload_bytes)).to_bytes(4, 'big'))
155
+ finish_connection_request.extend(payload_bytes)
156
+ await self.ws.send(finish_connection_request)
157
+ response = await self.ws.recv()
158
+ SDKLogger.info(f"FinishConnection response: {protocol.parse_response(response)}")
159
+
160
+ async def close(self) -> None:
161
+ """关闭WebSocket连接"""
162
+ if self.ws:
163
+ SDKLogger.info(f"Closing WebSocket connection...")
164
+ await self.ws.close()