修改之前的问题,并且添加多条语音一起播放的功能
authorazao <821478748@qq.com>
Fri, 28 Nov 2025 08:18:30 +0000 (16:18 +0800)
committerazao <821478748@qq.com>
Fri, 28 Nov 2025 08:18:30 +0000 (16:18 +0800)
2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/ai_VC.py
2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/protocol.py

index 0c6b10b..170d35c 100644 (file)
@@ -2929,6 +2929,8 @@ class AI_VC(Abstract):
         self.VC_satrt_kws_flag = 0
         self.session_id = ""
         self.stop_voice_timer=osTimer()
+        self.pwk_cnt_voice = 0 #不听语音后,积攒的次数,需要一起播放
+        self.pwk_notice_flag = 0#是否处于积攒留言状态(用来实现单次提醒)
         EventMesh.subscribe("AI_key_press", self.AI_key_press)
         EventMesh.subscribe("BT_AI_key_press", self.BT_AI_key_press)
         EventMesh.subscribe("stop_AI_record", self.stop_AI_record)
@@ -2946,6 +2948,8 @@ class AI_VC(Abstract):
         EventMesh.subscribe("set_VC_stop_play_audio_flag", self.set_VC_stop_play_audio_flag)
         EventMesh.subscribe("set_yuyinaudio_flag",self.set_yuyinaudio_flag)
         EventMesh.subscribe("get_yuyinaudio_flag",self.get_yuyinaudio_flag)
+        EventMesh.subscribe("set_pwk_cnt_voice",self.set_pwk_cnt_voice)
+        EventMesh.subscribe("get_pwk_cnt_voice",self.get_pwk_cnt_voice)
         EventMesh.subscribe("exit_voice_message_mode",self.exit_voice_message_mode) #超时未退出语音留言模式
         EventMesh.subscribe("come_meet_mode",self.come_meet_mode)#进入会议模式
         EventMesh.subscribe("exit_meet_mode",self.exit_meet_mode)#退出会议模式
@@ -2957,8 +2961,10 @@ class AI_VC(Abstract):
         EventMesh.subscribe("rate_change",self.rate_change)#直接修改语速
         EventMesh.subscribe("get_history_voice_flag",self.get_history_voice_flag)#获取查找历史留言状态
         EventMesh.subscribe("set_history_voice_flag",self.set_history_voice_flag)#修改查找历史留言状态
+        EventMesh.subscribe("clean_unread_vocie",self.clean_unread_vocie)#修改查找历史留言状态
         EventMesh.subscribe("get_wait_voice_flag",self.get_wait_voice_flag)#获取60S等待留言播放定时器状态
         EventMesh.subscribe("set_wait_voice_flag",self.set_wait_voice_flag)#修改60S等待留言播放定时器状态
+        EventMesh.subscribe("rate_move",self.rate_move)#NLP修改语速
         # EventMesh.subscribe("get_voicerupt_flag",self.get_voicerupt_flag)#获取留言播放状态
         # EventMesh.subscribe("chenggong_tone",self.chenggong_tone)
         
@@ -3032,10 +3038,11 @@ class AI_VC(Abstract):
         EventMesh.publish("set_storage_config",["speech_rate",self.speech_rate])
         print("set_speech_rate:{}".format(self.speech_rate))
     def rate_move(self,event,msg):#设置语速(模糊(快/慢一点))
-        if msg == 1:#增大
+        if msg == 1 and self.speech_rate<50:#增大
             self.speech_rate += 10
         else:#减小
-            self.speech_rate -= 10
+            if self.speech_rate >-50:
+                self.speech_rate -= 10
         EventMesh.publish("set_storage_config",["speech_rate",self.speech_rate])
         print("set_speech_rate:{}".format(self.speech_rate))
 
@@ -3052,7 +3059,10 @@ class AI_VC(Abstract):
     def set_history_voice_flag(self,event,msg):
         print("历史留言标记修改为:{}".format(msg))
         self.history_voice_flag = msg
-    
+    def clean_unread_vocie(self,event,msg):
+        self.pwk_cnt_voice = 0
+        self.pwk_notice_flag = 0
+        EventMesh.publish("set_app_new_voice_flag",0)
     def audio_test(self,event = None, msg = None):
         self.VC_Speech_Start()   
         self.VC_Play_Start()      
@@ -3200,6 +3210,14 @@ class AI_VC(Abstract):
 
     def set_yuyinaudio_flag(self, event=None, msg = None):
         self.voice_flag=0
+
+    #留言主动拒听
+    def get_pwk_cnt_voice(self, event=None, msg = None):
+        return self.pwk_cnt_voice
+
+    def set_pwk_cnt_voice(self, event=None, msg = None):
+        self.pwk_cnt_voice=msg
+
     #会议
     def get_meetaudio_flag(self, event=None, msg = None):
         return self.meet_flag
@@ -3209,6 +3227,8 @@ class AI_VC(Abstract):
     def get_audio_play_state(self, event=None, msg = None):
         return self.audio_play_state
     
