xiaozhi-sdk 0.2.7__tar.gz → 0.2.8__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 (40) hide show
  1. {xiaozhi_sdk-0.2.7/xiaozhi_sdk.egg-info → xiaozhi_sdk-0.2.8}/PKG-INFO +1 -1
  2. {xiaozhi_sdk-0.2.7 → xiaozhi_sdk-0.2.8}/pyproject.toml +0 -2
  3. {xiaozhi_sdk-0.2.7 → xiaozhi_sdk-0.2.8}/xiaozhi_sdk/__init__.py +1 -1
  4. {xiaozhi_sdk-0.2.7 → xiaozhi_sdk-0.2.8}/xiaozhi_sdk/cli.py +17 -10
  5. {xiaozhi_sdk-0.2.7 → xiaozhi_sdk-0.2.8/xiaozhi_sdk.egg-info}/PKG-INFO +1 -1
  6. {xiaozhi_sdk-0.2.7 → xiaozhi_sdk-0.2.8}/LICENSE +0 -0
  7. {xiaozhi_sdk-0.2.7 → xiaozhi_sdk-0.2.8}/MANIFEST.in +0 -0
  8. {xiaozhi_sdk-0.2.7 → xiaozhi_sdk-0.2.8}/README.md +0 -0
  9. {xiaozhi_sdk-0.2.7 → xiaozhi_sdk-0.2.8}/file/audio/16k_greet.wav +0 -0
  10. {xiaozhi_sdk-0.2.7 → xiaozhi_sdk-0.2.8}/file/audio/16k_play_music.wav +0 -0
  11. {xiaozhi_sdk-0.2.7 → xiaozhi_sdk-0.2.8}/file/audio/16k_say_hello.wav +0 -0
  12. {xiaozhi_sdk-0.2.7 → xiaozhi_sdk-0.2.8}/file/audio/16k_take_photo.wav +0 -0
  13. {xiaozhi_sdk-0.2.7 → xiaozhi_sdk-0.2.8}/file/audio/test_16k.wav +0 -0
  14. {xiaozhi_sdk-0.2.7 → xiaozhi_sdk-0.2.8}/file/audio/test_24k.wav +0 -0
  15. {xiaozhi_sdk-0.2.7 → xiaozhi_sdk-0.2.8}/file/audio/test_48k.wav +0 -0
  16. {xiaozhi_sdk-0.2.7 → xiaozhi_sdk-0.2.8}/file/image/leijun.jpg +0 -0
  17. {xiaozhi_sdk-0.2.7 → xiaozhi_sdk-0.2.8}/file/opus/linux-arm64-libopus.so +0 -0
  18. {xiaozhi_sdk-0.2.7 → xiaozhi_sdk-0.2.8}/file/opus/linux-x64-libopus.so +0 -0
  19. {xiaozhi_sdk-0.2.7 → xiaozhi_sdk-0.2.8}/file/opus/macos-arm64-libopus.dylib +0 -0
  20. {xiaozhi_sdk-0.2.7 → xiaozhi_sdk-0.2.8}/file/opus/macos-x64-libopus.dylib +0 -0
  21. {xiaozhi_sdk-0.2.7 → xiaozhi_sdk-0.2.8}/file/opus/windows-opus.dll +0 -0
  22. {xiaozhi_sdk-0.2.7 → xiaozhi_sdk-0.2.8}/setup.cfg +0 -0
  23. {xiaozhi_sdk-0.2.7 → xiaozhi_sdk-0.2.8}/tests/test_iot.py +0 -0
  24. {xiaozhi_sdk-0.2.7 → xiaozhi_sdk-0.2.8}/tests/test_pic.py +0 -0
  25. {xiaozhi_sdk-0.2.7 → xiaozhi_sdk-0.2.8}/tests/test_wake_word.py +0 -0
  26. {xiaozhi_sdk-0.2.7 → xiaozhi_sdk-0.2.8}/tests/test_xiaozhi.py +0 -0
  27. {xiaozhi_sdk-0.2.7 → xiaozhi_sdk-0.2.8}/tests/test_xiaozhi_opus.py +0 -0
  28. {xiaozhi_sdk-0.2.7 → xiaozhi_sdk-0.2.8}/xiaozhi_sdk/__main__.py +0 -0
  29. {xiaozhi_sdk-0.2.7 → xiaozhi_sdk-0.2.8}/xiaozhi_sdk/config.py +0 -0
  30. {xiaozhi_sdk-0.2.7 → xiaozhi_sdk-0.2.8}/xiaozhi_sdk/core.py +0 -0
  31. {xiaozhi_sdk-0.2.7 → xiaozhi_sdk-0.2.8}/xiaozhi_sdk/iot.py +0 -0
  32. {xiaozhi_sdk-0.2.7 → xiaozhi_sdk-0.2.8}/xiaozhi_sdk/mcp.py +0 -0
  33. {xiaozhi_sdk-0.2.7 → xiaozhi_sdk-0.2.8}/xiaozhi_sdk/opus.py +0 -0
  34. {xiaozhi_sdk-0.2.7 → xiaozhi_sdk-0.2.8}/xiaozhi_sdk/utils/__init__.py +0 -0
  35. {xiaozhi_sdk-0.2.7 → xiaozhi_sdk-0.2.8}/xiaozhi_sdk/utils/mcp_tool.py +0 -0
  36. {xiaozhi_sdk-0.2.7 → xiaozhi_sdk-0.2.8}/xiaozhi_sdk/utils/tool_func.py +0 -0
  37. {xiaozhi_sdk-0.2.7 → xiaozhi_sdk-0.2.8}/xiaozhi_sdk.egg-info/SOURCES.txt +0 -0
  38. {xiaozhi_sdk-0.2.7 → xiaozhi_sdk-0.2.8}/xiaozhi_sdk.egg-info/dependency_links.txt +0 -0
  39. {xiaozhi_sdk-0.2.7 → xiaozhi_sdk-0.2.8}/xiaozhi_sdk.egg-info/requires.txt +0 -0
  40. {xiaozhi_sdk-0.2.7 → xiaozhi_sdk-0.2.8}/xiaozhi_sdk.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: xiaozhi-sdk
3
- Version: 0.2.7
3
+ Version: 0.2.8
4
4
  Summary: 一个用于连接和控制小智智能设备的Python SDK,支持实时音频通信、MCP工具集成和设备管理功能。
5
5
  Author-email: dairoot <623815825@qq.com>
6
6
  License-Expression: MIT
@@ -66,5 +66,3 @@ omit = [
66
66
  "xiaozhi_sdk/cli.py",
67
67
  "tests/*",
68
68
  ]
69
-
70
-
@@ -1,3 +1,3 @@
1
- __version__ = "0.2.7"
1
+ __version__ = "0.2.8"
2
2
 
3
3
  from xiaozhi_sdk.core import XiaoZhiWebsocket # noqa
@@ -4,6 +4,7 @@ import logging
4
4
  import time
5
5
  import uuid
6
6
  from collections import deque
7
+ from tkinter import NO
7
8
  from typing import Optional
8
9
 
9
10
  import click
@@ -76,7 +77,8 @@ logger.setLevel(logging.DEBUG)
76
77
 
77
78
  # 全局状态
78
79
  input_audio_buffer: deque[bytes] = deque()
79
- is_playing_audio = False
80
+ device_stauts = "listen" # "speak" or "listen"
81
+
80
82
  is_end = False
81
83
  human_speak_time = None
82
84
 
@@ -109,7 +111,7 @@ def get_image_byte(data):
109
111
 
110
112
 
111
113
  async def handle_message(message):
112
- global is_playing_audio
114
+ global device_stauts
113
115
  global human_speak_time
114
116
 
115
117
  """处理接收到的消息"""
@@ -122,11 +124,11 @@ async def handle_message(message):
122
124
  logger.info1("human: %s", message["text"])
123
125
 
124
126
  elif message["type"] == "tts" and message["state"] == "sentence_start": # AI语音
125
- is_playing_audio = True # 防止打断
127
+ device_stauts = "speak" # 防止打断
126
128
  logger.info2("AI: %s", message["text"])
127
129
 
128
130
  elif message["type"] == "tts" and message["state"] == "stop":
129
- is_playing_audio = False
131
+ device_stauts = "listen"
130
132
  # logger.info2("播放结束")
131
133
  logger.info("聆听中...")
132
134
  elif message["type"] == "llm": # 表情
@@ -141,27 +143,33 @@ async def handle_message(message):
141
143
 
142
144
  async def play_assistant_audio(audio_queue: deque[bytes], enable_audio, audio_samplerate):
143
145
  """播放音频流"""
144
- global is_playing_audio
146
+ global device_stauts
145
147
  global human_speak_time
146
148
 
147
149
  stream = None
148
150
  if enable_audio:
149
151
  stream = sd.OutputStream(samplerate=audio_samplerate, channels=INPUT_AUDIO_CHANNELS, dtype=np.int16)
150
152
  stream.start()
153
+
151
154
  last_audio_time = None
152
155
 
153
156
  while True:
154
157
  if is_end:
155
158
  return
156
159
 
160
+ if device_stauts == "listen":
161
+ last_audio_time = None
162
+
157
163
  if not audio_queue:
158
- if last_audio_time and time.time() - last_audio_time > 2:
159
- last_audio_time = time.time()
160
- is_playing_audio = False
164
+ # 空音频 超过 2s ,将device_stauts 设置为listen,代表聆听中
165
+ if device_stauts == "speak" and last_audio_time and time.time() - last_audio_time > 2:
166
+ device_stauts = "listen"
161
167
 
162
168
  await asyncio.sleep(0.01)
163
169
  continue
164
170
 
171
+ last_audio_time = time.time()
172
+
165
173
  if human_speak_time:
166
174
  logger.debug("首个音频包响应时间:%s 秒", time.time() - human_speak_time)
167
175
  human_speak_time = None
@@ -169,7 +177,6 @@ async def play_assistant_audio(audio_queue: deque[bytes], enable_audio, audio_sa
169
177
  pcm_data = audio_queue.popleft()
170
178
  if stream:
171
179
  stream.write(pcm_data)
172
- last_audio_time = time.time()
173
180
 
174
181
 
175
182
  class XiaoZhiClient:
@@ -225,7 +232,7 @@ class XiaoZhiClient:
225
232
  continue
226
233
 
227
234
  pcm_data = input_audio_buffer.popleft()
228
- if not is_playing_audio:
235
+ if device_stauts == "listen":
229
236
 
230
237
  await self.xiaozhi.send_audio(pcm_data)
231
238
  else:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: xiaozhi-sdk
3
- Version: 0.2.7
3
+ Version: 0.2.8
4
4
  Summary: 一个用于连接和控制小智智能设备的Python SDK,支持实时音频通信、MCP工具集成和设备管理功能。
5
5
  Author-email: dairoot <623815825@qq.com>
6
6
  License-Expression: MIT
File without changes
File without changes
File without changes
File without changes