综合设计——多源异构数据采集与融合应用综合实践

发布时间 2023-12-14 22:57:40作者: 陈宏森

综合设计——多源异构数据采集与融合应用综合实践

[码云地址](多源异构数据采集与融合应用综合实践: Call of Silence数据采集与融合综合实验 (gitee.com))

这个项目属于哪个课程 2023数据采集与融合技术
组名、项目简介 组名:Call of Silence
项目需求:设计出一个交互友好的多源异构数据的采集与融合的小应用
项目目标:通过在web端输入文本、图片、视频等多源数据进行内容提取并对其进行概括
技术路线:前端3件套(html、css、js)、flask、
团队成员学号 052103117、102102142、102102148、102102149、102102150、102102154、102102155、172109005
这个项目目标 对获取的多模态信息进行分析概括
其他参考文献 [1]梁永侦.基于深度学习的图像风格迁移方法研究[J].计算机时代,2023,(08):107-112.DOI:10.16644/j.cnki.cn33-1094/tp.2023.08.024
[2]熊文楷.基于深度学习的中国画风格迁移[J].科技与创新,2023,(13):176-178.DOI:10.15913/j.cnki.kjycx.2023.13.054
[3]郑卓.基于深度学习的风格迁移技术研究[D].浙江工商大学,2023.DOI:10.27462/d.cnki.ghzhc.2023.001362

项目整体介绍

1、项目名称:多模态内容概括

2、项目背景:在当今社会,随着数字化时代的来临,信息呈现爆炸式增长,而这些信息涵盖了多种形态,本项目主要功能就是对获取的多模态信息进行分析概括,帮助用户从信息中快速获取主要内容。

3、项目意义:面对互联网时代的信息过载,用户更需要一种智能化的工具来过滤、提炼信息,以便更快速地获取关键信息。多模态信息分析程序的功能满足了这一需求,帮助用户从海量信息中快速获取主要内容。

4、技术路线

  • 数据采集

    • 采用selenium框架对bilibili中视频、封面、音频等数据进行爬取
  • 前端开发

    • 使用HTML、CSS和JavaScript进行界面设计,实现用户与系统的交互。
    • 用于上传文本、图片和视频等文件。
  • 后端开发

    • 利用flask框架进行后端搭建。
    • 用于接收前端发送的请求,对收到的数据进行保存和处理,最后返回文本结果。
  • 数据处理与分析

    • 文本分析:采用星火的接口对输入的文本内容进行分析概括。
    • 图片分析:
      • 采用星火的接口对输入的图片进行概括,将概括后的文本进行分析概括返回图片概括后的结果。
    • 视频分析:对于视频分析,没有找到合适的模型和接口进行概括,因此我们采用提取视频中的音频,对音频内容进行概括。
      • 采用百度的接口对输入的视频提取主要内容并返回给用户。
  • 风格迁移

    • 输入俩张图片,一张作为被学习的风格图片,一张作为学习的融合图片,通过VGG19神经网络进行训练,得到的模型,可以将任意俩张图片进行风格迁移s

5、项目部分功能展示

①项目页面展示

image-20231214190722371

image-20231214190750316

②文本概括功能展示

image-20231214190600544

③图片概括功能展示

image-20231214190632541

④视频概括功能展示

image-20231214190704504

个人分工

①数据采集

通过selenium框架爬取bilibili视频,由于bilibili中视频跟音频是分开的,因此我对视频跟音频分开爬取

import time
import urllib.request
import re
from selenium import webdriver
from scrapy.selector import Selector

import requests
import os
from lxml import etree
import re


