添加默认铃声
authorazao <821478748@qq.com>
Fri, 7 Nov 2025 10:23:31 +0000 (18:23 +0800)
committerazao <821478748@qq.com>
Fri, 7 Nov 2025 10:25:38 +0000 (18:25 +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/ai_alarm.py
2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/voice_record.py

index 0bf8e01..bc85cba 100644 (file)
@@ -2511,6 +2511,7 @@ class AI_VC(Abstract):
         self.play_new_voice_flag =0 #播放文字留言flag
         EventMesh.subscribe("play_tts",self.play_tts)
         EventMesh.subscribe("play_new_voice",self.play_new_voice)
+        EventMesh.subscribe("play_single_voice",self.play_single_voice)#不带tts的播放(闹钟)
         EventMesh.subscribe("play_music",self.play_music)#播放音乐
         EventMesh.subscribe("play_trans_tts",self.play_trans_tts)#接收翻译tts
         EventMesh.subscribe("set_vad_silence",self.set_vad_silence)
@@ -2523,8 +2524,13 @@ class AI_VC(Abstract):
         self.voice_cnt = 0 #留言定时器计数
         self.voicerupt_flag = 0#留言选择按键接听标志位
         self.recv_voice = 0 #是否收到留言
+        self.voice_notice = 0 #收到留言并播放则置为1,接下来要播放提示词
         self.voice_choose_flag = 0#当tts和语音留言冲突时,为了防止语音地址被误清,做标志位在close做判断
 
+        self.revoice_timer = osTimer()#语音留言10S按下按键确定是否回复的判断定时器
+        self.revoice_cnt = 0 #回复留言定时器计数
+        self.revoicerupt_flag = 0#留言选择按键接听标志位
+
         self.music_timer = osTimer()#音乐播放定时器,等待tts播完才放音乐
         self.music_cnt = 0 #留言定时器计数
 
@@ -2889,8 +2895,9 @@ class AI_VC(Abstract):
         self.VC_record_state_flag = 0
         self.AI_key_long_press_flag = 0
         self.websocket_error_count = 0
-        self.AI_new_voice_url = "" #未读语音地址/音乐播放地址
+        self.AI_new_voice_url = "" #未读语音地址/音乐播放地址/闹钟播放标志
         self.music_play_flag = 0 #音乐播放标志
+        self.alarm_play_flag = 0 #闹钟播放标志
         self.tts_in_data_len = 0
         self.tts_out_data_len = 0
         self.VC_satrt_flag = 0
@@ -3161,7 +3168,7 @@ class AI_VC(Abstract):
         return self.audio_play_state
     
     def come_meet_mode(self, event=None, msg = None):
-        if self.meet_flag == 0: #还是为0就提示进入语音留言模式
+        if self.meet_flag == 0: #还是为0就提示进入会议纪要模式
             EventMesh.publish("send_meet_open_flag_to_iot")#创建会议
             self.meet_flag=1
             exit_tts ="开启会议纪要,正在录音"
@@ -3357,6 +3364,8 @@ class AI_VC(Abstract):
             if EventMesh.publish("GET_USB_STATE") == 0:
                 EventMesh.publish("close_led")
             EventMesh.publish("stop_voice_record")#停止静默录音
+            tts_play_str = "留言已发送"
+            EventMesh.publish("play_tts",[tts_play_str,1])
             return
         if self.AI_key_long_press_flag == 1 :#有长按
             #self.AI_client_VC_end_speech()
@@ -4053,18 +4062,26 @@ class AI_VC(Abstract):
                             
                             print("VC:Started!!!!!!!!\r\n")
                             print("TTS音频为:{},语音下发地址为:{}".format(self.AI_TTS_str,self.AI_new_voice_url))
-                            if self.AI_TTS_str == "" and  self.AI_new_voice_url != "" and self.music_play_flag == 0:
+                            if self.AI_new_voice_url != "" and self.alarm_play_flag == 1 :#有闹钟,先响闹钟
+                                self.AI_VC_start()
+                                EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_client_new_voice})#播放铃声
+                                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:
                                 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})
+                            
                             elif self.AI_TTS_str != "" and  self.AI_new_voice_url != "" and self.music_play_flag == 0:#遇到tts和语音留言冲突时(并且没有音乐播放)
                                 EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_client_VC_synthesis})
                                 self.voice_cnt = 0
+                                print("定时器开启111111111")
                                 self.voice_timer.start(1000,1,self.voice_judge) 
                                 self.voice_choose_flag = 1
                                 # self.AI_TTS_str = ""    
