太酷了,用Python+Excel制作一个视频下载器!

简说Python

共 5991字,需浏览 12分钟

 ·

2022-06-07 18:00


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


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


其中Python的第三方库-xlwings,一个Python和Excel的交互工具,可以轻松地通过VBA来调用Python脚本,实现复杂的数据分析。


今天,小F就给大家介绍一个Python+Excel的项目【视频下载器】。



主要使用到下面这些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


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


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


# 安装
pip install baidu-aip


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


地址:

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


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


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


# 创建项目
xlwings quickstart transcriber --standalone


这时候我们就能看到有一个项目名称为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()


2. transcriber.xlsm,这是带vba代码的Excel文件,内容如下。



打开Excel文件,提示没有启用宏,所以设置一下。



文件 - 更多 - 选项 - 信任中心 - 信任中心设置 - 宏设置 - 启用所有宏。


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


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


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()


点击按钮,发现信息有所变,说明可以给单元格指定名称和输出。



了解了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)


使用第一个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


使用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


可识别普通话、英语、粤语、四川话识别。通过在请求时配置不同的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 = "生成词云图"


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


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


无需再去运行Python文件


成功下载到视频,并且对音视频进行处理,得到文本信息。



查看一下词云图吧。



发现百度的语音识别有点差啊,不知道是哪里出现了问题...


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


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


使用到的代码及文件都已上传,扫码添加老表微信,回复「视频下载」即可获取。


扫码即可加我微信

学习交流

老表朋友圈经常有赠书/红包福利活动


万水千山总是情,点个 👍 行不行

浏览 24
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报