From 011f9a2a4c096c29af6e710e453c0421a7c1a97a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9B=B9=E5=89=8D=E6=98=8E?= <909355014@qq.com> Date: Tue, 12 Jul 2022 09:05:19 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0voice=5Fnum=20priority?= =?UTF-8?q?=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ecm/migrations/0010_auto_20220712_0855.py | 23 +++++++++++++++++++ apps/ecm/models.py | 2 ++ apps/ecm/serializers.py | 3 ++- apps/ecm/service.py | 8 ++++--- apps/third/speaker.py | 7 ++++-- 5 files changed, 37 insertions(+), 6 deletions(-) create mode 100644 apps/ecm/migrations/0010_auto_20220712_0855.py diff --git a/apps/ecm/migrations/0010_auto_20220712_0855.py b/apps/ecm/migrations/0010_auto_20220712_0855.py new file mode 100644 index 00000000..cdd57257 --- /dev/null +++ b/apps/ecm/migrations/0010_auto_20220712_0855.py @@ -0,0 +1,23 @@ +# Generated by Django 3.2.12 on 2022-07-12 00:55 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('ecm', '0009_auto_20220704_1504'), + ] + + operations = [ + migrations.AddField( + model_name='eventcate', + name='priority', + field=models.PositiveSmallIntegerField(default=1, help_text='1-99', verbose_name='优先级'), + ), + migrations.AddField( + model_name='eventcate', + name='voice_num', + field=models.PositiveSmallIntegerField(default=2, verbose_name='播放次数'), + ), + ] diff --git a/apps/ecm/models.py b/apps/ecm/models.py index b1963daa..a69f99df 100644 --- a/apps/ecm/models.py +++ b/apps/ecm/models.py @@ -19,10 +19,12 @@ class EventCate(CommonAModel): ) code = models.CharField('标识', max_length=10, unique=True) name = models.CharField('名称', max_length=20, unique=True) + priority = models.PositiveSmallIntegerField('优先级', default=1, help_text='1-99') trigger = models.PositiveSmallIntegerField('触发方式', default=10, choices=EVENT_TRIGGER_CHOICES) self_algo = models.BooleanField('识别算法', default=False) speaker_on = models.BooleanField('开启喇叭报警', default=True) voice_person = models.PositiveSmallIntegerField('声音选择', default=0, help_text='0女声3男声') + voice_num = models.PositiveSmallIntegerField('播放次数', default=2) speakers = models.ManyToManyField(TDevice, verbose_name='固定喇叭', blank=True, related_name='ec_speakers') filter_area_level = models.PositiveSmallIntegerField('固定喇叭区域级别过滤', choices=Area.AREA_LEVEL_CHOICES, default=Area.AREA_1) diff --git a/apps/ecm/serializers.py b/apps/ecm/serializers.py index 5ae2fc32..17568160 100644 --- a/apps/ecm/serializers.py +++ b/apps/ecm/serializers.py @@ -31,7 +31,8 @@ class EventCateListSerializer(CustomModelSerializer): class EventCateUpdateSerializer(CustomModelSerializer): class Meta: model = EventCate - fields = ['speaker_on', 'speakers', 'filter_area_level', 'voice_person', 'handle_minute'] + fields = ['speaker_on', 'speakers', 'filter_area_level', + 'voice_person', 'handle_minute', 'voice_num', 'priority'] class NotifySettingsSerializer(CustomModelSerializer): diff --git a/apps/ecm/service.py b/apps/ecm/service.py index 91be018b..1aa75c87 100644 --- a/apps/ecm/service.py +++ b/apps/ecm/service.py @@ -118,7 +118,9 @@ def save_voice_and_speak(event: Event): Args: event (Event): _description_ """ - _, event.voice, _ = generate_voice(event.voice_msg, event.cates.first().voice_person) + main_cate = event.cates.all().order_by('priority', 'create_time').first() + v_p, v_num = main_cate.voice_person, main_cate.voice_num + _, event.voice, _ = generate_voice(event.voice_msg, v_p) event.save() sps = list(TDevice.objects.filter(area=event.area, type=TDevice.DEVICE_SPEAKER).values_list('code', flat=True)) if len(sps) == 0: # 如果当前区域没有喇叭就找覆盖区的喇叭 @@ -130,7 +132,7 @@ def save_voice_and_speak(event: Event): if n.code not in sps: sps.append(n.code) if sps: - spClient.speak(event.voice, sps) + spClient.speak(event.voice, sps, v_num) def create_remind(event: Event): @@ -222,7 +224,7 @@ def dispatch_dahua_event(data: dict): if alarm_type in [1001003, 1001000] and vchannel: # 内部人员/或陌生人报警 # 查看加载的算法 algo_codes = list(AlgoChannel.objects.filter(vchannel=vchannel).exclude( - algo__code=None).values_list('algo__code', flat=True)) + algo__code=None).order_by('algo__priority', 'algo__create_time').values_list('algo__code', flat=True)) area = vchannel.area # 视频所在区域 if algo_codes and area: # 如果加载了算法且视频通道绑定区域才继续 face_img_o = dhClient.get_full_pic(data['info']['alarmPicture']) diff --git a/apps/third/speaker.py b/apps/third/speaker.py index 5255e5fa..9ebb250f 100644 --- a/apps/third/speaker.py +++ b/apps/third/speaker.py @@ -109,12 +109,13 @@ class SpClient: raise APIException(**SP_REQUEST_ERROR) return 'error', SP_REQUEST_ERROR - def speak(self, path: str, sns: list): + def speak(self, path: str, sns: list, v_num: int): """播放报警声 Args: path (str): 资源本地地址 sns (list): 喇叭sn队列 + v_num (int): 播放次数 """ json = { "sns": sns, @@ -129,7 +130,9 @@ class SpClient: }] } } - self.request(**spapis['send_to_device'], json=json) + while v_num > 0: + self.request(**spapis['send_to_device'], json=json) + v_num = v_num - 1 return def _get_response_ms(self):