-                            elif self.AI_TTS_str != "" and  self.AI_new_voice_url != "" and self.music_play_flag == 1:#遇到tts和语音留言冲突时(并且有音乐播放)
+                            elif self.AI_TTS_str != "" and  self.AI_new_voice_url != "" and self.music_play_flag == 1 :#遇到tts和语音留言冲突时(并且有音乐播放)
                                 self.music_play_flag = 0
                                 EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_client_VC_synthesis})
                                 self.music_timer.start(1000,1,self.music_play) 
@@ -4213,6 +4230,15 @@ class AI_VC(Abstract):
                                 self.Close_flag = 1
                                 self.LocalRespondingEnded_timerout = 8   
                                 # EventMesh.publish("publish_AI_btnInfo",{"func":self.Close}) 
+                            if self.voice_notice == 1:#已收到留言,进行该留言回复逻辑处理
+                                tts_play_str = "如需回复,长按确认键开始录制,松开发送。十秒内无操作自动退出"
+                                EventMesh.publish("play_tts",[tts_play_str,1])
+                                self.voice_notice = 0#标志位清空
+                                self.voice_timer.stop()
+                                self.revoice_cnt = 0
+                                self.voice_flag = 1
+                                print("语音留言回复停止")
+                                self.revoice_timer.start(1000,1,self.revoice_judge)
                             if EventMesh.publish("get_play_new_voice_state")== 1:
                                 EventMesh.publish("set_play_new_voice_state",1)
                                 EventMesh.publish("update_play_new_voice_info")
@@ -4293,19 +4319,31 @@ class AI_VC(Abstract):
         print("语音留言定时器cnt = {}".format(self.voice_cnt))
         if self.voicerupt_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
            self.recv_voice = 0#进入留言定时器,留言清空
            print("进入留言定时器1,留言清空!!!!!")
            self.voice_timer.stop()
-        if self.voice_cnt > 15:#10S后退出播放,4S是为了给语音提示留时间
+        if self.voice_cnt > 15:#10S后退出播放,5S是为了给语音提示留时间
            self.voice_cnt = 0
            self.recv_voice = 0#进入留言定时器,留言清空
            if self.voice_choose_flag == 1:#播放完语音后,有冲突的时候关闭
               self.voice_choose_flag = 0
            print("进入留言定时器2,留言清空!!!!!")
            self.voice_timer.stop()
+    #语音留言回复定时器
+    def revoice_judge(self, *args, **kwargs):
+        EventMesh.publish("publish_AI_btnInfo",{"func":self.revoice_judger_cb})  
+    def revoice_judger_cb(self):
+        self.revoice_cnt += 1
+        print("语音留言回复定时器cnt = {}".format(self.revoice_cnt))
+        if self.revoice_cnt > 20:#10S后退出播放,10S是为了给语音提示留时间
+           self.revoice_cnt = 0
+           self.voice_flag=0
+           print("语音留言回复停止")
+           self.revoice_timer.stop()
     #音乐播放定时器
     def music_play(self, *args, **kwargs):
         EventMesh.publish("publish_AI_btnInfo",{"func":self.music_play_cb})  
@@ -5562,7 +5600,35 @@ class AI_VC(Abstract):
         EventMesh.publish("set_storage_config",["VC_TTS_voice_key",self.VC_TTS_voice_key])
         tts_play_str = "声音改为{}".format(voice)
         EventMesh.publish("play_tts",[tts_play_str,0])
-        
+
+    #闹钟的url播放接口
+    def play_single_voice(self,event = None,msg= None):
+        EventMesh.publish("publish_AI_btnInfo",{"func":self.play_single_voice_cb,"data":msg}) 
+    def play_single_voice_cb(self,data):
+        try:
+            new_voice_url = data[0] #音频地址
+            is_close_VC = data[1]
+            if new_voice_url != "":
+                self.AI_new_voice_url = new_voice_url
+                self.alarm_play_flag = 1
+            if is_close_VC != None:
+                self.Close_flag = is_close_VC
+            if self.AI_VC_send_data_queue.empty()!=True:
+                self.AI_VC_send_data_queue.clear()
+            if self.AI_ASR_send_data_queue.empty()!=True:
+                self.AI_ASR_send_data_queue.clear()
+            EventMesh.publish("open_led_all")
+            self.AI_ASR_send_buf_len = 0
+            self.VC_Speech_End()
+            self.websocket_deconnect_VC()
+            self.AI_VC_start()
+            self.play_new_voice_flag = 1
+            # EventMesh.publish("publish_AI_btnInfo",{"func":self.VC_Speech_End})
+            # EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_deconnect_VC}) 
+            # EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_VC_start}) 
+        except Exception as e:
+                usys.print_exception(e)   
+        pass       
     #语音留言
     def play_new_voice(self,event = None,msg= None):
         EventMesh.publish("publish_AI_btnInfo",{"func":self.play_new_voice_cb,"data":msg}) 
