From 79c7f0c29f0eb58bc615681eeb8a9fbe30e299ee Mon Sep 17 00:00:00 2001 From: 6vision Date: Sat, 23 Sep 2023 13:27:36 +0800 Subject: [PATCH] =?UTF-8?q?=E4=B8=AA=E4=BA=BA=E8=AE=A2=E9=98=85=E5=8F=B7?= =?UTF-8?q?=E9=95=BF=E8=AF=AD=E9=9F=B3=E6=94=AF=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- channel/wechatmp/wechatmp_channel.py | 36 +++++++++++++++------------- 1 file changed, 20 insertions(+), 16 deletions(-) diff --git a/channel/wechatmp/wechatmp_channel.py b/channel/wechatmp/wechatmp_channel.py index d470f1f..347a886 100644 --- a/channel/wechatmp/wechatmp_channel.py +++ b/channel/wechatmp/wechatmp_channel.py @@ -85,22 +85,26 @@ class WechatMPChannel(ChatChannel): logger.info("[wechatmp] text cached, receiver {}\n{}".format(receiver, reply_text)) self.cache_dict[receiver].append(("text", reply_text)) elif reply.type == ReplyType.VOICE: - try: - voice_file_path = reply.content - with open(voice_file_path, "rb") as f: - # support: <2M, <60s, mp3/wma/wav/amr - response = self.client.material.add("voice", f) - logger.debug("[wechatmp] upload voice response: {}".format(response)) - # 根据文件大小估计一个微信自动审核的时间,审核结束前返回将会导致语音无法播放,这个估计有待验证 - f_size = os.fstat(f.fileno()).st_size - time.sleep(1.0 + 2 * f_size / 1024 / 1024) - # todo check media_id - except WeChatClientException as e: - logger.error("[wechatmp] upload voice failed: {}".format(e)) - return - media_id = response["media_id"] - logger.info("[wechatmp] voice uploaded, receiver {}, media_id {}".format(receiver, media_id)) - self.cache_dict[receiver].append(("voice", media_id)) + voice_file_path = reply.content + duration, files = split_audio(voice_file_path, 60 * 1000) + if len(files) > 1: + logger.info("[wechatmp] voice too long {}s > 60s , split into {} parts".format(duration / 1000.0, len(files))) + + for path in files: + # support: <2M, <60s, mp3/wma/wav/amr + try: + with open(path, "rb") as f: + response = self.client.media.upload("voice", f) + logger.debug("[wechatmp] upload voice response: {}".format(response)) + f_size = os.fstat(f.fileno()).st_size + time.sleep(1.0 + 2 * f_size / 1024 / 1024) + # todo check media_id + except WeChatClientException as e: + logger.error("[wechatmp] upload voice failed: {}".format(e)) + return + media_id = response["media_id"] + logger.info("[wechatmp] voice uploaded, receiver {}, media_id {}".format(receiver, media_id)) + self.cache_dict[receiver].append(("voice", media_id)) elif reply.type == ReplyType.IMAGE_URL: # 从网络下载图片 img_url = reply.content