def videoDownload1(url_):
    try:
        headers_ = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36',
            'Cookie': "buvid3=7014DDC0-BF1E-B121-F5A5-F10753C840B423630infoc; i-wanna-go-back=-1; _uuid=49BF2138-1E10F-D5F5-10898-D8311651B53927883infoc; FEED_LIVE_VERSION=V8; DedeUserID=171300042; DedeUserID__ckMd5=c65bec3211413192; CURRENT_FNVAL=4048; rpdid=|(J|)J~m~llk0J'uYm|)~klRl; header_theme_version=CLOSE; hit-new-style-dyn=1; hit-dyn-v2=1; is-2022-channel=1; fingerprint=fe5c7462625770aa2abce449a7c01fd2; buvid_fp_plain=undefined; b_nut=1691207170; b_ut=5; buvid_fp=fe5c7462625770aa2abce449a7c01fd2; LIVE_BUVID=AUTO4016915564967297; buvid4=1AE73807-AEA0-7078-DA57-7F9FE5C3D6F896987-023080912-A0g5nInZwV3VmJJT68FJxw%3D%3D; home_feed_column=5; SESSDATA=fc1266d3%2C1708653865%2C29c08%2A81-i-T9HQrucvpCVcPwSwXl5LmjTyduIzF9veu0KS9i2IwXK_xkcqlt1XQyxJ3sG-9HMSwLwAAKgA; bili_jct=068bc0a79f3fa7aa1a030e478dbf6d4b; sid=5yvjlnfi; browser_resolution=1920-971; bili_ticket=eyJhbGciOiJFUzM4NCIsImtpZCI6ImVjMDIiLCJ0eXAiOiJKV1QifQ.eyJleHAiOjE2OTMzNjY1MTcsImlhdCI6MTY5MzEwNzMxNywicGx0IjotMX0.I1Yfp8S9UIkU4S0G5vtBJfslPtgY7QLCj1dx9WQpyRmxKpZoA1qB5UYXNW4KBSZFGljMm7F1lbGXSGco7F79JZJ2sZNBvH9QiSVlmipzAJKaucIoFh6s3m1jpqjLp10r; bili_ticket_expires=1693366517; bp_video_offset_171300042=834376858445283367; b_lsid=1021245DB_18A3567E5C2; CURRENT_QUALITY=80; PVID=2"
        }

        response_ = requests.get(url_, headers=headers_)

        str_data = response_.text

        html_obj = etree.HTML(str_data)  # 转换格式类型

        res_ = html_obj.xpath('//title/text()')[0]

        title_ = re.findall(r'(.*?)_哔哩哔哩', res_)[0]
        title_ = title_.replace('/', '')
        title_ = title_.replace(' ', '')
        title_ = title_.replace('&', '')
        title_ = title_.replace(':', '')

        url_list_str = html_obj.xpath('//script[contains(text(),"window.__playinfo__")]/text()')[0]

        # 纯视频的url
        video_url = re.findall(r'"video":\[{"id":\d+,"baseUrl":"(.*?)"', url_list_str)[0]

        # 纯音频的url
        audio_url = re.findall(r'"audio":\[{"id":\d+,"baseUrl":"(.*?)"', url_list_str)[0]

        # 设置跳转字段的headers
        headers_ = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.111 Safari/537.36',
            'Referer': url_
        }

        # 获取纯视频的数据
        response_video = requests.get(video_url, headers=headers_, stream=True)
        bytes_video = response_video.content
        # 获取纯音频的数据
        response_audio = requests.get(audio_url, headers=headers_, stream=True)
        bytes_audio = response_audio.content

        # 获取文件大小, 单位为KB
        video_size = int(int(response_video.headers['content-length']) / 1024)
        audio_size = int(int(response_audio.headers['content-length']) / 1024)

        # 保存纯视频的文件
        title_1 = title_ + '!'  # 名称进行修改,避免重名
        title_1 = title_1.replace(':', '_')
        with open(f'D:/python/exercise/数据采集大作业/video/{title_1}.mp4', 'wb') as f:
            f.write(bytes_video)

        with open(f'D:/python/exercise/数据采集大作业/audio/{title_1}.mp3', 'wb') as f:
            f.write(bytes_audio)

        ffmpeg_path = r".\ffmpeg.exe"


        command = f'{ffmpeg_path} -i audio/{title_1}.mp3 -i video/{title_1}.mp4 -c copy ./video/{title_}/{title_}.mp4 -loglevel quiet'

        os.system(command)

        # 显示合成文件的大小

        print(f'{title_}  下载完成')
    except Exception as e:
        print(f"下载失败: {e}")
        return  # 跳过当前视频的下载


browser = webdriver.Chrome()
url = 'https://www.bilibili.com/'
browser.get(url)
time.sleep(5)

js_height = 'return document.body.scrollHeight'
height = browser.execute_script(js_height)

for i in range(15):
    browser.execute_script('window.scrollTo(0, document.body.scrollHeight)')
    time.sleep(5)

    new_height = browser.execute_script(js_height)
    height = new_height

content = browser.page_source
browser.quit()

selector = Selector(text=content)
rows = selector.xpath("//div[@class='bili-video-card is-rcmd']")

for row in rows:
    href = row.xpath('.//a/@href').extract_first()
    if href and href.startswith("https"):
        videoDownload1(href)

结果展示

爬取视频结果展示
image
爬取音频结果展示
image

②算法调试

在这次综合实践中,我调用了百度的接口将视频中的音频提取出来,并对音频进行分析,使我们的项目能够对视频内容进行分析提取最终返回过程

代码展示:
import os
def mp4_to_wav(mp4_path, wav_path, sampling_rate):
    """
    mp4 转 wav
    :param mp4_path: .mp4文件路径
    :param wav_path: .wav文件路径
    :param sampling_rate: 采样率
    :return: .wav文件
    """
    # 如果存在wav_path文件,先删除。
    if os.path.exists(wav_path):  # 如果文件存在
        # 删除文件,可使用以下两种方法。
        os.remove(wav_path)
        # 终端命令
    command = "ffmpeg -i {} -ac 1 -ar {} {} && y".format(mp4_path, sampling_rate, wav_path)
    print('命令是:',command)
    # 执行终端命令
    os.system(command)

if __name__ == '__main__':
    mp4_path = "D:/python/exercise/数据采集大作业/test/test2.mp4"
    wav_path = 'D:/python/exercise/数据采集大作业/test/atest2.wav'
    sampling_rate = 16000
    mp4_to_wav(mp4_path, wav_path, sampling_rate)
from aip import AipSpeech

# 从百度AI开放平台创建应用处获取
APP_ID = '44648474'
API_KEY = 'oiLoqI11gAl9sgN7nMIsBgCl'
SECRET_KEY = 'wxdg8rgnelbbBG5herHN6tyzxfy7T35u'

client = AipSpeech(APP_ID, API_KEY, SECRET_KEY)

# 读取文件
def get_file_content(filePath):
    with open(filePath, 'rb') as fp:
        return fp.read()

# 识别本地文件
def get_text():
    result = client.asr(get_file_content('D:/python/exercise/数据采集大作业/test/atest2.wav'), 'wav', 16000, {
    'dev_pid': 1536})
    if 'result' in result and len(result['result']) > 0:
        text = result['result'][0]
        return text
    else:
        return "未能识别文本"

print(get_text())

③项目部署

将本次项目中的前、后端部署到华为云服务器上。因为是第一次部署,在过程中一直出现报错,但是最终还是成功部署到云服务器上,通过本次部署对华为云有着进一步的理解。