• 太酷了,用Python+Excel制作一个视频下载器,手把手教学讲解


    前言

    说起Excel,那绝对是数据处理领域王者般的存在。

    而作为网红语言Python,在数据领域也是被广泛使用。

    其中Python的第三方库-xlwings,一个Python和Excel的交互工具,可以轻松地通过VBA来调用Python脚本,实现复杂的数据分析。
    今天,就给大家介绍一个Python+Excel的项目【视频下载器】。

    相关文件

    关注小编,私信小编领取哟!
    当然别忘了一件三连哟~~

    公众号:Python日志
    可以关注小编公众号,会不定时的发布一下Python小技巧,还有很多资源可以免费领取哟!!
    源码领取:加Python学习交流群:494958217可以领取哟

    开发工具

    Python版本:3.7.8
    相关模块:
    os模块;
    sys模块;
    ssl模块;
    ffmpeg模块;
    以及一些python自带的模块。

    环境搭建

    安装Python并添加到环境变量,pip安装需要的相关模块即可。

    效果展示

    以下就是我们的一个效果实现的样子
    在这里插入图片描述

    导入模块

    主要使用到下面这些Python库。

    import os
    import sys
    import ssl
    import ffmpeg
    import xlwings as xw
    from pathlib import Path
    from aip import AipSpeech
    from pydub import AudioSegment
    from wordcloud import WordCloud
    from pydub.utils import make_chunks
    from moviepy.editor import AudioFileClip
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    其中ffmpeg、pydub、moviepy是用来处理音视频的,比如裁剪、格式转换等。

    aip库则是百度官方库,用来做语音转文字的。

    # 安装
    pip install baidu-aip
    
    • 1
    • 2

    对于xlwings这里就不多说了,想了解的小伙伴,可以去看官方文档。

    地址:https://docs.xlwings.org/en/stable/

    功能实现

    下面就给大家来介绍一下吧!

    首先调用xlwings模块生成一个项目,命令如下。

    # 创建项目
    xlwings quickstart transcriber --standalone
    
    • 1
    • 2

    这时候我们就能看到有一个项目名称为transcriber的文件夹,这个就是作为我们项目使用的,并且可以修改为任何名字。
    在这里插入图片描述

    其中注意:

    1. transcriber.py,这是带Python代码的文件,内容如下。
    import xlwings as xw
    
    
    def main():
        wb = xw.Book.caller()
        sheet = wb.sheets[0]
        if sheet["A1"].value == "Hello xlwings!":
            sheet["A1"].value = "Bye xlwings!"
        else:
            sheet["A1"].value = "Hello xlwings!"
    
    
    @xw.func
    def hello(name):
        return f"Hello {name}!"
    
    
    if __name__ == "__main__":
        xw.Book("transcriber.xlsm").set_mock_caller()
        main()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    1. transcriber.xlsm,这是带vba代码的Excel文件,内容如下。
      在这里插入图片描述

    打开Excel文件,提示没有启用宏,所以设置一下。在这里插入图片描述
    文件 - 更多 - 选项 - 信任中心 - 信任中心设置 - 宏设置 - 启用所有宏。

    然后安装xlwings的Excel集成插件,安装之前需要关闭所有Excel应用,不然会报错。

    # 安装xlwings的Excel集成插件
    xlwings addin install
    
    • 1
    • 2

    xlwings和插件都安装好后,这时候打开Excel,会发现工具栏出现一个xlwings的菜单框,代表xlwings插件安装成功。

    它起到一个桥梁的作用,为VBA调用Python脚本牵线搭桥。
    在这里插入图片描述
    此外还需要把“开发工具”添加到功能区,因为我们要用到宏。

    配置运行环境,Python执行器,Conda安装路径,Conda虚拟环境路径。
    在这里插入图片描述
    最后点击“开发工具”选项卡,点击Visual Basic - 工具 - 引用 - 添加xlwings。

    到此,环境就配置成功了

    我们先用之前创建的transcriber.xlsm文件来实验一下,插入一个按钮,指定宏。
    在这里插入图片描述
    点击绿色的按钮,可以看见A1单元格会有信息出现,说明启用宏成功。

    这里我们可以把A1单元格名称修改为OUTPUTCELL。在这里插入图片描述
    再去修改transcriber.py文件中的代码。

    import xlwings as xw
    
    
    def main():
        wb = xw.Book.caller()
        sheet = wb.sheets[0]
        if sheet["OUTPUTCELL"].value == "Hello":
            sheet["OUTPUTCELL"].value = "Bye"
        else:
            sheet["OUTPUTCELL"].value = "Hello"
    
    
    @xw.func
    def hello(name):
        return f"Hello {name}!"
    
    
    if __name__ == "__main__":
        xw.Book("transcriber.xlsm").set_mock_caller()
        main()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    点击按钮,发现信息有所变,说明可以给单元格指定名称和输出。
    在这里插入图片描述
    了解了xlwings的基本使用,我们就可以对表格进行排版布局一波啦!
    在这里插入图片描述
    给音频转文本,生成字幕词云添加数据验证,其实就是一个列表选项,可选择是或否。
    在这里插入图片描述
    给音频转文本,生成字幕词云添加条件格式,选择是或否后,展示不同的颜色,默认否(淡红色)。在这里插入图片描述
    好了,最后修改一下各个单元格的名称。在这里插入图片描述
    编写主程序,代码如下。

    def main():
        wb = xw.Book.caller()
        sheet = wb.sheets[0]
    
        bilibili_url = sheet["BILIBILI_URL"].value
        transcribe = sheet["TRANSCRIBE"].value
        wordcloud = sheet["WORDCLOUD"].value
        status_cell = sheet["STATUS_CELL"]
    
        # 重置状态栏
        status_cell.value = ""
    
        # 获取程序运行路径
        output_path = Path(__file__).parent
        output_path = str(output_path)
    
        # 下载
        if bilibili_url:
            status_cell.value = "开始下载音视频文件 ..."
            audio_file = download_bilibili(bilibili_url, status_cell, output_path)
        else:
            status_cell.value = "未输入B站视频地址"
            sys.exit()
    
        # 语音转文字
        if transcribe == '是':
            transcription_text = transcribe_audio_file(status_cell, audio_file, output_path)
    
        # 生成词云
        if transcribe == '是' and wordcloud == '是':
            generate_wordcloud(transcription_text, output_path, status_cell)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31

    使用第一个sheet表,不断的更新状态栏信息,判断是否要运行下载、语音转文字、生成词云这三个函数。

    下载音视频使用到了you-get库,一键下载几乎所有网站上的音视频。在这里插入图片描述
    支持的网站还不少呢,本次就只用B站的视频来测试。

    def download_bilibili(bilibili_url, status_cell, output_path):
        """下载音视频"""
        filename = bilibili_url.split('/')[-1].split('?')[0]
        cmd = 'you-get {} -o {} -O {}'.format(bilibili_url, output_path, filename)
        os.system(cmd)
    
        # 导入视频
        my_audio_clip = AudioFileClip(output_path + "\{}.flv".format(filename))
    
        # 提取音频并保存
        audio_file = output_path + "\{}.wav".format(filename)
        my_audio_clip.write_audiofile(audio_file)
    
        status_cell.value = f"成功下载B站视频, 并且提取音频: {audio_file}"
        return audio_file
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    使用moviepy库提取视频中的音频,用于语音识别。\

    当音频转文本选项的内容是【是】的时候,下面代码就派上用场了。

    使用百度的短语音识别技术,需要申请使用,不想用的小伙伴直接两个可选项选择【否】,当做一个下载器即可。在这里插入图片描述
    可惜识别最长时间只能是60秒,所以需要将之前获取的音频进行切割。

    此外还需要对音频的采样率进行匹配。

    def transcribe_audio_file(status_cell, audio_file, output_path):
        """语音转文字"""
        status_cell.value = "开始处理音频文件..."
        old_name = audio_file
        new_name = audio_file.split('.')[0] + '_16000.wav'
        split_name = audio_file.split('.')[0]
        # 对音频进行降频处理
        ffmpeg.input(old_name).output(new_name, ar=16000).run(cmd=FFMPEG_PATH)
    
        # 切割音频
        audio = AudioSegment.from_file(new_name, "wav")
        # 切割的毫秒数
        size = 30000
        # 将文件切割为30s一块
        chunks = make_chunks(audio, size)
        for i, chunk in enumerate(chunks):
            # 枚举,i是索引,chunk是切割好的文件
            chunk_name = split_name + "_{0}.wav".format(i)
            # 保存文件
            chunk.export(chunk_name, format="wav")
    
        status_cell.value = "使用百度语音接口识别音频..."
        # 使用百度语音接口
        """ 你的 APPID AK SK """
        APP_ID = ''
        API_KEY = ''
        SECRET_KEY = ''
    
        client = AipSpeech(APP_ID, API_KEY, SECRET_KEY)
    
        # 读取文件
        def get_file_content(file_path):
            with open(file_path, 'rb') as fp:
                return fp.read()
    
        transcription_txt = output_path + "\transcription.txt"
    
        # 识别本地文件
        for i, chunk in enumerate(chunks):
            result = client.asr(get_file_content(split_name + "_{0}.wav".format(i)), 'wav', 16000, {
                'dev_pid': 1537  # 默认1537(普通话 输入法模型),dev_pid参数见本节开头的表格
            })
    
            print(result['result'])
            with open(transcription_txt, "a") as file:
                file.write(result['result'][0])
            file.close()
    
        status_cell.value = f"音频转文本成功, 文件保存到 {transcription_txt}"
        return transcription_txt
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50

    可识别普通话、英语、粤语、四川话识别。通过在请求时配置不同的dev_pid参数,选择对应模型。

    最终将音频转为文本,保存在一个文本文件中。

    生成词云,这里需要注意添加中文字体路径,要不然词云图显示不了中文。

    def generate_wordcloud(textfile, output_path, status_cell):
        """生成词云"""
        textfile = Path(textfile)
        content = textfile.read_text()
        wordcloud = WordCloud(font_path=output_path + '\simhei.ttf').generate(content)
        wordcloud.to_file(Path(output_path) / f"{textfile.stem}.png")
        status_cell.value = "生成词云图"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    项目整体就如上面描述的一样。

    此时我们只需打开Excel文件,选择是或否选项,修改B站视频地址,点击开始下载,即可下载视频,以及生成词云图。

    无需再去运行Python文件 。
    在这里插入图片描述
    成功下载到视频,并且对音视频进行处理,得到文本信息。
    在这里插入图片描述
    查看一下词云图吧。在这里插入图片描述
    发现百度的语音识别有点差啊,不知道是哪里出现了问题…

    好了,本期的分享就到此结束了,有兴趣的小伙伴可以自行去实践学习。

    比如制作一个弹幕分析词云图,或者下载其他网站的视频等等。

    使用到的代码及文件都已上传,感兴趣的读者可以自行下载学习。

    问题解答可以看相关文件

  • 相关阅读:
    LeetCode第 91 场双周赛题解
    机车整备场数字孪生 | 图扑智慧铁路
    前端笔记_OAuth规则机制下实现个人站点接入qq三方登录
    【wxWidgets实现透明wxPanel_核心实现_原创思想】
    【GPT‑4o】完整教程:LORA微调LLaMA3并结合RAG和Agent技术实现Text2SQL任务
    LotusScript中的命名文档
    【C语言 | 预处理】C语言预处理详解(一) —— #define、#under、#if、#else、#elif、#endif、#include、#error
    九种分布式ID解决方案
    性能优化必备——火焰图
    SVG: 可伸缩的矢量图形
  • 原文地址:https://blog.csdn.net/Gtieguo/article/details/125817097