背景
通过调用阿里通义听悟接口,对视频进行了语音转写、智能总结等,现在需要解析返回的PPT和思维导图json文件,以可视化的形式进行呈现。关键点在于:
- PPT生成时,注意用requests请求存放在云上的关键帧图片
- 思维导图生成时,注意使用递归构造思维导图多叉树
部分json样例
- 部分ppt-json样例:
{
"PptExtraction": {
"AvailableForSummary": true,
"KeyFrameList": [
{
"FileUrl": "https://prod-tingwu-paas-common-beijing.oss-cn-beijing.aliyuncs.com/tingwu/output/1897044919663278/d7da6c8d19a44e2d94c0480dd5ab2665/ppt_20240902140302/d7da6c8d19a44e2d94c0480dd5ab2665_001.png?Expires=1727849098&OSSAccessKeyId=LTAI5tMzZ1D4o1drkJN1TfCr&Signature=KWe3h6krodKWrKeLF7HA3EOJnHg%3D",
"Start": 190,
"Summary": "1. 今天开始学习2024年上半年信息信用项目管理课程。\n2. 立项管理是课程的第七章,重要程度高。\n3. 商务选择题通常占该章节考试总分的两分。\n4. 案例分析和论文写作之前也有考过。\n5. 论文写作的考核概率较低,不是每次考试必有。",
"End": 33678,
"Id": 1
},
{
"FileUrl": "https://prod-tingwu-paas-common-beijing.oss-cn-beijing.aliyuncs.com/tingwu/output/1897044919663278/d7da6c8d19a44e2d94c0480dd5ab2665/ppt_20240902140302/d7da6c8d19a44e2d94c0480dd5ab2665_002.png?Expires=1727849098&OSSAccessKeyId=LTAI5tMzZ1D4o1drkJN1TfCr&Signature=a4Vtv65JzD7FAv5DwbqFTivoAPQ%3D",
"Start": 35030,
"Summary": "1. 立项管理是科研工作的一部分,包括项目建议、立项申请、初步研究和详细研究等阶段。\n2. 论文撰写时,可以围绕立项管理的各个阶段来组织结构,例如:项目建议与立项申请 -> 项目可研究 -> 项目评估与决策。\n3. 在立项管理过程中,需考虑项目的可行性、必要性和效益性,这是通过初研和详研来完成的。\n4. 考试可能会涉及立项管理的具体知识点,如项目建议书的作用、可研的内容和技术经济分析等。\n5. 项目评估是立项管理的重要环节,包括对项目的财务、技术和社会效益进行综合评价。",
"End": 281654,
"Id": 2
},
...
]
}
}
- 部分思维导图-json样例:
"MindMapSummary": [
{
"Title": "2024年上半年信息信用项目管理课程学习摘要",
"Topic": [
{
"Title": "立项管理",
"Topic": [
{
"Title": "课程内容概览",
"Topic": [
{
"Title": "考题类型",
"Topic": [
{
"Title": "商务选择题:考两分",
"Topic": [
]
},
{
"Title": "案例分析:历史考题",
"Topic": [
]
},
{
"Title": "论文写作:历史考题",
"Topic": [
]
}
]
},
....
PPT生成
用到的库:pptx, requests
- 注意事项:由于通义听悟接口返回的关键帧图片列表是存放在通义公有云上的URL链接,因此需要先利用requests将关键帧图片从云上下载下来
from pptx import Presentation
import json
from pptx.util import Inches
import requests
prs = Presentation()
# 需要写代码:先从json中把图片列表提取出来
# 第一步:加载json
with open('ppt.json', 'r') as f:
data = json.load(f)
# print(data)
# 第二步:解析json,从中提取关键帧图片
L = data['PptExtraction']['KeyFrameList']
print(len(L))
for i in range(len(L)):
img = L[i]['FileUrl']
# print(img)
# 将关键帧图片嵌入到PPT中
# 获取幻灯片页
slide = prs.slides.add_slide(prs.slide_layouts[0])
prs.slide_height = Inches(9) # 设置页面高度
prs.slide_width = Inches(16) # 设置页面宽度
response = requests.get(img)
with open("key_frame/" + str(i) + ".jpg", "wb") as file:
file.write(response.content)
# 图片文件路径
image_path = "key_frame/" + str(i) + ".jpg"
left = Inches(0.0)
top = Inches(0.0)
# width = Inches(10.0)
# height = Inches(6.0)
width = Inches(16.0)
height = Inches(9.0)
slide.shapes.add_picture(image_path, left, top, width, height)
# 保存PPT
prs.save('your_presentation.pptx')
- 效果如下:
思维导图生成
用到的库:xmind
- 思路:思维导图本质是一颗多叉树,里面用到了递归—>在每一层递归层中同时包含了title和topic,先将title赋给当前节点,再对topic进行递归,扩充子主题
import xmind
import json
# 递归
def add_topic(xw, data):
title = data["Title"]
topics = data["Topic"]
# 创建主题
topic = xw.addSubTopic()
topic.setTitle(title)
# 如果存在子主题,递归增加
if topics:
for t in topics:
add_topic(topic, t)
if __name__ == "__main__":
# 第一步:加载json
with open('play_mindmap.json', 'r') as f:
data = json.load(f)
workbook = xmind.load('play.xmind')
sheet = workbook.getPrimarySheet()
sheet.setTitle("思维导图示例")
# root node
root = sheet.getRootTopic()
root.setTitle("思维导图示例")
for topic in data['Summarization']['MindMapSummary']:
add_topic(root, topic)
# add_topic(root, data['Summarization']['MindMapSummary'][0])
xmind.save(workbook)
- 效果如下: