多源异构数据采集与融合应用综合实践
这个项目属于哪个课程 | 2024数据采集与融合技术实践 |
---|---|
组名、项目简介 | 组名:scrapy能帮我爬到美味蟹黄堡的秘方吗 项目需求:文物不能很好的融入我们的生活,它们仿佛一具冰冷的尸体躺在博物馆的展示柜中,静静地接受着岁月的侵蚀和尘埃的覆盖。 项目目标:赋予文物新的生命力,让它们“动”起来。通过人工智能技术,为文物创造更加精彩动人的故事,生成曼妙的声音,制作生动震撼的展示视频,让历史以全新的方式触动人心。 技术路线:vue3前端web网站搭建,python flask后端,华为云平台(服务器接口调用),阿里云平台(部分数据存储),kimi背景故事AI生成接口,快手可灵ai平台对口型视频生成和通过接口实现视频生成 |
团队成员学号 | 曹星才-072208130 张诗悦-052205144 朱佳杰-012202239 黄悦佳-102202142 詹镇壕-102202149 |
这个项目目标 | 将静止的文物与现代科技相结合,赋予它们新的生命和表现力。我们通过先进的人工智能技术,让文物“动”起来,呈现出它们沉睡千年的故事与情感。AI将为每件文物创作更加丰富和感人的背景故事,让它们不再只是历史的见证者,而是活生生的叙述者。同时,通过AI生成曼妙的声音,让这些故事更加生动,引人入胜;借助视觉技术,生成精美的展示视频,生动再现文物的诞生过程、文化背景与历史场景。最终,我们希望通过这一系列创新方式,让更多人触及文物的灵魂,感受历史与文化的魅力。 |
其他参考文献 | https://docs.qingque.cn/d/home/eZQClW07IFEuX1csc-VejdY2M?identityId=1oEG9JKKMFv#section=h.a6acy8mosh |
码云链接(代码已汇总,各小组成员代码分开放) | 前端:综合设计实践——前端 ·2022级数据采集与融合技术 - 码云 - 开源中国 后端:综合设计实践——后端 ·2022级数据采集与融合技术 - 码云 - 开源中国 爬虫:https://gitee.com/jia1666372886/museumspider/tree/master/ |
一、项目背景
文物不能很好的融入我们的生活,它们仿佛一具冰冷的尸体躺在博物馆的展示柜中,静静地接受着岁月的侵蚀和尘埃的覆盖。那些曾经承载着历史脉络与文化荣光的物品,如今只剩下了沉默的外壳,无法向我们诉说它们曾经的故事。它们被时间的长河淹没,渐渐失去了与我们生活的联系,变成了一个个静止的符号,等待着被无数的目光定格,却难以真正融入现代人的日常。
这些文物或许曾在千百年前激荡起社会的波澜,或许曾是某个伟大文明的象征,但如今它们的存在仿佛和现代世界隔绝了。我们虽然能够从它们的外观上看到历史的痕迹,感受到当时的技艺与智慧,却难以触摸到那段历史背后的人情冷暖、风云变幻。它们不再是生活的一部分,而是被孤立在某个遥远的过去,只是某种文化的遗物。
然而,尽管它们远离了现代的喧嚣,文物依然是人类历史与文化的见证者。每一件文物都有自己独特的生命力,它们承载着前人的思想、情感和智慧。要想让文物重新焕发出活力,我们需要跨越时空的藩篱,用现代科技去唤醒它们沉睡的记忆。通过人工智能、虚拟现实等技术,文物可以不再是冰冷的展品,而是成为我们与过去沟通的桥梁。它们能够重新讲述那个时代的故事,带领我们走进千年之前的世界,让我们重新感受到历史的脉搏和文化的力量。
在这个数字化、智能化的时代,我们不妨通过创新的方式,去打破文物与现代生活之间的隔阂,让这些承载着历史与文明的珍宝重新走进我们的生活,让它们不再只是博物馆里的静物,而是活跃在我们日常的对话和思考之中。
二、项目分工
成员 | 任务 |
---|---|
曹星才 | 前端页面设计 |
张诗悦 | 前端页面设计 |
朱佳杰 | 文物信息爬取 |
黄悦佳 | 后端服务器搭建与数据库管理搭建 |
詹镇壕 | 后端服务器搭建与api接口编写 |
三、个人贡献 码云链接
1、接口开发与编写:
使用Python的Flask框架进行开发
- Flask是一个轻量级的Web应用框架,因其简单易用和灵活性而被选中。允许我可以快速开发和部署Web应用,而不需要过多的配置和复杂的依赖。
使用Blueprint对接口进行统一管理
- 通过使用Blueprint,能够将不同的功能模块化,每个Blueprint代表一个应用的子部分或一个特定的功能区域,如用户管理、文物管理和ai功能等。
- 通过使用这个框架,我成功设计并实现了项目的核心后端API接口,确保了数据的高效处理和传输,实现了数据交互、业务逻辑等关键功能的覆盖。
文档编写和代码审查
- 编写简单的API文档,包括接口定义、参数说明、返回值等,方便了前端开发者的使用。
- 参与代码审查,提供了代码改进建议,帮助团队成员提升代码质量。
项目api代码框架
# 按文物类别查询文物信息 API
@artifact_blueprint.route('/api/artifacts/category', methods=['GET'])
def search_artifacts_by_category():
category_query = request.args.get('category')
limit_query = request.args.get('limit', default=None, type=int) # 获取 limit 参数,如果没有提供则为 None
if not category_query:
return jsonify({'success': False, 'message': '请提供文物类别查询参数!'}), 400
# 连接数据库
cur = mysql.connection.cursor()
# 构造 SQL 查询,根据是否有 limit 参数来决定是否添加 LIMIT 子句
search_query = "SELECT id, name, category, period, material, status, tags, description, thumbnail_path, created_at, updated_at, parameter FROM artifacts WHERE category LIKE %s"
params = (f"%{category_query}%",)
if limit_query is not None:
search_query += " LIMIT %s"
params += (limit_query,)
cur.execute(search_query, params)
artifacts = cur.fetchall()
cur.close()
if not artifacts:
return jsonify({'success': False, 'message': '未找到符合条件的文物!'}), 404
# 格式化返回数据
artifact_list = [{
'id': artifact[0],
'name': artifact[1],
'category': artifact[2],
'period': artifact[3],
'material': artifact[4],
'status': artifact[5],
'tags': artifact[6],
'description': artifact[7],
'thumbnail_path': artifact[8],
'created_at': artifact[9].strftime('%Y-%m-%d %H:%M:%S'),
'updated_at': artifact[10].strftime('%Y-%m-%d %H:%M:%S'),
'parameter': artifact[11]
} for artifact in artifacts]
return jsonify({'success': True, 'data': artifact_list}), 200
2、接口测试:
对接口进行初步测试
- 使用requests对接口进行简单访问,确保接口可以正确返回数据或处理数据。
# 按文物类别统计数量测试
def test_get_artifacts_count_by_category():
# 测试不带 limit 参数的情况
response = requests.get(f'{BASE_URL}/api/artifacts/category/count')
if response.status_code != 200:
print(f"按文物类别统计数量失败,状态码:{response.status_code}, 响应内容:{response.text}")
assert response.status_code == 200
print()
print('按文物类别统计数量测试通过')
print(response.json())
# 按文物类别交互数量统计测试
def test_get_artifacts_count_by_interactions_count():
response = requests.get(f'{BASE_URL}/api/interactions/category/interactions_count')
if response.status_code != 200:
print(f"按文物类别统计数量失败,状态码:{response.status_code}, 响应内容:{response.text}")
assert response.status_code == 200
print()
print('按文物类别统计交互数量测试通过')
print(response.json())
3、ai接口的调用
- 调用Kimi的接口,通过用户提供文物的相关信息,AI生成相关的信息和背景故事,让用户对文物可以有更加清晰的认识。
@ai_story_blueprint.route('/api/ai_story/<int:artifact_id>', methods=['GET'])
def get_artifact(artifact_id):
#获取文物信息
# 连接数据库
cur = mysql.connection.cursor()
cur.execute("SELECT id, name, category, period, material, status, tags, description, thumbnail_path, created_at, updated_at,parameter FROM artifacts WHERE id = %s", (artifact_id,))
artifact = cur.fetchone()
cur.close()
if not artifact:
return jsonify({'success': False, 'message': '文物未找到!'}), 404
artifact_data = '名字'+artifact[1]+'描述'+artifact[7]+'参数'+artifact[11]
#调用ai信息
client = OpenAI(
api_key="sk-3nelzEbbh57pZoiBpvQfZLEvk6wrdGAMR6XDQaL8D7y7H7BX",
base_url="https://api.moonshot.cn/v1",
)
history = [
{"role": "system",
"content": "你是一名历史学者,请你根据用户所给的文物信息,给用户关于该文物的一些相关信息,并且根据文物的真实历史背景,为文物编写一段据有神秘色彩的故事。"},
]
history.append({
"role": "user",
"content": artifact_data
})
completion = client.chat.completions.create(
model="moonshot-v1-8k",
messages=history,
temperature=0.3,
)
result = completion.choices[0].message.content
history.append({
"role": "assistant",
"content": result
})
return jsonify({'success': True, 'data': result}), 200
- 将组员的图生视频接口部署到框架中,实现通过图片的url返回生成视频的url.
# 返回视频url
def look_video(accesstoken, task_id):
check_url = f'https://api.klingai.com/v1/videos/image2video/{task_id}'
headers = {
'Authorization': f'Bearer {accesstoken}',
'Content-Type': 'application/json'
}
max_retries = 15
retries = 0
while retries < max_retries:
response = requests.get(check_url, headers=headers)
# 将JSON字符串解析为Python字典
response_data = json.loads(response.text)
# 提取task_status
task_status = response_data['data']['task_status']
if task_status == 'succeed':
video_url = response_data['data']['task_result']['videos'][0]['url']
return video_url
elif task_status == 'failed':
return None
time.sleep(60)
retries += 1
return None
error = 'The image file size must not exceed 10MB, the image resolution must be at least 300*300 pixels, and the image aspect ratio should be between 1:2.5 and 2.5:1.'
image_url = artifact_url
accesstoken = get_accesstoken()
task_id = create_video(accesstoken, image_url)
if not task_id:
return jsonify({'success': False, 'message': '创建视频任务失败!'}), 500
response = look_video(accesstoken, task_id)
if not response:
return jsonify({'success': False, 'message': error}), 404
return jsonify({'success': True, 'data': response}), 200
4、部分服务器的搭建
- 将项目的一些静态文件放置于云服务器中,方便前端通过url1进行访问。
四、收获
1、技术技能提升:
- Flask框架熟练度: 通过使用Python的Flask框架,我加深了对轻量级Web框架的理解,提高了快速开发Web应用的能力。
- 模块化开发实践: 利用Blueprint对接口进行模块化管理,我学会了如何将大型应用分解为更小、更易于管理的部分,提升了代码组织和模块化设计的能力。
2、API开发与设计:
- API实现: 成功设计并实现了项目的核心后端API接口,增强了我对RESTful架构风格和API设计最佳实践的理解。
- 数据交互与业务逻辑: 在实现数据交互和业务逻辑的过程中,我提升了对数据库操作和业务流程的掌握。
3、AI技术应用:
- AI接口调用经验: 调用Kimi的接口和集成组员的视频生成接口,我获得了实际应用AI技术的经验,这对我的技术视野和技术深度都是一次宝贵的扩展。
4、项目管理与团队协作:
- 项目管理: 在项目中承担接口开发和测试的责任,我学会了如何管理项目进度和质量,这对于我未来的项目管理职业生涯是一次宝贵的实践。
- 团队合作: 与前端开发者和AI技术团队的紧密合作,我提升了跨职能团队合作的能力,这对于任何技术项目的成功都是至关重要的。
5、个人收获总结:
- 通过参与这个项目,我不仅在技术上获得了显著成长,也在项目管理和团队协作方面获得了宝贵的经验。这些收获将为我未来的职业发展打下坚实的基础,并帮助我在技术领域中保持竞争力。