new
This commit is contained in:
81
main.py
81
main.py
@@ -406,89 +406,32 @@ def main():
|
||||
if display.tft:
|
||||
display.init_ui()
|
||||
|
||||
# 停止录音并等待回放
|
||||
# 停止录音并通知服务器
|
||||
if ws:
|
||||
try:
|
||||
print(">>> Sending STOP & Waiting for playback...")
|
||||
print(">>> Sending STOP to server...")
|
||||
ws.send("STOP_RECORDING")
|
||||
|
||||
# 重新初始化 Speaker (16kHz Mono 16-bit)
|
||||
if speaker.i2s:
|
||||
cfg = speaker.config
|
||||
speaker.i2s.deinit()
|
||||
speaker.i2s = machine.I2S(
|
||||
0,
|
||||
sck=machine.Pin(cfg['bck']),
|
||||
ws=machine.Pin(cfg['ws']),
|
||||
sd=machine.Pin(cfg['sd']),
|
||||
mode=machine.I2S.TX,
|
||||
bits=16,
|
||||
format=machine.I2S.MONO,
|
||||
rate=16000,
|
||||
ibuf=40000,
|
||||
)
|
||||
|
||||
# 接收回放循环
|
||||
playback_timeout = 5000 # 5秒无数据则退出
|
||||
last_data_time = time.ticks_ms()
|
||||
|
||||
while True:
|
||||
# Check for data with timeout
|
||||
# 不再等待回放,直接退出录音状态
|
||||
# 稍微等待一下可能的最后 ASR 结果 (非阻塞)
|
||||
# 等待 500ms 接收剩余的 ASR 结果
|
||||
t_wait = time.ticks_add(time.ticks_ms(), 500)
|
||||
while time.ticks_diff(t_wait, time.ticks_ms()) > 0:
|
||||
poller = uselect.poll()
|
||||
poller.register(ws.sock, uselect.POLLIN)
|
||||
events = poller.poll(100) # 100ms wait
|
||||
|
||||
events = poller.poll(100)
|
||||
if events:
|
||||
msg = ws.recv()
|
||||
last_data_time = time.ticks_ms()
|
||||
|
||||
if isinstance(msg, str):
|
||||
if msg == "START_PLAYBACK":
|
||||
print(">>> Server starting playback stream...")
|
||||
continue
|
||||
elif msg == "STOP_PLAYBACK":
|
||||
print(">>> Server finished playback.")
|
||||
break
|
||||
elif msg.startswith("ASR:"):
|
||||
print_nice_asr(msg[4:], display)
|
||||
|
||||
elif isinstance(msg, bytes):
|
||||
# 播放接收到的音频数据
|
||||
if speaker.i2s:
|
||||
# 使用 try-except 防止 write 阻塞导致的问题
|
||||
try:
|
||||
speaker.i2s.write(msg)
|
||||
except Exception as e:
|
||||
print(f"I2S Write Error: {e}")
|
||||
|
||||
elif msg is None:
|
||||
print("WS Connection closed or error (recv returned None)")
|
||||
try:
|
||||
ws.close()
|
||||
except:
|
||||
pass
|
||||
ws = None
|
||||
break
|
||||
else:
|
||||
# No data received in this poll window
|
||||
if time.ticks_diff(time.ticks_ms(), last_data_time) > playback_timeout:
|
||||
print("Playback timeout - no data received for 5 seconds")
|
||||
break
|
||||
|
||||
# Feed watchdog or do other small tasks if needed
|
||||
# time.sleep(0.01)
|
||||
|
||||
if isinstance(msg, str) and msg.startswith("ASR:"):
|
||||
print_nice_asr(msg[4:], display)
|
||||
# 不需要处理其他类型的消息了
|
||||
except Exception as e:
|
||||
print(f"Playback loop error: {e}")
|
||||
print(f"Stop recording error: {e}")
|
||||
try:
|
||||
ws.close()
|
||||
except:
|
||||
pass
|
||||
ws = None
|
||||
|
||||
# 恢复 Speaker 原始配置
|
||||
if speaker.i2s: speaker.i2s.deinit()
|
||||
speaker._init_audio()
|
||||
|
||||
gc.collect()
|
||||
|
||||
|
||||
Reference in New Issue
Block a user