self.led_blue.write(0)
self.led_green.write(0)
-audio_buf = ['IMEIhao', 'jianquancuowu', 'key_prompt', 'liuliangtishi', 'Low_power_warning', 'R_CHARGE_FULL', 'R_CHARGE_IN',
- 'R_CHARGE_OUT', 'R_READ_TIME_0', 'R_READ_TIME_1', 'R_READ_TIME_2', 'R_READ_TIME_3', 'R_READ_TIME_4', 'R_READ_TIME_5',
- 'R_READ_TIME_6', 'R_READ_TIME_7', 'R_READ_TIME_8', 'R_READ_TIME_9', 'R_READ_TIME_A', 'R_READ_TIME_B', 'R_READ_TIME_C',
- 'R_READ_TIME_D', 'R_READ_TIME_E', 'R_READ_TIME_F', 'R_READ_TIME_G', 'R_READ_TIME_H', 'R_READ_TIME_I',
- 'R_READ_TIME_J', 'R_READ_TIME_K', 'R_READ_TIME_L', 'R_READ_TIME_M', 'R_READ_TIME_N', 'R_READ_TIME_O', 'R_READ_TIME_P',
- 'R_READ_TIME_Q', 'R_READ_TIME_R', 'R_READ_TIME_S', 'R_READ_TIME_T', 'R_READ_TIME_U', 'R_READ_TIME_V', 'R_READ_TIME_W',
- 'R_READ_TIME_X', 'R_READ_TIME_Y', 'R_READ_TIME_Z', 'shouhou', 'xinhaoruo1', 'zhengzaiguanji']
+audio_buf = ['didianguanji', 'IMEIhao', 'jianquancuowu', 'key_prompt', 'liuliangtishi', 'Low_power_warning', 'R_CHARGE_FULL', 'R_CHARGE_IN', 'R_CHARGE_OUT', 'R_READ_TIME_0', 'R_READ_TIME_1', 'R_READ_TIME_2', 'R_READ_TIME_3', 'R_READ_TIME_4', 'R_READ_TIME_5', 'R_READ_TIME_6', 'R_READ_TIME_7', 'R_READ_TIME_8', 'R_READ_TIME_9', 'R_READ_TIME_A', 'R_READ_TIME_B', 'R_READ_TIME_C', 'R_READ_TIME_D', 'R_READ_TIME_E', 'R_READ_TIME_F', 'R_READ_TIME_G', 'R_READ_TIME_H', 'R_READ_TIME_I', 'R_READ_TIME_J', 'R_READ_TIME_K', 'R_READ_TIME_L', 'R_READ_TIME_M', 'R_READ_TIME_N', 'R_READ_TIME_O', 'R_READ_TIME_P', 'R_READ_TIME_Q', 'R_READ_TIME_R', 'R_READ_TIME_S', 'R_READ_TIME_T', 'R_READ_TIME_U', 'R_READ_TIME_V', 'R_READ_TIME_W', 'R_READ_TIME_X', 'R_READ_TIME_Y', 'R_READ_TIME_Z', 'shouhou', 'xinhaoruo1', 'zhengzaiguanji']
class AI_dev(Abstract):
# AI
def __init__(self):
self.is_wdt = 1 #是否开启看门狗
- self.VBATT_tab = {"charge_full":4300,"100" :4250 , "90":3994 , "80":3883, "60": 3707, "40":3604, "20":3537, "10":3486,}
+ self.VBATT_tab = {"charge_full":4300,"100" :4250 , "90":3994 , "80":3883, "60": 3707, "40":3604, "20":3537, "10":3486,"5":3400,}
self.KeyAI_status = 0
self.KeyAI_timer_count = 0
self.KeyAI_long_press = 0
self.usb.setCallback(self.usb_event_cb)
self.usb_status = self.usb.getStatus()
self.usb_charge_flag = 0
+ self.Low_power_warning_timer = 0
self.AI_dev_timer = osTimer()
self.AI_dev_timer.start(10000, 1, self.AI_dev_timer_cb)
print("AI_dev:AI_dev_timer")
self.aud = audio.Audio(0)
+ self.Low_power_warning_flag = 0
self.VC_TTS_volume = EventMesh.publish("get_storage_config","VC_TTS_volume")#音量配置
if self.VC_TTS_volume == None:
self.VC_TTS_volume = 100
#self.aud.play(1,1,'U:/static/R_CHARGE_IN.mp3')
EventMesh.publish("open_led_red")#充电红灯常亮
EventMesh.publish("audio_montage_play",["R_CHARGE_IN.mp3"])
+ self.Low_power_warning_flag = 0
pass
elif status == 0:#拨出usbs
self.usb_status = 0
#self.aud.play(1,0,'U:/static/zhengzaiguanji.mp3')#关机音频
EventMesh.publish("open_led_red")
utime.sleep_ms(2000)
+ self.aud.stopPlayStream()
+ self.aud.stopAll()
Power.powerDown()
#print("AI_key_release")
EventMesh.publish("pwk_key_long_press")
#self.aud.play(1,0,'U:/static/zhengzaiguanji.mp3')#关机音频
EventMesh.publish("open_led_red")
utime.sleep_ms(3000)
+ self.aud.stopPlayStream()
+ self.aud.stopAll()
Power.powerDown()
#print("AI_key_release")
EventMesh.publish("pwk_key_long_press")
EventMesh.publish("audio_montage_play",["R_CHARGE_FULL.mp3"])
#self.aud.play(1,0,'U:/static/R_CHARGE_FULL.mp3')#充电已满
self.usb_charge_flag = 1
- if self.usb_status == 0 and Vbatt<self.VBATT_tab["20"]and VC_satrt_flag == 0:#低电报警
+ if self.usb_status == 0 and Vbatt<self.VBATT_tab["20"]and VC_satrt_flag == 0 and self.Low_power_warning_flag ==0:#低电报警
+ self.Low_power_warning_flag = 1
EventMesh.publish("flicker_led_red")
#self.aud.play(1,0,'Low_power_warning.mp3')
- if self.usb_charge_flag == 0 :
+ self.Low_power_warning_timer+=1
+ if self.Low_power_warning_timer >= 2:
+ self.Low_power_warning_timer = 0
EventMesh.publish("audio_montage_play",["Low_power_warning.mp3"])
- self.usb_charge_flag = 1
+
+ if self.usb_status == 0 and Vbatt<self.VBATT_tab["5"]:
+ EventMesh.publish("audio_montage_play",["didianguanji.mp3"])
+ utime.sleep_ms(4500)
+ self.aud.stopPlayStream()
+ self.aud.stopAll()
+ Power.powerDown()
+
self.check_rest_timer_count += 1
if self.check_rest_timer_count >= 8640:#24小时没按键,则关机
self.pwk_key_Long_Press()
self.pid = "cqxJZi5CNgzjS3mX21Zw"
self.dev_res_timer = osTimer()
- self.dev_res_timer.start(10000, 1, self.dev_timer_cb)
+ self.dev_res_timer.start(20000, 1, self.dev_timer_cb)
self.dev_res_timerCount = 0
self.ud_token_timer = osTimer()
self.ud_token_timer.start(10000, 1, self.ud_token_timer_cb)
# self.dev_active() #设备激活
# self.dev_sign_in() #设备登入
self.dev_res_timerCount+=1
- if self.dev_res_timerCount > 6: #开机一分钟内没有获取到密码和token 等下一次更新令牌在走登入 激活流程
+ if self.dev_res_timerCount > 3: #开机一分钟内没有获取到密码和token 等下一次更新令牌在走登入 激活流程
self.dev_res_timerCount=0
self.dev_res_timer.stop()
except Exception as e:
battery = EventMesh.publish("get_battery")
if battery>=40:
self.ota_timer = osTimer()
- self.ota_timer.start(8000, 0, self.ota_timer_cb)
+ self.ota_timer.start(15000, 0, self.ota_timer_cb)
ret_str = 1
else:
ret_str = 2
self.play_fd = None
self.is_VC_ACK = 0 #是否开启ack应答模式
self.ai_OTA = OTA()
- self.is_auth = 1 #是否开启dmp鉴权
+ self.is_auth = 0 #是否开启dmp鉴权
#self.VC_mode = 0 #0:短按连续问答模式 1:长按录音模式
self.VC_mode = EventMesh.publish("get_storage_config","VC_mode")#
if self.VC_mode == None :
self.VC_mode = 0
- self.VC_server = 2 #0正式服务器,1:测试服务器1,2:测试服务器2
+ self.VC_server = 0 #0正式服务器,1:测试服务器1,2:测试服务器2
self.server_ip = EventMesh.publish("get_storage_config","server_ip")#
if self.server_ip == None:
if self.VC_server == 1:#
- self.server_ip="118.145.158.207:22082"
+ self.server_ip="118.145.158.207:22084"
elif self.VC_server == 2:#
self.server_ip="118.145.158.207:22082"
else:
if dev_type == "G10":
self.power_on_tone = "已开机,您好!我是北科瑞讯智能 AI bot_name"
else:
- self.power_on_tone = "æ\82¨å¥½ï¼\81æ\88\91æ\98¯æ\9f\92ç\89\8cç\94·è£\85AIç\94\9f活好帮æ\89\8b-bot_nameï¼\8c å¾\88é«\98å\85´ä¸ºæ\82¨æ\9c\8då\8a¡ï¼\8cæ\88\91å\8f¯ä»¥å¸®æ\82¨è§£ç\94æ\97¥å¸¸ç\94\9fæ´»ã\80\81å·¥ä½\9cï¼\8cæ\97\85游信æ\81¯ã\80\81å\81¥åº·å\92¨è¯¢ã\80\81æ\95\99è\82²ä¸\8eå¦ä¹ ã\80\81æ\83\85æ\84\9f交æµ\81ã\80\81å\85¨ç\90\83èµ\84讯等问题!请问您有什么需要我帮忙的吗?"
+ self.power_on_tone = "æ\82¨å¥½ï¼\81æ\88\91æ\98¯æ\9f\92ç\89\8cç\94·è£\85AIç\94\9f活好帮æ\89\8b-bot_nameï¼\8c å¾\88é«\98å\85´ä¸ºæ\82¨æ\9c\8då\8a¡ï¼\8cæ\88\91å\8f¯ä»¥å¸®æ\82¨è§£ç\94æ\9f\92ç\89\8cå\85¬å\8f¸ç\9f¥è¯\86åº\93ã\80\81æ\97¥å¸¸ç\94\9fæ´»ä¸\8eå·¥ä½\9cã\80\81æ\97\85游信æ\81¯ã\80\81å\81¥åº·ä¸\8eè¿\90å\8a¨å\92¨è¯¢ã\80\81æ\95\99è\82²ä¸\8eå¦ä¹ ã\80\81æ\83\85æ\84\9f交æµ\81ã\80\81å\85¨ç\90\83èµ\84讯ã\80\81ä¸\96ç\95\8cæ\96\87å\8c\96等问题!请问您有什么需要我帮忙的吗?"
#"已开机,这是升级测试前软件,可说查询版本来确认当前版本号,可说OTA升级来触发在线升级"#
self.VC_record_TYPE = VC_record_TYPE_PCM #0:PCM 1:AMR
self.VC_play_TYPE = VC_play_TYPE_PCM #0:PCM 1:mp3
self.Audio_buf_size = 16*1024
self.record = audio.Record()
#self.record.end_callback(self.record_callback)
- #self.record.gain_set(4,10)
- self.record.gain_set(4,12)
+ self.record.gain_set(4,10)
+ #self.record.gain_set(4,12)
self.aud = audio.Audio(0)
self.aud.setCallback(self.audio_cb)
#self.aud.setVolume(self.VC_TTS_volume //10)
print("[Errno 22] EINVAL!!!\r\n")
print("[Errno 22] EINVAL!!!\r\n")
print("[Errno 22] EINVAL!!!\r\n")
- # EventMesh.publish("set_storage_config",["powerRestart",1])#调试临时关闭
- # utime.sleep_ms(1000)
- # self.aud.stopPlayStream()
- # self.aud.stopAll()
- # Power.powerRestart()
+ EventMesh.publish("set_storage_config",["powerRestart",1])#调试临时关闭
+ utime.sleep_ms(1000)
+ self.aud.stopPlayStream()
+ self.aud.stopAll()
+ Power.powerRestart()
self.websocket_error()
return
self.AI_client_asr_debug+=1
utime.sleep_ms(10)
- #self.AI_client_asr.settimeout(6)
+ self.AI_client_asr.settimeout(120)
#开启发送线程
if self.AI_ASR_send_data_queue_thread_id == 0:
_thread.stack_size(self.Audio_buf_size+8*1024)
self.VC_record_state_flag = 2
self.VC_state = VC_State_SpeechStart
EventMesh.publish("open_led_blue")
+ self.AI_ASR_error_timeout = 0
pass
elif jsload_data["event"] == "Changed" or jsload_data["event"] == "SentenceEnd" : #开始录音Changed
usys.print_exception(e)
except Exception as e:
- error_str = str(e)
- print("ASR ASR:e:{}".format(error_str))
- #usys.print_exception(e)
- if error_str.find("[Errno 110]")!= -1:
- #print("ASR ASR:recv TIMEDOUT 正常")
- pass
- else:
+ # error_str = str(e)
+ # print("ASR ASR:e:{}".format(error_str))
+ # #usys.print_exception(e)
+ # if error_str.find("[Errno 110]")!= -1:
+ # #print("ASR ASR:recv TIMEDOUT 正常")
+ # pass
+ # else:
usys.print_exception(e)
print("{}".format(cli))
#self.websocket_error()
json_data["payload"]["format"]='amr'
pass
-
+ self.AI_ASR_error_timeout = 5
self.AI_client_asr_send(ujson.dumps(json_data))
#ASR终止
def AI_client_asr_StopTranscription_requset(self):
#print("VC_record_thread:{}".format(Record_len))
if Record_len > 0:
read_buf = bytes(Record_read_buf[:Record_len])
- if self.record_fd != None:
- self.record_fd.write(read_buf)
- print("write record:{}".format(len(read_buf)))
+ if self.record_data_save_flag == 1:
+ if self.record_fd == None:
+ try:
+ uos.remove('/usr/record_data.pcm')
+ except Exception as e:
+ usys.print_exception(e)
+ self.record_fd = open('/usr/record_data.pcm','w')
+ if self.record_fd != None:
+ self.record_fd.write(read_buf)
+ print("write record:{}".format(len(read_buf)))
+ # count+=Record_len
+ # if count >150*1024:
+ # self.record_fd.close()
+ #self.record_fd = None
# if self.VC_record_state_flag >= 2:
# self.AI_client_asr_send(read_buf)
else:
self.AI_client_asr_send(self.AI_record_tmp_queue.get()) #发送之前存的数据
self.AI_client_asr_send(read_buf)
+
#print("VC_record_thread:{}".format(len(read_buf)))
#count+=len(read_buf)
# if count>=500*1024:#结束
usys.print_exception(e)
#break
self.VC_record_thread_lock = 0
- utime.sleep_ms(60)
+ utime.sleep_ms(100)
#fd.close()
print("VC_record_thread:exit")
self.VC_record_thread_id = 0#线程退出
print("[Errno 22] EINVAL!!!\r\n")
print("[Errno 22] EINVAL!!!\r\n")
self.websocket_error()
- # EventMesh.publish("set_storage_config",["powerRestart",1])#调试临时关闭
- # utime.sleep_ms(1000)
- # self.aud.stopPlayStream()
- # self.aud.stopAll()
- # Power.powerRestart()
+ EventMesh.publish("set_storage_config",["powerRestart",1])#调试临时关闭
+ utime.sleep_ms(1000)
+ self.aud.stopPlayStream()
+ self.aud.stopAll()
+ Power.powerRestart()
self.websocket_error()
return
return
self.AI_client_VC_debug+=1
utime.sleep_ms(10)
- #self.AI_client_VC.settimeout(6)
+ self.AI_client_VC.settimeout(120)
#self.AI_VC_send_data_queue_thread_close()#关闭发送线程
if self.AI_VC_send_data_queue_thread_id == 0:
_thread.stack_size(self.Audio_buf_size+8*1024)
self.LocalRespondingEnded_timerout = 10 #最长倒数10秒发送音频结束或者终止对话
if self.VC_mode == 0 :#连续问答模式
#EventMesh.publish("publish_AI_btnInfo",{"func":self.VC_Speech_End})#调试临时打开
- #EventMesh.publish("publish_AI_btnInfo",{"func":self.VC_Speech_Start})#开始录音 调试临时关闭
+ #EventMesh.publish("publish_AI_btnInfo",{"func":self.VC_Speech_Start})#开始录音
pass
if self.play_data_save_flag == 1:
if self.play_fd !=None:
else:#下发音频数据
#self.AI_ASR_str = ""#下发音频后清掉asr结果
- #print("下发音频数据1:{}".format(len(recv_data)))
+ print("下发音频数据1:{}".format(len(recv_data)))
if self.play_data_save_flag == 1:
if self.play_fd !=None:
except Exception as e:
- error_str = str(e)
- #print("VC VC:e:{}".format(error_str))
- if error_str.find("[Errno 110] ETIMEDOUT")!= -1:
- #print("VC VC:recv TIMEDOUT 正常")
- pass
- else:
+ # error_str = str(e)
+ # #print("VC VC:e:{}".format(error_str))
+ # if error_str.find("[Errno 110] ETIMEDOUT")!= -1:
+ # #print("VC VC:recv TIMEDOUT 正常")
+ # pass
+ # else:
usys.print_exception(e)
#self.websocket_error()
print("VC VC :读数据报错,退出")
#self.aud.play(1,0,'U:/static/peizhichenggong.mp3')#切换成功
self.AI_TTS_str = "更改成功"
return 0
- if text.find("粤") != -1 or text.find("越野") != -1 :
+ if text.find("粤") != -1 or text.find("越野") != -1 or text.find("广东话") != -1:
if "粤" in self.VC_TTS_voice_type:
self.VC_TTS_voice_key = "粤"
EventMesh.publish("set_storage_config",["VC_TTS_voice_key",self.VC_TTS_voice_key])
return 0
if text.find("版本") != -1 :
sourceVersion = versions.Build_Time
- self.AI_TTS_str ="7PIN-"+sourceVersion
+ self.AI_TTS_str ="Mr-Seven-"+sourceVersion
return 0
if text.find("升级") != -1 and (text.find("OTA") != -1 or text.find("ota") != -1):
EventMesh.publish("system_sleep_rest")#防止黑屏
self.close_timerout += 1
- if self.close_timerout > 30:#20秒没数据就close
+ if self.close_timerout > 60:#20秒没数据就close
if self.VC_state >= VC_State_SpeechIng:
print("接口无响应,超时退出")
if self.VC_mode == 1 :#长按单次问答模式
EventMesh.publish("publish_AI_btnInfo",{"func":self.Close})
else:
+ EventMesh.publish("publish_AI_btnInfo",{"func":self.VC_Speech_Start})#开始录音
#通知服务器播放结束
self.AI_client_VC_LocalRespondingEnded()
self.VC_pingping_timerout+=1
- if self.VC_pingping_timerout>5:
+ if self.VC_pingping_timerout>3:
self.VC_pingping_timerout=0
self.AI_client_VC_ping()
self.asr_pingping_timerout += 1
- if self.asr_pingping_timerout>5:
+ if self.asr_pingping_timerout>3:
self.asr_pingping_timerout=0
self.AI_client_asr_ping()
if self.VC_Thinking_timerout > 0 and self.VC_Thinking_timerout < 100:#VC Thinking超时后重新开始
self.LocalRespondingEnded_timerout = 0
self.close_timerout = 0
- if self.record_data_save_flag == 1:
- try:
- uos.remove('/usr/record_data.pcm')
- except Exception as e:
- usys.print_exception(e)
- self.record_fd = open('/usr/record_data.pcm','w')
+
#
if self.AI_client_VC_isconnect == 0:#没连接的时候请求开始
self.websocket_connect_VC()#连接服务器
else:
print("AI_VC_start :AI_audio_queue_thread_id != 0 ")
self._1S_timer.start(1000,1,self._1S_timer_cb)
- self.VC_pingping_timerout = 0
- self.asr_pingping_timerout = 0
+ # self.VC_pingping_timerout = 0
+ # self.asr_pingping_timerout = 0
print("AI_VC_start5")
#开始会话
def AI_client_VC_start_requset(self):
}
EventMesh.publish("publish_AI_btnInfo",{"func":self.VC_init})
EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_client_VC_send,"data":ujson.dumps(json_data)})
- json_data = \
- {
- "header":{
- "trace_id":self.get_trace_id(),
- "event":"AAAAAAAAAAAAAA1"
- },
- "payload":{
- "dialog_id":self.VC_dialog_id,
- "session_id": self.session_id ,
- }
- }
- EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_client_VC_send,"data":ujson.dumps(json_data)})
+ # json_data = \
+ # {
+ # "header":{
+ # "trace_id":self.get_trace_id(),
+ # "event":"AAAAAAAAAAAAAA1"
+ # },
+ # "payload":{
+ # "dialog_id":self.VC_dialog_id,
+ # "session_id": self.session_id ,
+ # }
+ # }
+ # EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_client_VC_send,"data":ujson.dumps(json_data)})
# utime.sleep_ms(1)
# self.AI_client_VC_send(ujson.dumps(json_data))
self.VC_state = VC_State_End
# utime.sleep_ms(1)
#请求TTS或者chat事件
def AI_client_VC_RequestToRespond(self):
+ self.session_id = self.get_session_id()#调试临时打开
json_data = \
{
"header":{