+    
+    
     def come_meet_mode(self, event=None, msg = None):
         if self.meet_flag == 0: #还是为0就提示进入会议纪要模式
             EventMesh.publish("send_meet_open_flag_to_iot")#创建会议
@@ -4116,13 +4136,13 @@ class AI_VC(Abstract):
                                 self.alarm_play_flag = 0
                                 self.voice_choose_flag = 1
                             elif self.AI_TTS_str == "" and  self.AI_new_voice_url != "" and self.music_play_flag == 0:
-                                if EventMesh.publish("get_history_voice_flag") == 1:
-                                    EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_client_new_voice})#播放留言
-                                    self.recv_voice = 0#当留言列表为空,留言播放标志清空
-                                else:
-                                    self.voice_cnt = 0
-                                    print("定时器开启222222222")
-                                    self.voice_timer.start(1000,1,self.voice_judge)
+                                # if EventMesh.publish("get_history_voice_flag") == 1:
+                                EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_client_new_voice})#播放留言
+                                self.recv_voice = 0#当留言列表为空,留言播放标志清空
+                                # else:
+                                #     self.voice_cnt = 0
+                                #     print("定时器开启222222222")
+                                #     self.voice_timer.start(1000,1,self.voice_judge)
                             elif  self.AI_TTS_str != "" and  self.AI_new_voice_url == "":
                                 EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_client_VC_synthesis})
                             
@@ -4289,6 +4309,12 @@ class AI_VC(Abstract):
                         elif jsload_data["event"] == "audio.convert.completed":#音频转成完成没有出错 接口
                             
                             self.VC_state = VC_State_End
+                            if self.pwk_notice_flag == 1:#只有在播放的时候才会去计数
+                                self.pwk_cnt_voice -= 1#减1
+                                print("未读留言又-1,当前留言剩余数量为:{}".format(self.pwk_cnt_voice))
+                            if self.pwk_cnt_voice == 0:#积累的留言已经全部播完
+                                self.pwk_notice_flag = 0
+                                self.voice_notice = 1#开启回复
                             if self.voice_choose_flag == 1:#播放完语音后,有冲突的时候关闭
                                 self.voice_choose_flag = 0
                                 self.Close_flag = 1
@@ -4308,10 +4334,11 @@ class AI_VC(Abstract):
                                 # EventMesh.publish("update_play_new_voice_info")
                                 EventMesh.publish("play_new_voice_list")
                             print("是否未读:{},是否播完:{}".format(EventMesh.publish("get_wait_voice_flag"),len(EventMesh.publish("get_play_new_voice_list"))))
-                            if len(EventMesh.publish("get_play_new_voice_list")) ==0:#还在未读并且列表为空
-                                self.wait_first_flag = 0
-                                print("未读留言播完,清空标志")
-                                EventMesh.publish("set_history_voice_flag",0)
+                            # if EventMesh.publish("get_wait_voice_flag") == 1 and len(EventMesh.publish("get_play_new_voice_list")) ==0:#还在未读并且列表为空
+                            #     self.wait_first_flag = 0
+                            #     print("未读留言播完,清空标志")
+                            #     EventMesh.publish("set_wait_voice_flag",0)
+                            #     EventMesh.publish("set_history_voice_flag",0)
                             EventMesh.publish("update_play_new_voice_info")#更新已读状态
                             self.recv_voice = 0
                             self.LocalRespondingEnded_timerout = 8
@@ -4391,8 +4418,8 @@ class AI_VC(Abstract):
         self.voice_cnt += 1
         # print("语音留言定时器cnt = {}".format(self.voice_cnt))
         if self.voicerupt_flag == 1:#按键被按下
+           self.pwk_notice_flag = 1#表示进入收听
            self.AI_VC_start()
-           self.voice_notice = 1
            EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_client_new_voice})#播放留言
            self.voicerupt_flag = 0 #标志位置0
            self.voice_cnt = 0
@@ -4400,6 +4427,8 @@ class AI_VC(Abstract):
            print("进入留言定时器1,留言清空!!!!!")
            EventMesh.publish("update_play_new_voice_info")#更新已读状态
            self.voice_timer.stop()
+           if self.pwk_cnt_voice > 0:
+               EventMesh.publish("get_new_voice_msg_S")
         if self.voice_cnt > 15:#10S后退出播放,5S是为了给语音提示留时间
            self.voice_cnt = 0
            self.recv_voice = 0#进入留言定时器,留言清空
@@ -5755,7 +5784,17 @@ class AI_VC(Abstract):
                 print("已收到最新留言!!!!!")
                 # EventMesh.publish("set_motor_time",[1,1,5,8,4])#设置马达参数
                 self.AI_new_voice_url = new_voice_url