index 84b28d6..e888e78 100644 (file)
@@ -306,16 +306,18 @@ class AI_alarm(Abstract):
                     ringUrl = alarm_TTS_str["ringUrl"]
                     print("{} {} {}".format(AringTimes,alarmMode,shakeType))
                     if alarmMode == "ring": #只响铃
-                        if ringUrl != None:
-                            EventMesh.publish("play_new_voice",[ringUrl,1])
                         if ringUrl == None:
-                            base_sentence = "{}".format(name)
-                            if AringTimes == 0:
-                                AringTimes = 1
-                            repeat_sentence = (base_sentence + ",") * AringTimes  # 重复5次并加逗号分隔
-                            final_sentence = repeat_sentence.rstrip(",")
+                           ringUrl = "http://qipaiai-oss1.tos-cn-beijing.volces.com/qi_pai_ringtone/2025_11_07/774578468192129024default_ring.pcm"
+                        if ringUrl != None:
+                            EventMesh.publish("play_single_voice",[ringUrl,1])
+                        # if ringUrl == None:
+                        #     base_sentence = "{}".format(name)
+                        #     if AringTimes == 0:
+                        #         AringTimes = 1
+                        #     repeat_sentence = (base_sentence + ",") * AringTimes  # 重复5次并加逗号分隔
+                        #     final_sentence = repeat_sentence.rstrip(",")
                             
-                            EventMesh.publish("play_tts",[final_sentence,1])  #播放tts闹钟文本内容
+                        #     EventMesh.publish("play_tts",[final_sentence,1])  #播放tts闹钟文本内容
                     elif alarmMode == "shake": #只振动
                         if shakeType == "short":
                             EventMesh.publish("set_motor_time",[1,1,5,8,4])#设置马达参数
@@ -332,8 +334,10 @@ class AI_alarm(Abstract):
                         EventMesh.publish("play_tts",[final_sentence,1])  #播放tts闹钟文本内容
 
                     elif alarmMode == "both": #响铃加振动
+                        if ringUrl == None:
+                           ringUrl = "http://qipaiai-oss1.tos-cn-beijing.volces.com/qi_pai_ringtone/2025_11_07/774578468192129024default_ring.pcm"
                         if ringUrl != None:
-                            EventMesh.publish("play_new_voice",[ringUrl,1])
+                            EventMesh.publish("play_single_voice",[ringUrl,1])
                             pass
                         if shakeType == "short":
                             EventMesh.publish("set_motor_time",[1,1,5,8,4])#设置马达参数
@@ -341,14 +345,14 @@ class AI_alarm(Abstract):
                         elif shakeType == "long":
                             EventMesh.publish("set_motor_time",[1,1,5*2,8,4])#设置马达参数
                         
-                        if ringUrl == None:
-                            base_sentence = "{}".format(name)
-                            if AringTimes == 0:
-                                AringTimes = 1
-                            repeat_sentence = (base_sentence + ",") * AringTimes  # 重复5次并加逗号分隔
-                            final_sentence = repeat_sentence.rstrip(",")
+                        # if ringUrl == None:
+                        #     base_sentence = "{}".format(name)
+                        #     if AringTimes == 0:
+                        #         AringTimes = 1
+                        #     repeat_sentence = (base_sentence + ",") * AringTimes  # 重复5次并加逗号分隔
+                        #     final_sentence = repeat_sentence.rstrip(",")
                             
-                            EventMesh.publish("play_tts",[final_sentence,1])  #播放tts闹钟文本内容
+                        #     EventMesh.publish("play_tts",[final_sentence,1])  #播放tts闹钟文本内容
 
             except Exception as e:
                 usys.print_exception(e)
index c0a5ddd..dc4ff2f 100644 (file)
@@ -211,7 +211,7 @@ class VOICE_RECORD(Abstract): #静默录音
                                 EventMesh.publish("SEND_MEETAUDIO_TO_IOT",[read_buf,self.msgid_int,0])
                                 break
                             EventMesh.publish("SEND_MEETAUDIO_TO_IOT",[read_buf,self.msgid_int,self.start_voice_record_flag])
-                        elif self.voice_mode == 4: #会议纪要开始
+                        elif self.voice_mode == 4: #AI翻译开始
                             get_sos_flag = EventMesh.publish("get_sos_flag") 
                             if get_sos_flag != 0:
                                 print("打电话退出AI翻译")