-                EventMesh.publish("play_tts",["您有一条语音留言,10秒内按下中间键可以收听",1]) 
+                # if self.pwk_cnt_voice == 0 and self.pwk_notice_flag == 0:#并且不在多条留言的状态
+                #     EventMesh.publish("play_tts",["您有一条语音留言,10秒内按下中间键可以收听",1])
+                if self.pwk_notice_flag == 0 and EventMesh.publish("get_app_new_voice_flag"):#不处于播放状态并且是小程序下发的语音而不是请求的
+                    self.pwk_cnt_voice += 1#加上当前这条
+                    EventMesh.publish("set_app_new_voice_flag",0)
+                    print("voice_add_to = {}".format(self.pwk_cnt_voice))
+                print("self.pwk_notice_flag = {}".format(self.pwk_notice_flag))
+                if self.pwk_cnt_voice >0:
+                    if self.pwk_notice_flag == 0:
+                        tts_str = "您有" + str(self.pwk_cnt_voice) + "条语音留言,10秒内按下中间键可以收听"
+                        EventMesh.publish("play_tts",[tts_str,1])
             if is_close_VC != None:
                 self.Close_flag = is_close_VC
             if self.AI_VC_send_data_queue.empty()!=True:
index 66fd335..4ac8efe 100644 (file)
@@ -1613,11 +1613,9 @@ class SockMangager(Abstract):
                         EventMesh.publish("play_his_voice",[url,1,time])
                     if len(EventMesh.publish("get_play_new_voice_list")) == 0:#列表为空才清零
                         EventMesh.publish("set_history_voice_flag",0)#修改标志位
-
                 else:
                     EventMesh.publish("play_new_voice",[url,1])
                 break
-
             pass
     def update_play_new_voice_info(self,event,msg): #更新播放语音留言信息
         date_tmp = utime.localtime()
@@ -2705,6 +2703,7 @@ def ai_cmd_handle(cmd):
     elif "查看历史留言" in cmd :#当指令中有查看历史留言时,调用历史留言接口
         EventMesh.publish(WEB_CMD_ENUM.GET_NEW_VOICE_MSG_S)
         EventMesh.publish("set_history_voice_flag",1)#修改标志位
+        EventMesh.publish("clean_unread_vocie")#清空未读多条一起下发记录    
         pass
 
 #NLP指令
@@ -3575,11 +3574,19 @@ class IOTWeb_find_new_voice_msgProtoCol(ProtoCol):
                         pass
                 else:#未读留言
                     for da in voice_list:
-                            new_voice_list.append(da)
+                        new_voice_list.append(da)
                     if len(new_voice_list) > 0:
                         pass
                 EventMesh.publish("set_play_new_voice_list",new_voice_list)
                 EventMesh.publish("play_new_voice_list")
+        else:#正常留言
+            if EventMesh.publish("get_pwk_cnt_voice") >= 0:
+                for da in voice_list:
+                    new_voice_list.append(da)
+                if len(new_voice_list) > 0:
+                    pass
+                EventMesh.publish("set_play_new_voice_list",new_voice_list)
+                EventMesh.publish("play_new_voice_list")
     def set_history_board_flag(self,event,msg):
         self.history_board_flag = msg           
 
@@ -3707,6 +3714,9 @@ class IOTWeb_new_voice_msg_listProtoCol(ProtoCol):
     def __init__(self):
         super().__init__()
         self._1M_flag = 0#判断一分钟定时器是否开启中
+        self.app_new_voice_flag = 0#app是否下发留言
+        EventMesh.subscribe("get_app_new_voice_flag",self.get_app_new_voice_flag)
+        EventMesh.subscribe("set_app_new_voice_flag",self.set_app_new_voice_flag)
     def send(self, event, msg):
         print("send new_voice_msg_list{}".format(msg))
         # 通过websocket发送到服务器端
@@ -3733,6 +3743,7 @@ class IOTWeb_new_voice_msg_listProtoCol(ProtoCol):
         @param event:new_voice_msg_list
         @param msg: 接收到的下行数据
         """
+        self.app_new_voice_flag = 1#标志位为1
         self._1M_timer = osTimer()#多发留言间隙时间60S
         new_voice_list = []
         if "data" in msg:
@@ -3746,7 +3757,7 @@ class IOTWeb_new_voice_msg_listProtoCol(ProtoCol):
             EventMesh.publish("play_new_voice_list")
         else:#当有音频在播放时,存下来开始倒计时
             pass
-            if self._1M_flag == 0:
+            if self._1M_flag == 0 :
                 print("等待留言60S倒计时开启")
                 self._1M_timer.start(60000, 1, self._1M_timer_cb)
                 self._1M_flag = 1
@@ -3770,6 +3781,10 @@ class IOTWeb_new_voice_msg_listProtoCol(ProtoCol):
             EventMesh.publish("set_wait_voice_flag",1)#修改60S标志位
             self._1M_flag = 0
             self._1M_timer.stop()
+    def get_app_new_voice_flag(self,event,msg):
+        return self.app_new_voice_flag
+    def set_app_new_voice_flag(self,event,msg):
+        self.app_new_voice_flag = msg
 class IOTWeb_put_voice_msg_stateProtoCol(ProtoCol):
     """put_voice_msg_state"""
     TYPE = "put_voice_msg_state"